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