Verilog的数据流、行为、结构化与RTL级描述
Verilog語言可以有多種方式來描述硬件,同時,使用這些描述方式,又可以在多個抽象層次上設(shè)計硬件,這是Verilog語言的重要特征。
在Verilog語言中,有以下3種最基本的描述方式:
- 數(shù)據(jù)流描述:采用assign連續(xù)賦值語句
- 行為描述:使用always語句或initial語句塊中的過程賦值語句(推薦掌握)
- 結(jié)構(gòu)化描述:實例化已有的功能模塊或原語
以一個4位全加器為例:
| 數(shù)據(jù)流描述 | 行為描述 | 結(jié)構(gòu)化描述 |
| module Full_Add_4b_1( A, B, Cin, Sum, Cout );? input[3:0] A; input[3:0] B; input Cin; output[3:0] Sum; output Cout;? ?assign {Cout, Sum} = A + B + Cin;? ?endmodule | module Full_Add_4b_2( A, B, Cin, Sum, Cout ); input[3:0] A;? input[3:0] B; input Cin;? output[3:0] Sum; output Cout;? reg [3:0] Sum;? reg Cout;? ?always @(A or B or Cin) begin {Cout, Sum} <= A + B + Cin; ?end endmodule | `include "Full_Add_4b_1.v"? ?module Full_Add_4b_3( A, B, Cin, Sum, Cout );? input[3:0] A;? input[3:0] B;? input Cin; output[3:0] Sum;? output Cout; //實例化全加器 Full_Add_4b_1 FA0( A, B, Cin, Sum, Cout );? endmodule |
| | ||
下面逐一對這些描述方式進(jìn)行介紹:
數(shù)據(jù)流描述
在數(shù)字電路中,信號經(jīng)過組合邏輯時會類似于數(shù)據(jù)流動,即信號從輸入流向輸出,并不會在其中存儲。當(dāng)輸入發(fā)生變化時,總會在一定時間以后體現(xiàn)在輸出端。同樣,我們可以模擬數(shù)字電路的這一特性,對其進(jìn)行建模,這種建模方式通常被稱為數(shù)據(jù)流建模。數(shù)據(jù)流描述中最基本的語句是assign連續(xù)賦值語句。
圖中的模型可以用如下語句來描述:
asssign #1 A_xor_wire = eq0 ^ eq1;
在任意一個時刻,A_xor_wire線網(wǎng)的值都是由eq0和eq1決定的,也可以說是由它們驅(qū)動的。
下面對連續(xù)賦值語句的特點(diǎn)進(jìn)行說明:
一、連續(xù)驅(qū)動
連續(xù)賦值語句是連續(xù)驅(qū)動的,也就是說只要輸入發(fā)生變化,都會導(dǎo)致該語句的重新計算。
二、只有線網(wǎng)類型的變量才能在assign語句中被賦值
由于連續(xù)賦值語句中被賦值的變量在仿真器中不會存儲其值,因此該變量是線網(wǎng)類型(Net)的,而不是寄存器類型的。
另外,線網(wǎng)類型的變量可以被多重驅(qū)動,也就是說可以在多個連續(xù)賦值語句中驅(qū)動同一個線網(wǎng)。
但是寄存器變量就不同了,它不能被不同的行為進(jìn)程(例如always語句塊)驅(qū)動。
三、使用assign對組合邏輯建模
建議使用assign對組合邏輯建模,這是因為assign語句的連續(xù)驅(qū)動特點(diǎn)與組合邏輯的行為非常相似,而且在assign語句中加延時可以非常精確地模擬組合邏輯的慣性延時。
四、并行性
assign語句與行為語句塊(always和initial)、其它連續(xù)賦值語句、門級模型之間是并行的。一個連續(xù)賦值語句是一個獨(dú)立的進(jìn)程,進(jìn)程之間是并發(fā)的,同時也是交織的。
五、實例
這是一個半加器,使用連續(xù)賦值語句描述這個電路。
| HDL代碼 | RTL電路 |
| module Half_Add( X, Y, Sum, C_out ); //半加器 input X; input Y; output Sum; output C_out; assign Sum = X ^ Y, C_out = X & Y; endmodule | |
| 在Half_Add模塊中,兩個assign語句之間是獨(dú)立并行的,它們的順序與邏輯功能無關(guān)。 | |
行為描述
行為方式的建模是指采用對信號行為級的描述(不是結(jié)構(gòu)級的描述)的方法來建模。在表示方面,類似數(shù)據(jù)流的建模方式,但一般是把用initial?塊語句或always?塊語句描述的歸為行為建模方式。行為建模方式通常需要借助一些行為級的運(yùn)算符如加法運(yùn)算符(+),減法運(yùn)算符(-)等。
例: 一位全加器的行為建模
module Full_Add_1b_2( A, B, Cin, Sum, Cout );? input A;? input B;? input Cin;? output Sum;? output Cout;? reg Sum; reg Cout;? always @(A or B or Cin)? ????begin {Cout, Sum} <= A + B + Cin;? end endmodule需要先建立以下概念:
1、只有寄存器類型的信號才可以在always和initial 語句中進(jìn)行賦值,類型定義通過reg語句實現(xiàn)。
2、always 語句是一直重復(fù)執(zhí)行,由敏感表(always 語句括號內(nèi)的變量)中的變量觸發(fā)。
3、always 語句從0 時刻開始。
4、在begin 和end 之間的語句是順序執(zhí)行,屬于串行語句。
結(jié)構(gòu)化描述
結(jié)構(gòu)化描述就是說在設(shè)計中實例化已有的功能模塊,這些功能模塊包括門原語、用戶自定義原語(UDP)和其他模塊(module)。以下是結(jié)構(gòu)化描述的3種實例類型:
- 實例化其他模塊
- 實例化門(如與門and、異或門xor等)
- 實例化UDP
結(jié)構(gòu)化的描述方式反映了一個設(shè)計的層次結(jié)構(gòu)。
例[1]:一位全加器
| HDL代碼 | RTL電路 |
| module Full_Add_1b_3( A, B, Cin, Sum, Cout ); input A; input B; input Cin; output Sum; output Cout; wire S1, T1, T2, T3; // -- statements -- // xor x1 (S1, A, B); xor x2 (Sum, S1, Cin); and A1 (T3, A, B ); and A2 (T2, B, Cin); and A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3 ); endmodule |
該實例顯示了一個全加器由兩個異或門、三個與門、一個或門構(gòu)成。S1、T1、T2、T3則是門與門之間的連線。代碼顯示了用純結(jié)構(gòu)的建模方式,其中xor 、and、or 是Verilog HDL 內(nèi)置的門器件。
以 xor x1 (S1, A, B) 該例化語句為例:
xor 表明調(diào)用一個內(nèi)置的異或門,器件名稱xor ,代碼實例化名x1(類似原理圖輸入方式)。括號內(nèi)的S1,A,B 表明該器件管腳的實際連接線(信號)的名稱 ,其中 A、B是輸入,S1是輸出。其他同。
例[2]:兩位全加器
兩位的全加器可通過調(diào)用兩個一位的全加器來實現(xiàn)。該設(shè)計的結(jié)構(gòu)圖如下:
該實例用結(jié)構(gòu)化建模方式進(jìn)行一個兩位的全加器的設(shè)計,頂層模塊Full_Add_2b_3 調(diào)用了兩個一位的全加器 Full_Add_1b_3。在這里,以前的設(shè)計模塊Full_Add_1b_3 對頂層而言是一個現(xiàn)成的器件,頂層模塊只要進(jìn)行例化就可以了。
注意這里的例化中,端口映射(管腳的連線)采用名字關(guān)聯(lián),如 .A (FA[2]) ,其中.A 表示調(diào)用器件的管腳A,括號中的信號表示接到該管腳A的電路中的具體信號。 wire 保留字表明信號FTemp 是屬線網(wǎng)類型。
另外,在設(shè)計中,盡量考慮參數(shù)化的問題
?
RTL級,register transfer level,指的是用寄存器這一級別的描述方式來描述電路的數(shù)據(jù)流方式;而Behavior級指的是僅僅描述電路的功能而可以采用任何verilog語法的描述方式。鑒于這個區(qū)別,RTL級描述的目標(biāo)就是可綜合,而行為級描述的目標(biāo)就是實現(xiàn)特定的功能而沒有可綜合的限制。
?
?
????行為級是RTL的上一層,行為級是最符合人類邏輯思維方式的描述角度,一般基于算法,用C/C++來描述。從行為級到RTL級的轉(zhuǎn)換,一般都是由IC設(shè)計人員手工翻譯。
???????這個過程繁瑣,工作量很大,特別是隨著數(shù)字系統(tǒng)的復(fù)雜性提升,這樣的純手工"翻譯"過程容易出錯,且使得開發(fā)周期變長。一批高級綜合工具應(yīng)運(yùn)而生。如Menter Graphics的高層次綜合工具Catapult C Synthesis。能夠?qū)?shù)字系統(tǒng)的行為級描述映射為RTL設(shè)計,并滿足給定的目標(biāo)限制。從層次由上到下,數(shù)字系統(tǒng)的設(shè)計過程為:
?????Idea->行為級描述->rtl描述->門級網(wǎng)標(biāo)->物理版圖
?
?
行為級的描述更多的是采取直接賦值的形式,只能看出結(jié)果,看不出數(shù)據(jù)流的實際處理過程。其中又大量采用算術(shù)運(yùn)算,延遲等一些無法綜合的語句。常常只用于驗證仿真。
RTL級的描述就會更詳細(xì)一些,并且從寄存器的角度,把數(shù)據(jù)的處理過程表達(dá)出來。可以容易地被綜合工具綜合成電路的形式。
?
?
行為級描述可是說是RTL的上層描述,比RTL更抽象。行為描述不關(guān)心電路的具體結(jié)構(gòu),只關(guān)注算法。
有行為綜合工具,可以直接將行為級的描述綜合為RTL級的,比如Behavioral Compiler。
?
在硬件設(shè)計中有一句著名的話:thinking of hardware。RTL在很大程度上是對流水線原理圖的描述。哪里是組合邏輯,哪里是寄存器,設(shè)計者應(yīng)該了然于胸。組合邏輯到底如何實現(xiàn),取決于綜合器和限制條件。
?
rtl級可以理解為,可以直接給綜合工具生成你要的網(wǎng)表的代碼,而行為級則不行。比如real可以用于行為級,而不能用于rtl級!
?
行為級 is for testbench for modelling.
RTL is for synthesis
?
語法塊如果可以被綜合到gate level,就是RTL的。否則就是behavior level的。
同樣是for語句,如果循環(huán)條件是常數(shù),就是RTL的,如果是變量,就是behavior的。
?
行為級不考慮電路的實現(xiàn),不考慮綜合
?
RTL級描述數(shù)據(jù)在寄存器層次的流動模型。
always 屬于行為級模型,是最基本的行為模型,是可以綜合的。
綜合與RTL或者行為級沒有必然聯(lián)系,雖然大多數(shù)行為模型不能綜合
?
?
從網(wǎng)上copy
目的區(qū)別:????????
??????行為級描述目的是加快仿真速度,做法是盡量減少一個always塊中要執(zhí)行的語句數(shù)量,其結(jié)果不是為了綜合,只關(guān)注算法。有行為綜合工具,可以直接將行為級的描述綜合為RTL級的,比如Behavioral Compiler。
形式區(qū)別:
??????RTL級描述是為了綜合工具能夠正確的識別而編寫的代碼,verilog中有一個可綜合的子集,不同的綜合工具支持的也有所不同,????RTL級的描述就會更詳細(xì)一些,并且從寄存器的角度,把數(shù)據(jù)的處理過程表達(dá)出來。可以容易地被綜合工具綜合成電路的形式。可以采用任何verilog語法 的描述方式。鑒于這個區(qū)別,RTL級描述的目標(biāo)就是可綜合,
??????行為級的描述更多的是采取直接賦值的形式,只能看出結(jié)果,看不出數(shù)據(jù)流的實際處理過程。其中又大量采用算術(shù)運(yùn)算,延遲等一些無法綜合的語句。常常只用于驗證仿真。
電路區(qū)別:
??????RTL級,register transfer level,指的是用寄存器這一級別的描述方式來描述電路的數(shù)據(jù)流方式;RTL在很大程度上是對流水線原理圖的描述。哪里是組合邏輯,哪里是寄存器,設(shè)計 者應(yīng)該了然于胸。組合邏輯到底如何實現(xiàn),取決于綜合器和限制條件。 RTL是晶體管傳輸級,描述硬件的相互聯(lián)接關(guān)系,一般都可以綜合;
??????而Behavior級指的是僅僅描述電路的功能而在硬件設(shè)計中有一句著名的話:thinking of hardware。簡單說,rtl就是用寄存器和組合邏輯組成,不能再用其他construct;behavior就是指定輸入和輸出之間的關(guān)系。
混亂點(diǎn):???有時感覺RTL級是行為級與數(shù)據(jù)流級的混合應(yīng)用。
樂點(diǎn):??????同樣是for語句,如果循環(huán)條件是常數(shù),就是RTL的,如果是變量,就是behavior的。
總結(jié)
以上是生活随笔為你收集整理的Verilog的数据流、行为、结构化与RTL级描述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C与C++中struct及C++中str
- 下一篇: 关于Verilog的可综合性