《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > Verilog HDL阻塞屬性探究及其應(yīng)用

Verilog HDL阻塞屬性探究及其應(yīng)用

2009-08-04
作者:郭寶增,汪祥春

??? 摘 要:阻塞賦值與非阻塞賦值語句作為verilog HDL語言的最大難點(diǎn)之一,,一直困擾著FPGA設(shè)計者,,而其中的錯誤又隱晦莫測,,理解不透徹會直接導(dǎo)致運(yùn)用不當(dāng),使設(shè)計工程達(dá)不到預(yù)期效果,而排錯又相當(dāng)麻煩。阻塞賦值與非阻塞賦值語句既血脈相連,,又有本質(zhì)的區(qū)別。透過原理和實(shí)際應(yīng)用,,從不同側(cè)面對阻塞賦值與非阻塞賦值進(jìn)行剖析,,并闡述了阻塞賦值與非阻塞賦值的各自特點(diǎn)及其應(yīng)用。
??? 關(guān)鍵詞:Verilog HDL,;阻塞賦值,;非阻塞賦值;層積事件列

?

??? Verilog HDL中,,有兩種過程賦值方式,,即阻塞賦值(blocking)和非阻塞賦值(nonblocking)。阻塞賦值執(zhí)行時,,RHS(right hand statement)估值與更新LHS(left hand statement)值一次執(zhí)行完成,,計算完畢,立即更新,。在執(zhí)行時阻塞同塊中的其他語句的執(zhí)行,。阻塞式(blocking)的操作符為 “ = ”。它的執(zhí)行很像傳統(tǒng)程序設(shè)計語言,。非阻塞賦值RHS估值與更新LHS值分兩步執(zhí)行,。在單位仿真周期開始時RHS估值,在同一單位仿真周期末更新LHS值,,不阻塞同塊中其他語句的執(zhí)行,。非阻塞式(non-blocking)的操作符為 “ <= ”,它的執(zhí)行更像并行電路,,使描述電路更自然,。阻塞賦值與非阻塞賦值是Verilog HDL程序設(shè)計的難點(diǎn),它們既有共同點(diǎn),,也有差異,,深入剖析其異同,對于硬件程序的開發(fā)具有重大意義,。
1 Verilog 事件處理機(jī)制
??? 層積事件列(The Stratified Event Queue)是一個事件管理概念模型,,而非硬件邏輯。模型內(nèi)事件的具體實(shí)現(xiàn)與EDA軟件生產(chǎn)商的算法策略有關(guān),。在IEEE-2001中,,Verilog把事件分為5個不同部分,按照時間順序如圖1所示,。

?


??? 觸發(fā)的任何事件可以加入到這5個事件列中的任何事件列中,,但只能從活躍事件列中移出。即上面的5個事件列中的事件最后都將被激活而放入活躍事件列中,。層積事件列是層次模型,,層積事件列的執(zhí)行順序是按優(yōu)先級排列的。任何EDA軟件都只能執(zhí)行活躍事件,。其他事件列都按優(yōu)先級級別依次激活本列事件以供執(zhí)行,。
1.1 活躍事件列
??? 由圖1可見,大部分事件都被放入活躍事件列,?;钴S事件列里包括非阻塞賦值RHS估值。但是,非阻塞賦值的更新不是在活躍事件列,,它被列成獨(dú)立的非阻塞更新事件列,。活躍事件列是仿真的執(zhí)行源,,從一開始執(zhí)行活躍事件列到活躍事件列執(zhí)行完畢稱為一個仿真周期,。活躍事件列中的事件可以觸發(fā)活躍或非活躍等其他事件,。當(dāng)活躍事件列中的所有事件執(zhí)行完后,,EDA軟件會按優(yōu)先級依次觸發(fā)其余事件列以供仿真執(zhí)行。但在當(dāng)前活躍事件列中的事件執(zhí)行順序是不確定的,。
1.2 非活躍事件列
??? 發(fā)生在當(dāng)前仿真時間里并且在活躍事件列執(zhí)行完后執(zhí)行的事件列,,即非活躍事件列執(zhí)行優(yōu)先級僅次于活躍事件列。如帶PLI例程的回調(diào)過程(tf_synchronize(),、vpi_register_cb(cb_readwrite)),。非活躍事件列中的事件亦可以觸發(fā)其他事件。如果觸發(fā)了優(yōu)先級更高的活躍事件,,非活躍事件列中的其余事件執(zhí)行后移,。
1.3 非阻塞賦值更新事件列
??? 活躍事件列中的每個非阻塞賦值RHS估值,都會觸發(fā)一個與之對應(yīng)的非阻塞賦值更新事件,,這些事件被放在非阻塞賦值更新事件列中,,執(zhí)行優(yōu)先級次于活躍與非活躍事件列。非阻塞賦值更新事件亦可以觸發(fā)其他事件,。若在非阻塞賦值更新事件列中,,存在多個對同一變量的先后賦值,只有最后一個有效,,其余值將被覆蓋,。
1.4 監(jiān)控事件列
??? 監(jiān)控事件列被放在非阻塞賦值更新事件列后。由此可見,,用監(jiān)控事件列中的監(jiān)控命令監(jiān)控得到的值都是賦值后的值,,活躍事件列$display系統(tǒng)命令則可以查看非阻塞更新前的值。
1.5 未來事件列
??? 在執(zhí)行事件時,,如果事件含有延時,,為不阻礙仿真的繼續(xù)執(zhí)行,該事件將被掛起而放入未來事件列。未來事件包含未來非活躍事件和未來非阻塞賦值更新事件,。
??? 理解阻塞與非阻塞賦值就需要深入理解層積事件列,,層積事件列反應(yīng)了Verilog事件處理機(jī)制。
2 應(yīng)用及分析
??? 通常非阻塞賦值產(chǎn)生寄存器等存儲元件,,對應(yīng)的物理器件是帶存貯功能的元件,,如寄存器、觸發(fā)器等。阻塞賦值則對應(yīng)網(wǎng)線(wire)類型,,通常與物理連線對應(yīng),。這是兩種賦值方式的最明顯的差異,也是時序邏輯用非阻塞,、組合邏輯用阻塞的重要原因,。但這并不是絕對的,事實(shí)上阻塞賦值對應(yīng)網(wǎng)線(wire)型,,亦可對應(yīng)寄存器(reg)型;阻塞賦值也能生成存貯元件,,因此不能片面理解,。在組合邏輯里,鎖存器可能引發(fā)測試問題,,帶來隱患,。說明在建模時,首先要從硬件出發(fā)來考慮問題,,應(yīng)先在頭腦中形成電路結(jié)構(gòu),,由于賦值方式的不同,綜合結(jié)果差異甚大,,運(yùn)用不當(dāng)很可能會導(dǎo)致建模失敗,。阻塞賦值在時序邏輯中亦有著重要應(yīng)用,在需要實(shí)時更新的組合邏輯中只有阻塞賦值能滿足要求,。
??? 以下示例代碼的功能是計算傳送過來的data中1和0的個數(shù),。
??? reg [5:0]count0,count1;
??? always @(posedge clk,negedge Rst_n)
??? ?? begin
??? ????? if(!Rst_n)
?????????? ...
??? ????? else
?????????? begin
? ?????????? count0 = 0;???????????????????????? //語句1
? ?????????? count1 = 0;???????????????????????? //語句2
? ?????????? for(i = 0;i <= 11;i = i+1)
? ????????????? begin
? ???????????????? if(data[i] == 1)
? ??????????????????? count1 = count1 + 1;??????? //語句3
? ???????????????? else if(data[i] == 0)
?????????????????????????? count0 = count0 - 1;?????? //語句4
?????????????????????????? else
???????????????????????????????? count0 = count0 + 0;???? //防止生成鎖存器
? ?????????? end
?? ??????? end
??? end
??? 在這段代碼里,,count0,、count1的值必須在每次計數(shù)之前被清零,count0,、count1必須實(shí)時更新,。顯然,只有阻塞賦值能滿足要求,。非阻塞賦值分兩步完成,,所有的更新事件在單位仿真周期末同時執(zhí)行,只有最后一個值有效,,所以非阻塞賦值無法完成計數(shù)任務(wù),。阻塞賦值卻能很好地勝任,因?yàn)樽枞x值估值和更新一次性完成,。
??? 事件上,,在時序邏輯中經(jīng)常碰到上述實(shí)時更新問題,非阻塞賦值往往無法實(shí)現(xiàn),如用阻塞賦值則可很好地解決問題,。
??? 正如阻塞賦值在時序邏輯中有重要應(yīng)用一樣,,非阻塞賦值在組合邏輯中亦有不可替代的應(yīng)用。在組合邏輯中用非阻塞賦值可以把組合邏輯改造成流水線,??蓤?zhí)行如下所示純組合邏輯代碼,將生成純組合邏輯,,綜合結(jié)果如圖2所示,。

?


??? input a,b,c,clk,sel;
? ? output out;
? ? reg out,temp;
??always @(posedge clk)
? ? begin
???? temp? = a & b;???? //語句1
???? if(sel)
?????? out? = temp | c;?? //語句2
???? else
?????? out? = c;?????? //語句3
??? end
??? 若把上面代碼中語句1、語句2,、語句3阻塞賦值(" = ")改為非阻塞賦值(" <= "),,則綜合結(jié)果如圖3所示。

?


??? 流水線設(shè)計方法在高性能,、需經(jīng)常進(jìn)行大規(guī)模運(yùn)算的組合邏輯中可以到廣泛運(yùn)用,。
??? 在組合邏輯中,如在begin,、end塊中同時有許多非阻塞賦值,,則它們的賦值順序是并發(fā)的。實(shí)際上它們賦予的都是上一個時鐘送入寄存器的值,。這與使用同一時鐘沿觸發(fā)的許多在同一個使能控制信號下賦值完全一致,,并且這種賦值因?yàn)閿?shù)據(jù)保存在寄存器中,當(dāng)時鐘沿到來時都已穩(wěn)定,,所以存入的數(shù)值是可靠的,。用這種方法可以避免由組合邏輯產(chǎn)生的競爭冒險[2]
??? 在相關(guān)應(yīng)用中,,非阻塞賦值能較好地解決零時刻競爭冒險問題,。因?yàn)榉亲枞x值分兩步完成,非阻塞賦值更新事件是在所有活躍與非活躍事件執(zhí)行完之后執(zhí)行,,能確保所有敏感變量值在零時刻都被觸發(fā)[3],。
??? 在同一always塊混合使用阻塞賦值與非阻塞賦值,利弊共存,,混合使用的結(jié)果可能事半功倍,,亦可能功虧一簣。只有了解其處理機(jī)制,,深刻理解阻塞與非阻塞賦值底層實(shí)現(xiàn)的異同,,方可靈活運(yùn)用。
??? 本文通過Verilog事件處理機(jī)制,,詳細(xì)討論了阻塞與非阻塞賦值的區(qū)別,、聯(lián)系及其應(yīng)用示例,。由本文可知,阻塞與非阻塞賦值靈活多變,,底層實(shí)現(xiàn)也差異甚大,。因而在數(shù)字電路設(shè)計時,依據(jù)預(yù)期功能,,從硬件實(shí)現(xiàn)出發(fā),,斟酌差異,仔細(xì)選用阻塞與非阻塞賦值才能有效避免出錯,,縮短開發(fā)周期,。
參考文獻(xiàn)
[1]? IEEE Standard verilog hardware description language based on the verilog hardware description language[R]. IEEE Computer Society. IEEE. New York. NY. IEEE Std 1364-2001.
[2]? 夏宇聞.Verilog 數(shù)字系統(tǒng)設(shè)計教程[M]. 北京:北京航空航天大學(xué)出版社,2003.
[3]? CLIKFFORD E.C. nonblocking assignment in verilog synthesis. coding styles that kill[J]. SNUG (Synopsys Users Group) 2000 User Papers,,2000(3).

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容,、版權(quán)和其它問題,,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。