Verilog非阻塞賦值的仿真綜合問(wèn)題_第1頁(yè)
Verilog非阻塞賦值的仿真綜合問(wèn)題_第2頁(yè)
Verilog非阻塞賦值的仿真綜合問(wèn)題_第3頁(yè)
Verilog非阻塞賦值的仿真綜合問(wèn)題_第4頁(yè)
Verilog非阻塞賦值的仿真綜合問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、118905.docPRELIMINARY七八零一研究所Createdon3/30/20048:24:00PMPage of19Createdon3/30/20048:24:00PMPage of19Verilog非阻塞賦值的仿真/綜合問(wèn)題源文件作者:CliffordE.Cummings(SunburstDesign,Inc.)原標(biāo)題:NonblockingAssignmentsinVerilogSynthesis,CodingStylesThatKill!ATTN:所有括號(hào)內(nèi)“外注”為理解方便或有疑問(wèn)的地方,原文里并沒(méi)有。所有翻譯都是為遵循“共同進(jìn)步”的理想但并沒(méi)有去努力得到原作者的任何書(shū)面

2、和其它方式許可,所以僅供大家參考。本人英文和設(shè)計(jì)水平都極有限,所以不能保證與原文的精確一致和正確(只能以“駑馬十步”稍作安慰吧),慚愧之后還希望大家多指教!在Verilog語(yǔ)言最難弄明白的結(jié)構(gòu)中“非阻塞賦值”要算一個(gè)。甚至是一些很有經(jīng)驗(yàn)的工程師也不完全明白“非阻塞賦值”在仿真器(符合IEEE標(biāo)準(zhǔn)的)里是怎樣被設(shè)定執(zhí)行的,以及什么時(shí)候該用“非阻塞賦值”。這篇文章將介紹怎樣設(shè)定“非阻塞賦值”和“阻塞賦值”,給出了重要的使得編碼可以被正確地綜合的編碼指導(dǎo)方針,和避免仿真競(jìng)爭(zhēng)的編碼風(fēng)格細(xì)節(jié)。1.0介紹眾所周知的邏輯建模方針是:在always塊里用“阻塞賦值”產(chǎn)生組合邏輯。在always塊里用“非阻塞賦

3、值”產(chǎn)生時(shí)序邏輯。但是為什么?(外注:在實(shí)現(xiàn)組合邏輯的assign結(jié)構(gòu)中,當(dāng)然采用阻塞賦值語(yǔ)句否則的話編譯工具會(huì)提醒你進(jìn)行修改的。)普通的回答是:那只是關(guān)于仿真的,即使不遵照上面的規(guī)則也照樣可以產(chǎn)生正確的綜合結(jié)果。但問(wèn)題是綜合前的仿真結(jié)果也許會(huì)跟綜合后的電路行為仿真不匹配。要明白上述建模方針背后的原因,就必須明白“非阻塞賦值”和“阻塞賦值”它們的功能和時(shí)序安排(thefunctionalityandschedulingofblockingandnonblockingassignments.)。這篇文章將詳細(xì)描述有關(guān)問(wèn)題。文章里將用到兩個(gè)縮寫形式:RHS(right-hand-side)和LHS

4、(left-hand-side)。前者指等式右邊的表達(dá)式或者變量(RHSexpressionorRHSvariable),后者指指等式左邊的表達(dá)式或者變量(RHSexpressionorRHSvariable)02.0Verilog仿真競(jìng)爭(zhēng)條件IEEEVerilogStandard2定義:“保證性的賦值描述”和“非保證性的賦值描述分別用“非阻塞賦值和“阻塞賦值”。(Determinism,section5.4.1;Nondeterminism,section5.4.2&Raceconditions,section5.5)IEEEVerilog標(biāo)準(zhǔn)允許在同一仿真時(shí)間里賦值競(jìng)爭(zhēng)的產(chǎn)生。當(dāng)賦值陳述有

5、所不同時(shí),會(huì)產(chǎn)生不同的結(jié)果。(譯注:即可以認(rèn)為:“非阻塞賦值”有更高的優(yōu)先權(quán)對(duì)變量進(jìn)行賦值或者是指陳述的次序不同會(huì)產(chǎn)生不同結(jié)果?)為了避免含競(jìng)爭(zhēng)的描述(racecondition),明白Verilog“非阻塞賦值”和“阻塞賦值”的時(shí)序安排是非常重要的。3.0阻塞賦值(blockingassignments)阻塞賦值由等號(hào)“=”表示?!白枞x值”由它的賦值操作行為而得名:當(dāng)沒(méi)有其它的Verilog描述可以打斷“阻塞賦值”時(shí),操作將會(huì)估計(jì)RHS的值并完成賦值?!白枞奔词钦f(shuō)在當(dāng)前的賦值完成前阻塞其它類型的賦值任務(wù)。一個(gè)例外是:對(duì)阻塞操作的RHS進(jìn)行延時(shí)(delays)的阻塞賦值(在延時(shí)未完成前不會(huì)

6、阻塞其它賦值任務(wù)),但是這被我們認(rèn)為是不好的btltzmailCMltMAERQ&PAjCE$ClEMCE&INDUSTRYCOfiP.編碼方式。“阻塞賦值“可以看作一步進(jìn)程(one-stepprocess):當(dāng)沒(méi)有其它可以打斷賦值的描述時(shí),估計(jì)等式右邊(RHS)的指并賦予左邊(LHS)。在同一個(gè)always塊里面,阻塞賦值結(jié)果將一直持續(xù)下去直到賦值結(jié)束。阻塞賦值的一個(gè)問(wèn)題是:當(dāng)一個(gè)程序塊(比如always塊)阻塞賦值描述里面的“RHS變量”同時(shí)是另外一個(gè)程序塊(比如always塊)阻塞賦值描述里面的“LHS變量”,并且兩個(gè)等式的執(zhí)行被安排在同一個(gè)仿真時(shí)間步里面執(zhí)行(比如同一個(gè)時(shí)鐘上升沿),那

7、么競(jìng)爭(zhēng)條件就產(chǎn)生了,這樣的情況下其執(zhí)行次序?qū)⑹俏粗?。為了舉例說(shuō)明這種情況,請(qǐng)看Verilog代碼描述的例一:modulefbosc1(y1,y2,clk,rst);outputy1,y2;inputclk,rst;regy1,y2;always(posedgeclkorposedgerst)if(rst)y1=0;/resetelsey1=y2;always(posedgeclkorposedgerst)if(rst)y2=1;/presetelsey2=y1;endmoduleExample1-Feedbackoscillatorwithblockingassignments依據(jù)IEEEV

8、erilog標(biāo)準(zhǔn),這兩個(gè)always塊可以以任意的次序執(zhí)行。如果在reset后第一個(gè)塊先被執(zhí)行,結(jié)果將是yl和y2都獲得賦值1;如果在reset后第二個(gè)塊先被執(zhí)行,結(jié)果將是yl和y2都被賦值0。這個(gè)例子清楚地展示了一個(gè)Verilog競(jìng)爭(zhēng)條件地產(chǎn)生。4.0非阻塞賦值(nonblockingassignments)非阻塞賦值使用一個(gè)小于等于號(hào)“U?TRYCCflP.Createdon3/30/20048:24:00PMPage of19btltzmailCreatedon3/30/20048:24:00PMPage of19modulefbosc2(y1,y2,clk,rst);outputy1,

9、y2;inputclk,rst;regy1,y2;always(posedgeclkorposedgerst)if(rst)y1=0;/resetelsey1=y2;always(posedgeclkorposedgerst)if(rst)y2=1;/presetelsey2=y1;endmoduleExample2-Feedbackoscillatorwithnonblockingassignments依據(jù)IEEEVerilog標(biāo)準(zhǔn),這兩個(gè)會(huì)可以以任意的次序執(zhí)行。在reset后,不管哪一個(gè)塊先被執(zhí)行,在時(shí)間步的開(kāi)始兩個(gè)RHSexpression同時(shí)被估值,在時(shí)間步結(jié)束LHSvariables

10、同時(shí)更新賦值。在使用者看來(lái),這兩個(gè)非阻塞描述是并行發(fā)生的。5.0Verilog編碼指導(dǎo)仿真在對(duì)“非阻塞賦值”和“阻塞賦值”作更深一步的舉例和說(shuō)明之前,現(xiàn)列舉八條指導(dǎo)方針是有幫助的。這些仿真可以幫助正確地用Verilog對(duì)硬件建模和仿真。謹(jǐn)遵這些方針可以幫助Verilog設(shè)計(jì)者減少所遇到的90-100%的Verilog競(jìng)爭(zhēng)。1:當(dāng)為時(shí)序邏輯建模,使用“非阻塞賦值”。#2:當(dāng)為鎖存器(latch)建模,使用“非阻塞賦值”。#3:當(dāng)用always塊為組合邏輯建模,使用“阻塞賦值”#4:當(dāng)在同一個(gè)always塊里面既為組合邏輯又為時(shí)序邏輯建模,使用“非阻塞賦值”。#5:不要在同一個(gè)always塊里面混

11、合使用“阻塞賦值”和“非阻塞賦值”。#6:不要在兩個(gè)或兩個(gè)以上always塊里面對(duì)同一個(gè)變量進(jìn)行賦值。#7:使用$strobe以顯示已被“非阻塞賦值”的值。#8:不要使用#0延遲的賦值。關(guān)于這些指導(dǎo)方針的來(lái)源,這篇文章的余下部分將會(huì)給出。Verilog的新手們一定要記住并使用這些方針直到完全弄明白了它們根本的功能。遵循這些方針將會(huì)幫助你避免“Verilog痛苦(“deathbyVerilog!)。6.0層積事件列(stratifiedeventque)ue仔細(xì)地考察一下Verilog的層積事件列(stratifiedeventqueue,見(jiàn)表一)可以幫助解釋Verilog的層積事件列是如何發(fā)揮

12、作用的。對(duì)于用于安排仿真事件順序的不同Verilog事件列,“層積事件列”是一個(gè)迷人的和有想象力的名字。在IEEEVerilog標(biāo)準(zhǔn)里被描述成一種概念上的模范用于鑒定各個(gè)供應(yīng)商的仿真器能力,盡管它們各自對(duì)事件列的執(zhí)行細(xì)節(jié)是它們各自所獨(dú)有的。這些細(xì)節(jié)問(wèn)題不是本章所要討論的。)。在IEEE1364-1995Verilog標(biāo)準(zhǔn)的5.3節(jié),“層積事件列”被劃分為四個(gè)迥然不同的列,它們分別歸為當(dāng)前仿真時(shí)間列和將來(lái)仿真時(shí)間列。BlockingassiginmeimtsEvaluateRHSofnomblockingassignmentsContinnousassignimgntsdisplaycomman

13、dexecutionEvaluateinputsamdchangeoutputsofprimitives#0blockingassignmomtsSmonitorcommandexecution$呂七robecommandexecutionOtherspecificPLIcommandsTheseeventsmaybeschedulediimanyorderUpdateLIHISofnonblockingassignmentsFigure1-VerilogstratifiedeventqiieLie“激活事件列”(ActiveEvents)是最多的被預(yù)備執(zhí)行的Verilog事件,包括非阻塞賦值

14、、連續(xù)賦值、$display命令、利用對(duì)實(shí)例(instance)和初原元件(primitive,可能這樣翻不合適,但是知道Verilog的家伙都知道這個(gè),就先將就著了!)更新的輸出值估出實(shí)例(instance)和初原元件(primitive)的輸入值、估出“非阻塞賦值的RHSexpressionso注意“非阻塞賦值”的LHS不在“激活事件列”里更新值。事件可以被加到任意的事件列里(由IEEE標(biāo)準(zhǔn)強(qiáng)制約束的)但是只可能從“激活事件列”里被移出。其它事件列里的事件最終總是要成為“激活事件”的(或者提升為“激活事件)。IEEE1364-1995Verilog標(biāo)準(zhǔn)第5.4節(jié)列出了當(dāng)其它事件列(even

15、tqueues)被激活后的算法。在當(dāng)前仿真時(shí)間里,兩個(gè)常見(jiàn)的事件列(eventqueues)是“非阻塞賦值更新”事件列和“monitor”事件列。具體描述如下:“非阻塞賦值更新”事件列(Thenonblockingassignupdateentqueue)即是“非阻塞賦值”的LHSexpression被安排更新賦值的那些事件。在一個(gè)仿真時(shí)間步(simulationtimebtltzmailstep)的開(kāi)始,“RHSexpression的估值與其它被激活事件是以任意的次序進(jìn)行的?!癿onitor事件列是由那些被安排的“$strobe”和“$monitor”顯示命令帶來(lái)的。$strobe和$mon

16、itor用于顯示一個(gè)仿真時(shí)間步結(jié)束時(shí)變量更新后的值(這時(shí)該仿真時(shí)間步里所有的賦值分配都已經(jīng)完成)。IEEE1364-1995Verilog標(biāo)準(zhǔn)第5.3節(jié)描述了“怠惰事件列”,即被賦為零延遲(#0)的事件。實(shí)際上“零延遲”是有缺陷的。一般設(shè)計(jì)者使用零延遲是想為在不同程序塊(proceduralblocks)被賦值的變量提供一個(gè)避免仿真競(jìng)爭(zhēng)的環(huán)境。設(shè)計(jì)者希望一個(gè)賦值語(yǔ)句在另一個(gè)之后“一點(diǎn)兒”替代前面賦值。這是沒(méi)必要的,只會(huì)增加(仿真器)分析事件列的難度。作者不知道有哪一種情況下必須要使用零延遲以至于不用零延時(shí)就不能用別的不同的、更有效的編碼風(fēng)格來(lái)達(dá)到所想的目的。所以不推薦使用零延遲。建模方針8:不

17、要使用零延遲。上面圖一的“層積事件列”將經(jīng)常參考以用來(lái)解釋下面的Verilog行為描述例子?!笆录小币矊⒆鳛樽C明5.0節(jié)列舉的八條建模方針的參考。7.0自觸發(fā)always塊一般來(lái)講,一個(gè)always塊不能夠自觸發(fā)??紤]下面例三的振蕩器:moduleosc1(clk);outputclk;regclk;initial#10clk=0;always(clk)#10clk=clk;endmoduleExample3-Non-self-triggeringoscillatorusingblockingassignments這個(gè)振蕩器使用“阻塞賦值”,這樣的話RHS估值和LHS賦值是不被打斷地執(zhí)行。在

18、elk邊沿觸發(fā)能被安排執(zhí)行之前,非阻塞賦值就已經(jīng)必須安排執(zhí)行。即在邊沿事件之前,對(duì)elk的賦值已經(jīng)完成。所以,沒(méi)有“觸發(fā)事件”(clk)來(lái)觸發(fā)always塊里面的觸發(fā)事件(totriggerthe(clk)trigger)。與之形成對(duì)比的是,例4的振蕩器使用“非阻塞賦值”:moduleosc2(clk);outputclk;regclk;initial#10clk=0;always(clk)#10clkisassignedbutneverused.WARNING:Signalisassignedbutneverused.)在例5里面,接連的“阻塞賦值”命令將使得輸入D連續(xù)地覆蓋所有寄存器輸出(

19、在下一個(gè)posedgeelk到來(lái)時(shí))。即在每一個(gè)elk邊沿,輸入值被無(wú)延遲地傳到q3的輸出。這很明顯并沒(méi)有建立一個(gè)流水線而只是為一個(gè)寄存器建模實(shí)際綜合結(jié)果將是上面的圖3。modulepipeb2(q3,d,clk);output7:0q3;input7:0d;inputclk;reg7:0q3,q2,q1;always(posedgeclk)beginq3=q2;注意次序的更改!q2=q1;q1=d;endendmoduleExample6-Badblocking-assignmentsequentialcodingstyle#2-butitworks!上面的pipeb2里面,阻塞賦值被仔細(xì)地

20、安排了次序以使得行為仿真正確。這種建模同樣也可以得到正確的綜合結(jié)果。(外注:Found3-bitshiftregisterforsignalq3.Summary:inferred8Shiftregister(s).)在下面的例3里,“阻塞賦值被安排在不同的always塊里面。這樣Verilog標(biāo)準(zhǔn)允許以任意的次序來(lái)仿真執(zhí)行3個(gè)always塊這也許會(huì)使得該流水線仿真結(jié)果產(chǎn)生錯(cuò)誤,因?yàn)檫@產(chǎn)生了Verilog競(jìng)爭(zhēng)條件。由不同的always塊執(zhí)行順序會(huì)產(chǎn)生不同的結(jié)果。盡管這樣,它的綜合結(jié)果將是正確的!這就意味著綜合前仿真和綜合后仿真不匹配。Pipeb4或者其它的類似always塊同樣也許會(huì)產(chǎn)生仿真與綜

21、合不匹配的結(jié)果綜合結(jié)果是對(duì)的,但是仿真結(jié)果也許不正確。(外注:pipeb4只是又顛倒了一下次序,對(duì)實(shí)際仿真次序卻不產(chǎn)生決定作用.)modulepipeb3(q3,d,clk);output7:0q3;input7:0d;inputclk;reg7:0q3,q2,q1;always(posedgeclk)q1=d;always(posedgeclk)q2=q1;always(posedgeclk)q3=q2;endmoduleExample7-Badblocking-assignmentsequentialcodingstyle#3modulepipeb4(q3,d,clk);output7:0

22、q3;input7:0d;inputclk;reg7:0q3,q2,q1;always(posedgeclk)q2=q1;always(posedgeclk)q3=q2;always(posedgeclk)q1=d;endmoduleExample8-Badblocking-assignmentsequentialcodingstyle#4假如每一個(gè)上面的例子都改用“非阻塞賦值”那么將會(huì)都能得到正確的仿真結(jié)果,并綜合出想要的流水線邏輯。modulepipen1(q3,d,clk);output7:0q3;input7:0d;inputclk;reg7:0q3,q2,q1;always(pose

23、dgeclk)beginq1=d;q2=q1;q3=q2;endendmoduleExample9-Goodnonblocking-assignmentsequentialcodingstyle#1modulepipen2(q3,d,clk);output7:0q3;input7:0d;inputclk;reg7:0q3,q2,q1;always(posedgeclk)beginq3=q2;q2=q1;q1=d;endendmoduleExample10-Goodnonblocking-assignmentsequentialcodingstyle#2modulepipen3(q3,d,clk

24、);output7:0q3;input7:0d;inputclk;reg7:0q3,q2,q1;always(posedgeclk)q1=d;always(posedgeclk)q2.Createdon3/30/2004btltzmail8:24:00PMPage #of19CHUUlifREQ卿UQE總肆隹4INiDU$TRCOW.Createdon3/30/2004btltzmail8:24:00PMPage of19btltzmailCreatedon3/30/20048:24:00PMPage of19endmoduleExample11-Goodnonblocking-assignm

25、entsequentialcodingstyle#3modulepipen4(q3,d,clk);output7:0q3;input7:0d;inputclk;reg7:0q3,q2,q1;always(posedgeclk)q2=q1;always(posedgeclk)q3=q2;always(posedgeclk)q1=d;endmoduleExample12-Goodnonblocking-assignmentsequentialcodingstyle#4從上面的流水線編碼風(fēng)格例子可以看出:僅一個(gè)“阻塞賦值”的描述可以保證仿真正確。*三個(gè)“阻塞賦值”的描述可以得到正確綜合結(jié)果。*四個(gè)“

26、非阻塞賦值”描述都可以保證仿真結(jié)果正確。*四個(gè)“非阻塞賦值”描述都可以得到正確綜合結(jié)果。(原文這一條是“阻塞賦值”大概是有誤?)雖然,如果限制在一個(gè)always塊里面,并小心地組織好一個(gè)always塊里面阻塞賦值的次序(外注:一個(gè)always塊里面的幾個(gè)“阻塞賦值”是按照陳述的次序串行仿真執(zhí)行的,綜合執(zhí)行次序也是?)同樣可能會(huì)正確地為流水線建模;但是另一方面,我們可以很容易地使用“非阻塞賦值”來(lái)為上面的流水線建模它們既可以正確仿真也可以正確綜合。9.0阻塞賦值&簡(jiǎn)單例子有許多將Verilog和Verilog綜合的書(shū),它們舉了很多成功地利用“阻塞賦值”為一些簡(jiǎn)單的時(shí)序電路建模的小例子。例13是一

27、個(gè)在大多數(shù)Verilog書(shū)本里用來(lái)為一個(gè)觸發(fā)器(flip-flop)建模的例子(這是簡(jiǎn)單而有缺陷的阻塞賦值建模,但是它確實(shí)可以工作):moduledffb(q,d,clk,rst);outputq;inputd,clk,rst;regq;always(posedgeclk)if(rst)q=1b0;elseq=d;endmoduleExample13-Simpleflawedblocking-assignmentD-flipflopmodel-butitworks!如果工程師們想把所有的模塊(module)都集中到一個(gè)always里面描述,“阻塞賦值”可以用來(lái)正確地為所需要的邏輯建模、仿真和綜

28、合。但是不幸的是這個(gè)原因?qū)е铝讼矚g在其它情況下也使用“阻塞賦值”的習(xí)慣,并且更復(fù)雜的時(shí)序always塊將會(huì)產(chǎn)生競(jìng)爭(zhēng)條件在前面已經(jīng)詳細(xì)闡述過(guò)。moduledffx(q,d,clk,rst);outputq;inputd,clk,rst;regq;always(posedgeclk)if(rst)q=1b0;elseqRegisterequivalenttohasbeenremoved118905.docPRELIMINARY七八零一研究所118905.docPRELIMINARY七八零一研究所Createdon3/30/2004btltzmail8:24:00PMPage of19Created

29、on3/30/2004btltzmail8:24:00PMPage of19Found1-bitregisterforsignal.Found1-bitxor2forsignal.Found1-bitregisterforsignal.)Summary:inferred2D-typeflip-flop(s).沒(méi)有辦法通過(guò)調(diào)整描述次序的方法來(lái)正確建模除非引入一個(gè)臨時(shí)的變量(外注:例如引入“wiren2modulexxxxx(q3,clk,pre_n);outputq3;inputclk,pre_n;regq3,q2,q1;wiren1,n2;assignn1=q1q3;assignn2=q3;a

30、lways(posedgeclkornegedgepre_n)if(!pre_n)beginq3=1b1;q2=1b1;q1=1b1;endelsebeginq3=q2;q2=n1;q1=n2;endendmodule這樣可以得到正確的綜合結(jié)果:Found1-bitregisterforsignal.Found1-bitxor2forsignal.Found1-bitregisterforsignal.Found1-bitregisterforsignal.Summary:inferred3D-typeflip-flop(s).)??梢酝ㄟ^(guò)把所有賦值弄到一個(gè)等式的方式(one-lineequa

31、tions)來(lái)避免使用臨時(shí)變量,例如下面的例16所示。但是現(xiàn)在編碼顯得更難于理解尤其當(dāng)涉及的表達(dá)式更大更長(zhǎng)時(shí),編寫代碼和調(diào)試都變得比較困難,因此不鼓勵(lì)使用這種風(fēng)格。modulelfsrb2(q3,clk,pre_n);outputq3;inputclk,pre_n;regq3,q2,q1;always(posedgeclkornegedgepre_n)if(!pren)q3,q2,q1=3b111;CHUMAifcEREQ鄲3E旳軸CE4iWUSTRVCCfflP.elseq3,q2,q1=q2,(q”q3),q3;endmoduleExample16-Functionalbutcryptic

32、LFSRwithblockingassignments如果把例15和例16的阻塞賦值(blockingassignment)都替換為非阻塞賦值(nonblockingassignment),如下面例17和18所示,那么所有的仿真都將如我們對(duì)一個(gè)LFSR所期望的那樣。modulelfsrn1(q3,clk,pre_n);outputq3;inputclk,pre_n;regq3,q2,q1;wiren1;assignn1=q1Aq3;always(posedgeclkornegedgepre_n)if(!pre_n)beginq3=1b1;q2=1b1;q1=1b1;endelsebeginq3

33、=q2;q2=n1;q1=q3;endendmoduleExample17-FunctionalLFSRwithnonblockingassignmentsmodulelfsrn2(q3,clk,pre_n);outputq3;inputclk,pre_n;regq3,q2,q1;always(posedgeclkornegedgepre_n)if(!pre_n)q3,q2,q1=3b111;elseq3,q2,q1=q2,(q1Aq3),q3;endmoduleExample18-FunctionalbutcrypticLFSRwithnonblockingassignments根據(jù)8.0段

34、例子pipeline和10.0段例子LFSR,我們推薦對(duì)所有時(shí)序邏輯建模時(shí)使用非阻塞賦值(nonblockingassignment)。相似的分析也將顯示出對(duì)latch建模時(shí)使用非阻塞賦值(nonblockingassignment)是最安全的。#1:當(dāng)為時(shí)序邏輯建模,使用“非阻塞賦值”。#2:當(dāng)為鎖存器(latch)建模,使用“非阻塞賦值”。CHltMAERQ&IWZE$ClEMCE&UgTRYCCflP.118905.docPRELIMINARY七八零一研究所118905.docPRELIMINARY七八零一研究所btltzmailCreatedon3/30/20048:24:00PMPa

35、ge of19btltzmailCreatedon3/30/20048:24:00PMPage of1911.0組合邏輯一使用阻塞賦值(blockingassignment)用Verilog可以有很多種方法為組合邏輯建模,但是當(dāng)使用always塊來(lái)為組合邏輯建模時(shí),應(yīng)該使用阻塞賦值(blockingassignment)。如果在某個(gè)always塊里面只有一個(gè)賦值(表達(dá)),那么使用阻塞或者非阻塞賦值都可以正確工作。但是如果您對(duì)養(yǎng)成好的編碼習(xí)慣有興趣的話,還是要“總是用阻塞賦值對(duì)組合邏輯建?!?。一些設(shè)計(jì)師建議非阻塞賦值不應(yīng)該只為編寫時(shí)序邏輯,它也可以用來(lái)編寫組合邏輯。當(dāng)然對(duì)于簡(jiǎn)單的組合邏輯alwa

36、ys塊這是可以的,但是對(duì)于在一個(gè)always塊里面含有多個(gè)賦值陳述,例如例19含有and-or的陳述,使用了不含延遲(delay)的非阻塞賦值會(huì)造成仿真不正確,或者要使仿真正確您需要另外的添加敏感事件列表(sensitivitylistentries),和“多登入路徑(multiplepasses)來(lái)貫穿always塊以使得仿真正確。接下來(lái)的問(wèn)題是從仿真需要多長(zhǎng)時(shí)間來(lái)看,這是低效率的(外注:即降低仿真的performance)。例19的y輸出建立在3個(gè)依次執(zhí)行的陳述上(外注:tmpl=a&b;tmp2=c&d;y=tmpl|tmp2;)。由于非阻塞賦值的LHS變量值更新是在對(duì)RHS表達(dá)式估值之

37、后,所以tmp1和tmp2的值仍然是該always塊上一個(gè)登入口的值而不是在這一個(gè)仿真時(shí)間步(simulationtimestep)結(jié)束時(shí)被更新的值。因此y的值將受舊的tmp1和tmp2影響,而不是這次掃描過(guò)的always塊內(nèi)被更新的值。moduleao4(y,a,b,c,d);outputy;inputa,b,c,d;regy,tmp1,tmp2;always(aorborcord)begintmp1=a&b;tmp2=c&d;y=tmp1|tmp2;endendmoduleExample19-Badcombinationallogiccodingstyleusingnonblockinga

38、ssignments例20與例19是一樣的,不同之處在于tmp1和tmp2被添加到事件列表中去了。如第7段(section7.0)中所述,在“非阻塞賦值更新事件隊(duì)列”中當(dāng)非阻塞賦值更新LHS變量時(shí),always塊將會(huì)“自觸發(fā)”并使用最新的tmp1和tmp2來(lái)更新y輸出。現(xiàn)在y輸出值正確了因?yàn)樵黾邮褂昧藘蓷l“登入路徑”(twopasses)貫穿整個(gè)always塊。使用更多的“登入路徑”來(lái)貫穿always塊等于降低仿真器的性能,因此如果可以有合理的一些代碼變化可以取代這種用法的話,就盡量避免這種用法。moduleao5(y,a,b,c,d);outputy;inputa,b,c,d;regy,tm

39、p1,tmp2;always(aorborcordortmp1ortmp2)begintmp1=a&b;tmp2=c&d;y=tmp1|tmp2;endendmoduleExample20-Inefficientmulti-passcombinationallogiccodingstylewithnonblockingassignments發(fā)展一個(gè)好的習(xí)慣可以避免使用“多登入路徑(multiplepasses)貫穿always塊,即使用阻塞賦值為組合邏輯建模。moduleao2(y,a,b,c,d);outputy;inputa,b,c,d;regy,tmp1,tmp2;always(aorb

40、orcord)begintmp1=a&b;tmp2=c&d;y=tmp1|tmp2;endendmoduleExample21-Efficientcombinationallogiccodingstyleusingblockingassignments例21與例19一樣,不同之處只在于用阻塞賦值替代了非阻塞賦值。這保證了在一個(gè)“登入路徑”貫穿always后y輸出的正確(guaranteethatthey-outputassumesthecorrectvalueafteronlyonepassthroughthealwaysblock?)。因此有下面的編碼方針:#3:當(dāng)用always塊為組合邏輯

41、建模,使用“阻塞賦值”12.0時(shí)序-組合混合邏輯建模:使用非阻塞賦值很多時(shí)候?yàn)榱朔奖阄覀儼褧r(shí)序和一些簡(jiǎn)單的組合邏輯放在一起。當(dāng)我們把時(shí)序和組合編碼放在一個(gè)always塊的時(shí)候,像編寫時(shí)序邏輯一樣使用非阻塞賦值為這種混合邏輯建模,如下面的例22:modulenbex2(q,a,b,clk,rst_n);outputq;inputclk,rst_n;inputa,b;regq;always(posedgeclkornegedgerst_n)if(!rst_n)q=1b0;elseq=aAb;endmoduleExample22-Combinationalandsequentiallogicinas

42、inglealwaysblock與例22相同的邏輯也可以使用兩個(gè)分立的always塊一個(gè)是純粹的時(shí)序邏輯(使用非阻塞賦值),另一個(gè)是純粹的組合邏輯(使用阻塞賦值)建模,例如下面的例23:modulenbex1(q,a,b,clk,rst_n);outputq;inputclk,rst_n;inputa,b;regq,y;always(aorb)y=aAb;always(posedgeclkornegedgerst_n)if(!rst_n)q=1b0;elseq=y;endmoduleExample23-Combinationalandsequentiallogicseparatedintotw

43、oalwaysblocks#4:當(dāng)在同一個(gè)always塊里面既為組合邏輯又為時(shí)序邏輯建模,使用“非阻塞賦值”。13.0其它混合“阻塞”與“非阻塞”賦值建模方針Verilog允許在一個(gè)always塊里面自由混合“阻塞”與“非阻塞”賦值。一般情況下在同一個(gè)always塊里面混合“阻塞”與“非阻塞”賦值是“衰婆”風(fēng)格(poorcodingstyle,呵呵,借用電影鋼琴教師里的翻譯“衰婆”,剛好poor發(fā)音與“婆”有些相近。不過(guò)可能引起大家一陣反胃,女士們一陣痛恨向?qū)а?,可不要向我?,盡管Verilog允許這樣做。下面的例24的仿真和綜合都將是正確的,因?yàn)椤白枞迸c“非阻塞”賦值不是針對(duì)同一個(gè)變量來(lái)

44、的。盡管這可以“正常工作”,但是作者不推薦這種風(fēng)格。moduleba_nba2(q,a,b,clk,rst_n);outputq;inputa,b,rst_n;inputclk;regq;always(posedgeclkornegedgerst_n)begin:ffregtmp;if(!rst_n)q=1b0;elsebegintmp=a&b;q=tmp;endendendmoduleExample24-Blockingandnonblockingassignmentinthesamealwaysblock-generallyabadidea!下面的例25在大多數(shù)情況下仿真是正確的,但是新思

45、(Synopsys)工具會(huì)報(bào)告語(yǔ)法錯(cuò)誤因?yàn)獒槍?duì)同一個(gè)既進(jìn)行了“阻塞賦值”又進(jìn)行了“非阻塞賦值”。這樣的編碼必須進(jìn)行修改才可以綜合。(Error:Cannotmixblockingandnonblockingassignmentsonsignal.)moduleba_nba6(q,a,b,clk,rst_n);outputq;inputa,b,rst_n;inputclk;regq,tmp;always(posedgeclkornegedgerst_n)if(!rst_n)q=1b0;/blockingassignmenttoqelsebegintmp=a&b;q=tmp;/nonblockin

46、gassignmenttoqendendmoduleExample25-Synthesissyntaxerror-blockingandnonblockingassignmenttothesamevariable為了養(yǎng)成好的編寫習(xí)慣,作者推薦始終堅(jiān)持:#5:不要在同一個(gè)always塊里面混合使用“阻塞賦值”和“非阻塞賦值”。14.0對(duì)同一變量多處賦值(Multipleassignmentstothesamevariable)對(duì)同一變量在二個(gè)以上(包括二個(gè))always塊里面進(jìn)行賦值就是一種Verilog競(jìng)爭(zhēng)生成環(huán)境即使使用非阻塞賦值。在下面例26里,二個(gè)always塊對(duì)q進(jìn)行賦值,同時(shí)使用非阻

47、塞賦值。因?yàn)檫@些always塊可以以同一次序安排執(zhí)行,仿真輸出呈競(jìng)爭(zhēng)條件。modulebadcode1(q,d1,d2,clk,rst_n);outputq;inputd1,d2,clk,rst_n;regq;always(posedgeclkornegedgerst_n)if(!rst_n)q=1b0;elseq=d1;always(posedgeclkornegedgerst_n)if(!rst_n)q=1b0;elseq=d2;endmoduleExample26-Raceconditioncodingstyleusingnonblockingassignments當(dāng)新思(Synopsy

48、s)工具讀這段編碼時(shí),會(huì)產(chǎn)生如下警告:Warning:Indesignbadcode1,thereis1multiple-drivernetwithunknownwired-logictype.當(dāng)忽略這個(gè)警告并編譯上面的例子時(shí),推斷結(jié)果是二個(gè)觸發(fā)器的輸出將作為一個(gè)and門的輸入。在這個(gè)例子里綜合前(pre-synthesis)仿真結(jié)果與綜合后(post-synthesis)仿真結(jié)果不匹配。#6:不要在兩個(gè)或兩個(gè)以上always塊里面對(duì)同一個(gè)變量進(jìn)行賦值。15.0常見(jiàn)的“非阻塞”神話(外注:指與事實(shí)不符或嚴(yán)格說(shuō)不正確的見(jiàn)解、想法)15.1非阻塞賦值和$display神話:“對(duì)非阻塞賦值使用$di

49、splay命令不起作用。”事實(shí):非阻塞賦值在$display命令之后才被更新賦值。moduledisplay_cmds;rega;initial$monitor($monitor:a=%b,a);initialbegin$strobe($strobe:a=%b,a);a=0;a=1;$display($display:a=%b,a);#1$finish;endendmodule下面的仿真輸出結(jié)果顯示出$display命令在“激活事件列”(theactiveeventqueue)里被執(zhí)行的情形:在“非阻塞賦值更新”這個(gè)事件被執(zhí)行之前。$display:a=0$monitor:a=1$strobe

50、:a=115.2賦“零延遲”神話:“零延遲#0使得該賦值事件在時(shí)間步結(jié)束時(shí)發(fā)生”事實(shí):零延遲#0使得賦值事件處于“非激活事件列”modulenb_schedule1;rega,b;initialbegina=0;b=1;a=b;b=a;$monitor(%0dns:$monitor:a=%bb=%b,$stime,a,b);$display(%0dns:$display:a=%bb=%b,$stime,a,b);$strobe(%0dns:$strobe:a=%bb=%bn,$stime,a,b);#0$display(%0dns:#0:a=%bb=%b,$stime,a,b);#1$moni

51、tor(%0dns:$monitor:a=%bb=%b,$stime,a,b);$display(%0dns:$display:a=%bb=%b,$stime,a,b);$strobe(%0dns:$strobe:a=%bb=%bn,$stime,a,b);$display(%0dns:#0:a=%bb=%b,$stime,a,b);#1$finish;endendmodule下面的仿真輸出結(jié)果顯示出$display命令在“非激活事件列”(theinactiveeventqueue)里被執(zhí)行的情形:在“非阻塞賦值更新”這個(gè)事件被執(zhí)行之前。0ns:$display:a=0b=10ns:#0:a=0b=10ns:$monitor:a=1b=00ns:$strobe:a=1b=01ns:$display:a=1b=01ns:#0:a=1b=01ns:$monitor:a=1b=01ns:$strobe:a=1b=0#7:使用$str

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論