美章網 資料文庫 Verilog HDL模型優化范文

Verilog HDL模型優化范文

本站小編為你精心準備了Verilog HDL模型優化參考范文,愿這些范文能點燃您思維的火花,激發您的寫作靈感。歡迎深入閱讀并收藏。

Verilog HDL模型優化

摘要本文基于模型優化的必要性,對使用Veriloghdl建模時可以運用的優化手段作了詳細的闡述,對設計者具有一定的指導意義。

關鍵詞模型優化;綜合;表達式

1引言

每個設計者在進行Verilog建模時都會形成自己的設計風格,同一個電路設計,用Verilog描述可以寫出許多邏輯上等價的模型,而大多數設計者考慮的主要是代碼書寫上的方便和功能上是否正確,對設計的模型是否最優化結構卻考慮甚少,這樣不僅加重了邏輯綜合的負擔,影響綜合效率,而且很可能會導致設計出的芯片未達到最優的面積和速度。因此,在Verilog建模時,很有必要進行模型優化。

2模型優化概述

影響一個芯片性能的指標主要有兩個:面積和速度。模型優化就是通過一定的手段對模型的結構進行調整、組合和精簡,從而使設計出的芯片達到更小的面積和更快的速度。

綜合所生成的邏輯易受模型描述方式的影響。把語句從一個位置移到另一個位置,或者拆分表達式都會對所生成的邏輯產生重大影響,這可能會造成綜合出的邏輯門數有所增減,也可能改變其定時特性。因此,采取一定的手段可以實現對邏輯的優化。但是由于優化終點包含的兩個方面面積和速度是互相矛盾的,優化一個方面必定影響另一個方面,而無法實現面積和速度都達到最優,這就需要設計者對兩者進行權衡,看設計偏重于哪個方面,而采取不同的優化起點。

下面分別從面積和速度兩個方面對模型優化的手段進行介紹。

3面積的優化3.1提取公共子表達式

如果條件語句的互斥分支中有公共子表達式,可以提取該公共子表達式。如下面的模型可以提取公共子表達式:

if(enable)

P=A&(B+C);

else

Q=(B+C)|D;

此模型中條件語句的互斥分支中都計算了表達式B+C,因此,應將該表達式提取出來放在條件語句之前進行賦值,新模型如下所示:

Tmp=B+C;//引入一個臨時變量

if(enable)

P=A&Tmp;

else

Q=Tmp|D;

這樣,綜合工具就會綜合出一個加法器,而原來的模型則會綜合出兩個加法器。引申到一般情況,若在邏輯中找到有公共子表達式,就可以將該公共子表達式賦值給一個臨時變量,然后用該臨時變量來表示該公共子表達式,這樣就可以減少綜合出的ALU單元的數量,以實現面積的優化。

3.2代碼移位

如果在循環語句內某個表達式的值在每次循環中都不變化,可以將該表達式移至循環之外。如下面的模型可以進行代碼移位:

P=…

for(i=1;i<=5;i++)

begin

Q=P+5;//假設循環中未對P賦新值

end

賦值語句“Q=P+5;”右端的表達式不隨循環變量而變,因此,應將該表達式移至循環之外,新模型如下所示:

P=…

Tmp=P+5;//引入一個臨時變量

for(i=1;i<=5;i++)

begin

Q=Tmp;

end

這樣,綜合工具對“P+5”只會綜合出一個加法器,而原來的模型會產生5個加法器,每循環一次就產生一個,造成了代碼冗余。優化后的新模型不僅減少了綜合出的ALU單元的數量,而且提高了仿真效率。

3.3資源共享

資源共享是指在互斥條件下共享算術邏輯單元(ALU)的過程。如下面的模型:

if(num>5)

P=A+B;

else

P=A-C;

如果不采用資源分配,算符“+”和“-”就會被綜合成兩個單獨的ALU。而如果采用了資源分配,僅需一個ALU就可以實現“+”和“-”這兩種運算。這是因為這兩種算符總是互斥地使用。此外還生成了一個多路選擇器,用來從B和C中選擇合適的量接到ALU的第二個輸入端上。實際上,資源分配就是共享算符的過程。共享算符有以下幾種可能的情況:

(1)算符相同,運算量相同。如:A+B和A+B,這種情況同“提取公共子表達式”,顯然必須共享。

(2)算符相同,有一個運算量不同。如:A+B和A+C,這時需引入一個多路選擇器,要進行面積與速度之間的權衡。

(3)算符相同,運算量都不同。如:A+B和C+D,這時需引入兩個多路選擇器,要進行面積與速度之間的權衡。

(4)算符不同,運算量相同。如:A+B和A-B,可以將“+”和“—”合成一個ALU單元,要共享。

(5)算符不同,有一個運算量不同。如:A+B和A-C,這時需引入一個多路選擇器,要進行面積與速度之間的權衡。

(6)算符和運算量都不同。如:A+B和C-D,這時需引入兩個多路選擇器,要進行面積與速度之間的權衡。

在共享ALU的時候,要在ALU的某個輸入端引入多路選擇器,這樣會增加路徑的延遲。因此,設計者應根據實際情況權衡是優化面積重要還是優化速度重要,如果是在“定時至上”的設計中,最好不要采用資源共享。

此外,對于復雜的運算單元,可以采用函數和任務來定義這些共享的數據處理模塊,以減少器件資源的消耗,降低成本。

3.4消除觸發器

有些設計者為了圖編寫代碼的方便,喜歡將同一條件控制下的賦值語句寫在一個時序控制語句中,如下面的模型:

always@(posedgeCLK)

begin

case(State)

0:

begin

preState<=1;

Dout<=16’h56;

end

1:

begin

preState<=0;

Dout<=16’h29;

end

endcase

end

設計者的本意僅是要把preState的值保存在上升沿觸發的觸發器中,而Dout的值只是受State影響的組合邏輯,原本只需要1個觸發器即可,而上述模型綜合后的網表會生成17個觸發器,浪費了資源,優化后的模型如下所示:

always@(posedgeCLK)//推導出觸發器

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消除鎖存器

推導鎖存器的規則是:

(1)變量在條件語句(if或case語句)中被賦值。

(2)變量未在條件語句的所有分支中都被賦值。

(3)在always語句的多次調用之間需要保存變量值。

同時滿足以上3個條件,就會將變量推導成鎖存器。有的設計者可能會圖省事沒有在所有的條件分支中對變量進行賦值,這樣就導致原本不需要產生鎖存器的變量產生了鎖存器,而浪費了資源。

消除鎖存器的最好方法是在設計時明確哪些變量需要鎖存器,哪些則不需要。對不需要推導出鎖存器的變量,在其所有條件分支中都對其賦值,或者是在條件語句之前對其進行初始化賦值。

4速度的優化4.1使用括號

在表達式中使用括號,可以控制所綜合出的邏輯電路的結構,縮短電路的關鍵路徑,從而實現速度的優化。

例如對語句P=A+B-C+D,綜合工具在綜合右端表達式時遵循從左至右進行演算,就會構造出如圖1所示的電路。

使用括號后的語句為:P=(A+B)-(C-D),綜合后的電路如圖2所示。

圖1未使用括號綜合出的電路圖2使用括號綜合出的電路

很顯然,未使用括號時關鍵路徑的深度為3,而使用括號后的關鍵路徑深度為2,優化了速度。

4.2提取關鍵路徑

在電路設計中,有些信號的路徑比較長,或者信號本身就來得比較晚,從而造成電路的建立時間不夠。這種引起電路建立時間不夠的信號路徑稱為關鍵路徑。這種關鍵信號路徑大多要提取出來特別對待,以盡量減少它的延時。

4.2.1提取重復變量

如語句P=(a&b&c)|(b&d&e)中的信號b的路徑就是關鍵路徑,可以提取出來單獨處理,提取關鍵路徑前后的電路模型如圖3所示。

圖3電路模型比較

由圖中可以看出,信號b的路徑由2級變成了1級,增加了其建立時間,縮短了延遲,而且還減少了一個與門,既提高了速度又減少了面積。

4.2.2提取先行關鍵路徑

如下面的模型所示:

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語句塊中是個時間非常緊的關鍵信號,需要進行特殊處理。處理后的模型如下所示:

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

上述模型描述了關鍵信號e的分步提取方法,改寫后的描述都與原always塊邏輯等效。

5其它優化手段5.1引用工藝庫中預定義的宏結構

設計者可以根據需要使用模塊實例化語句來實現預定義功能塊,就好像對待元件那樣,在模型中對其進行實例化,然后再綜合此實例模型。例如,要建立一個加法器,根據面積約束,可以調用一個面積高效的行波加法器,而根據延時約束,可以調用一個快速但面積較大的先行結構加法器。

5.2使用小型設計

實驗研究表明邏輯電路規模在2000門至5000門時邏輯優化器的優化效果最佳,因此,設計時應盡量組織成多個模塊或多個always語句段。

綜合過程的運行時間主要用于邏輯優化,它與設計規模呈指數關系,因此將各個子功能塊的規模保持在可處理的設計范圍內很關鍵。

5.3傳播常量

使用常量傳播技術可以增加電路模型修改的靈活性和可移植性。如果有一個確定意義的常量并且在模型中的多處地方都引用到,則可以將該常量值定義為一個常量符號,然后直接引用該常量符號即可,如下所示:

parameterCOUNT=16;

P=COUNT*2;

for(i=0;i<COUNT-1;i++)

其中,COUNT表示的是循環次數,根據需要可以在語句“parameterCOUNT=16;”中修改其值。由于它是一個常量,在綜合時不會為表達式“COUNT*2”和“COUNT-1”生成任何硬件,而是在編譯時直接計算出表達式的值并將其賦給變量。

6結束語

一般情況下,綜合工具會自動對Verilog模型進行優化,但如果設計者在電路設計時直接就編寫出結構優化的電路模型,就會大大減少綜合工具的運行時間,甚至有時候綜合工具無法優化的結構經過手工調整后實現了優化的目的。因此,養成良好的設計風格是很重要的,在設計時不僅要保證設計的正確性,還要注重設計的高效性,避免不必要的反復修正,這樣才能提高設計效率,縮短開發周期。

參考文獻

[1]王金明.VerilogHDL程序設計教程.北京:人民郵電出版社,2004.1

[2]J.Bhasker.VerilogHDL綜合實用教程.北京:清華大學出版社,2004.1

主站蜘蛛池模板: 女子校生下媚药在线观看| 欧美特黄一片aa大片免费看| 国产成人精品视频一区二区不卡| 99视频精品全部在线播放| 美女裸体a级毛片| 在线电影一区二区三区| 久久综合热88| 武林高贵肥臀胖乳美妇| 公和我做得好爽在线观看| sss欧美华人整片在线观看| 无码人妻精品一区二区| 亚洲av无码精品色午夜| 毛片色毛片18毛片美女| 免费观看女子推理社| 自拍另类综合欧美小说| 国产国语对白露脸在线观看| aa视频在线观看| 性欧美video在线播放| 亚洲一区二区三区偷拍女厕| 浮力影院第一页小视频国产在线观看免费 | 久久免费视频精品| 狠狠色丁香久久婷婷综合| 国产国产精品人在线视| 你懂得的在线观看免费视频| 在线观看亚洲专区| mm1313亚洲精品无码又大又粗| 成人无码A级毛片免费| 亚洲伊人久久精品影院| 精品国产乱码久久久久久1区2区| 国产又色又爽又刺激在线观看| 婷婷丁香六月天| 国产精品日本一区二区在线播放 | 亚洲香蕉免费有线视频| 韩国精品一区视频在线播放| 国产精品国产三级国产AV′| 97色精品视频在线观看| 扁豆传媒在线入口| 久久亚洲精品成人无码网站| 欧美日韩国产三级| 再深点灬舒服灬太大了网站| 胸奶好大好紧好湿好爽|