本站小編為你精心準(zhǔn)備了Verilog HDL模型優(yōu)化參考范文,愿這些范文能點燃您思維的火花,激發(fā)您的寫作靈感。歡迎深入閱讀并收藏。
摘要本文基于模型優(yōu)化的必要性,對使用Veriloghdl建模時可以運用的優(yōu)化手段作了詳細(xì)的闡述,對設(shè)計者具有一定的指導(dǎo)意義。
1引言
每個設(shè)計者在進行Verilog建模時都會形成自己的設(shè)計風(fēng)格,同一個電路設(shè)計,用Verilog描述可以寫出許多邏輯上等價的模型,而大多數(shù)設(shè)計者考慮的主要是代碼書寫上的方便和功能上是否正確,對設(shè)計的模型是否最優(yōu)化結(jié)構(gòu)卻考慮甚少,這樣不僅加重了邏輯綜合的負(fù)擔(dān),影響綜合效率,而且很可能會導(dǎo)致設(shè)計出的芯片未達到最優(yōu)的面積和速度。因此,在Verilog建模時,很有必要進行模型優(yōu)化。
2模型優(yōu)化概述
影響一個芯片性能的指標(biāo)主要有兩個:面積和速度。模型優(yōu)化就是通過一定的手段對模型的結(jié)構(gòu)進行調(diào)整、組合和精簡,從而使設(shè)計出的芯片達到更小的面積和更快的速度。
綜合所生成的邏輯易受模型描述方式的影響。把語句從一個位置移到另一個位置,或者拆分表達式都會對所生成的邏輯產(chǎn)生重大影響,這可能會造成綜合出的邏輯門數(shù)有所增減,也可能改變其定時特性。因此,采取一定的手段可以實現(xiàn)對邏輯的優(yōu)化。但是由于優(yōu)化終點包含的兩個方面面積和速度是互相矛盾的,優(yōu)化一個方面必定影響另一個方面,而無法實現(xiàn)面積和速度都達到最優(yōu),這就需要設(shè)計者對兩者進行權(quán)衡,看設(shè)計偏重于哪個方面,而采取不同的優(yōu)化起點。
下面分別從面積和速度兩個方面對模型優(yōu)化的手段進行介紹。
3面積的優(yōu)化3.1提取公共子表達式
如果條件語句的互斥分支中有公共子表達式,可以提取該公共子表達式。如下面的模型可以提取公共子表達式:
if(enable)
P=A&(B+C);
else
Q=(B+C)|D;
此模型中條件語句的互斥分支中都計算了表達式B+C,因此,應(yīng)將該表達式提取出來放在條件語句之前進行賦值,新模型如下所示:
Tmp=B+C;//引入一個臨時變量
if(enable)
P=A&Tmp;
else
Q=Tmp|D;
這樣,綜合工具就會綜合出一個加法器,而原來的模型則會綜合出兩個加法器。引申到一般情況,若在邏輯中找到有公共子表達式,就可以將該公共子表達式賦值給一個臨時變量,然后用該臨時變量來表示該公共子表達式,這樣就可以減少綜合出的ALU單元的數(shù)量,以實現(xiàn)面積的優(yōu)化。
3.2代碼移位
如果在循環(huán)語句內(nèi)某個表達式的值在每次循環(huán)中都不變化,可以將該表達式移至循環(huán)之外。如下面的模型可以進行代碼移位:
P=…
…
for(i=1;i<=5;i++)
begin
…
Q=P+5;//假設(shè)循環(huán)中未對P賦新值
…
end
賦值語句“Q=P+5;”右端的表達式不隨循環(huán)變量而變,因此,應(yīng)將該表達式移至循環(huán)之外,新模型如下所示:
P=…
…
Tmp=P+5;//引入一個臨時變量
for(i=1;i<=5;i++)
begin
…
Q=Tmp;
…
end
這樣,綜合工具對“P+5”只會綜合出一個加法器,而原來的模型會產(chǎn)生5個加法器,每循環(huán)一次就產(chǎn)生一個,造成了代碼冗余。優(yōu)化后的新模型不僅減少了綜合出的ALU單元的數(shù)量,而且提高了仿真效率。
3.3資源共享
資源共享是指在互斥條件下共享算術(shù)邏輯單元(ALU)的過程。如下面的模型:
if(num>5)
P=A+B;
else
P=A-C;
如果不采用資源分配,算符“+”和“-”就會被綜合成兩個單獨的ALU。而如果采用了資源分配,僅需一個ALU就可以實現(xiàn)“+”和“-”這兩種運算。這是因為這兩種算符總是互斥地使用。此外還生成了一個多路選擇器,用來從B和C中選擇合適的量接到ALU的第二個輸入端上。實際上,資源分配就是共享算符的過程。共享算符有以下幾種可能的情況:
(1)算符相同,運算量相同。如:A+B和A+B,這種情況同“提取公共子表達式”,顯然必須共享。
(2)算符相同,有一個運算量不同。如:A+B和A+C,這時需引入一個多路選擇器,要進行面積與速度之間的權(quán)衡。
(3)算符相同,運算量都不同。如:A+B和C+D,這時需引入兩個多路選擇器,要進行面積與速度之間的權(quán)衡。
(4)算符不同,運算量相同。如:A+B和A-B,可以將“+”和“—”合成一個ALU單元,要共享。
(5)算符不同,有一個運算量不同。如:A+B和A-C,這時需引入一個多路選擇器,要進行面積與速度之間的權(quán)衡。
(6)算符和運算量都不同。如:A+B和C-D,這時需引入兩個多路選擇器,要進行面積與速度之間的權(quán)衡。
在共享ALU的時候,要在ALU的某個輸入端引入多路選擇器,這樣會增加路徑的延遲。因此,設(shè)計者應(yīng)根據(jù)實際情況權(quán)衡是優(yōu)化面積重要還是優(yōu)化速度重要,如果是在“定時至上”的設(shè)計中,最好不要采用資源共享。
此外,對于復(fù)雜的運算單元,可以采用函數(shù)和任務(wù)來定義這些共享的數(shù)據(jù)處理模塊,以減少器件資源的消耗,降低成本。
3.4消除觸發(fā)器
有些設(shè)計者為了圖編寫代碼的方便,喜歡將同一條件控制下的賦值語句寫在一個時序控制語句中,如下面的模型:
always@(posedgeCLK)
begin
case(State)
0:
begin
preState<=1;
Dout<=16’h56;
end
1:
begin
preState<=0;
Dout<=16’h29;
end
endcase
end
設(shè)計者的本意僅是要把preState的值保存在上升沿觸發(fā)的觸發(fā)器中,而Dout的值只是受State影響的組合邏輯,原本只需要1個觸發(fā)器即可,而上述模型綜合后的網(wǎng)表會生成17個觸發(fā)器,浪費了資源,優(yōu)化后的模型如下所示:
always@(posedgeCLK)//推導(dǎo)出觸發(fā)器
begin
case(State)
0:preState<=1;
1:preState<=0;
endcase
end
always@(State)//組合邏輯
begin
case(State)
0:Dout<=16’h56;
1:Dout<=16’h29;
endcase
end
3.5消除鎖存器
推導(dǎo)鎖存器的規(guī)則是:
(1)變量在條件語句(if或case語句)中被賦值。
(2)變量未在條件語句的所有分支中都被賦值。
(3)在always語句的多次調(diào)用之間需要保存變量值。
同時滿足以上3個條件,就會將變量推導(dǎo)成鎖存器。有的設(shè)計者可能會圖省事沒有在所有的條件分支中對變量進行賦值,這樣就導(dǎo)致原本不需要產(chǎn)生鎖存器的變量產(chǎn)生了鎖存器,而浪費了資源。
消除鎖存器的最好方法是在設(shè)計時明確哪些變量需要鎖存器,哪些則不需要。對不需要推導(dǎo)出鎖存器的變量,在其所有條件分支中都對其賦值,或者是在條件語句之前對其進行初始化賦值。
4速度的優(yōu)化4.1使用括號
在表達式中使用括號,可以控制所綜合出的邏輯電路的結(jié)構(gòu),縮短電路的關(guān)鍵路徑,從而實現(xiàn)速度的優(yōu)化。
例如對語句P=A+B-C+D,綜合工具在綜合右端表達式時遵循從左至右進行演算,就會構(gòu)造出如圖1所示的電路。
使用括號后的語句為:P=(A+B)-(C-D),綜合后的電路如圖2所示。
圖1未使用括號綜合出的電路圖2使用括號綜合出的電路
很顯然,未使用括號時關(guān)鍵路徑的深度為3,而使用括號后的關(guān)鍵路徑深度為2,優(yōu)化了速度。
4.2提取關(guān)鍵路徑
在電路設(shè)計中,有些信號的路徑比較長,或者信號本身就來得比較晚,從而造成電路的建立時間不夠。這種引起電路建立時間不夠的信號路徑稱為關(guān)鍵路徑。這種關(guān)鍵信號路徑大多要提取出來特別對待,以盡量減少它的延時。
4.2.1提取重復(fù)變量
如語句P=(a&b&c)|(b&d&e)中的信號b的路徑就是關(guān)鍵路徑,可以提取出來單獨處理,提取關(guān)鍵路徑前后的電路模型如圖3所示。
圖3電路模型比較
由圖中可以看出,信號b的路徑由2級變成了1級,增加了其建立時間,縮短了延遲,而且還減少了一個與門,既提高了速度又減少了面積。
4.2.2提取先行關(guān)鍵路徑
如下面的模型所示:
always@(aorborcordoreorcurrent_out)
begin
next_out=current_out;
if(!a)begin
if(b&!(d&!e))next_out=!c;
elsenext_out=c;
end
elseif(d&!e)next_out=c;
end
其中,輸入信號e在always語句塊中是個時間非常緊的關(guān)鍵信號,需要進行特殊處理。處理后的模型如下所示:
always@(aorborcordoreorcurrent_out)
begin
next_out=current_out;
if(e)begin
if(!a)begin
if(b)next_out=!c;
elsenext_out=c;
end
end
elsebegin
if(!a)begin
if(b&!d)next_out=!c;
elsenext_out=c;
end
elseif(d)next_out=c;
end
end
上述模型描述了關(guān)鍵信號e的分步提取方法,改寫后的描述都與原always塊邏輯等效。
5其它優(yōu)化手段5.1引用工藝庫中預(yù)定義的宏結(jié)構(gòu)
設(shè)計者可以根據(jù)需要使用模塊實例化語句來實現(xiàn)預(yù)定義功能塊,就好像對待元件那樣,在模型中對其進行實例化,然后再綜合此實例模型。例如,要建立一個加法器,根據(jù)面積約束,可以調(diào)用一個面積高效的行波加法器,而根據(jù)延時約束,可以調(diào)用一個快速但面積較大的先行結(jié)構(gòu)加法器。
5.2使用小型設(shè)計
實驗研究表明邏輯電路規(guī)模在2000門至5000門時邏輯優(yōu)化器的優(yōu)化效果最佳,因此,設(shè)計時應(yīng)盡量組織成多個模塊或多個always語句段。
綜合過程的運行時間主要用于邏輯優(yōu)化,它與設(shè)計規(guī)模呈指數(shù)關(guān)系,因此將各個子功能塊的規(guī)模保持在可處理的設(shè)計范圍內(nèi)很關(guān)鍵。
5.3傳播常量
使用常量傳播技術(shù)可以增加電路模型修改的靈活性和可移植性。如果有一個確定意義的常量并且在模型中的多處地方都引用到,則可以將該常量值定義為一個常量符號,然后直接引用該常量符號即可,如下所示:
parameterCOUNT=16;
…
P=COUNT*2;
for(i=0;i<COUNT-1;i++)
…
其中,COUNT表示的是循環(huán)次數(shù),根據(jù)需要可以在語句“parameterCOUNT=16;”中修改其值。由于它是一個常量,在綜合時不會為表達式“COUNT*2”和“COUNT-1”生成任何硬件,而是在編譯時直接計算出表達式的值并將其賦給變量。
6結(jié)束語
一般情況下,綜合工具會自動對Verilog模型進行優(yōu)化,但如果設(shè)計者在電路設(shè)計時直接就編寫出結(jié)構(gòu)優(yōu)化的電路模型,就會大大減少綜合工具的運行時間,甚至有時候綜合工具無法優(yōu)化的結(jié)構(gòu)經(jīng)過手工調(diào)整后實現(xiàn)了優(yōu)化的目的。因此,養(yǎng)成良好的設(shè)計風(fēng)格是很重要的,在設(shè)計時不僅要保證設(shè)計的正確性,還要注重設(shè)計的高效性,避免不必要的反復(fù)修正,這樣才能提高設(shè)計效率,縮短開發(fā)周期。
參考文獻
[1]王金明.VerilogHDL程序設(shè)計教程.北京:人民郵電出版社,2004.1
[2]J.Bhasker.VerilogHDL綜合實用教程.北京:清華大學(xué)出版社,2004.1