前不久一位朋友發(fā)來一道驗證題,雖然題目不是很復(fù)雜,但是琢磨了下感覺其中需要掌握的內(nèi)容還是很多的,正所謂麻雀雖小五臟俱全。下面將對此題涉及的一些內(nèi)容進行挖掘和示例,與大家分享下。
【問題描述】
如下一段Verilog代碼,請根據(jù)代碼的描述,并結(jié)合已知的clk和rst的波形圖,畫出對應(yīng)信號的波形。
通過仿真工具得到對應(yīng)的仿真波形如下。
【仿真波形】
【知識點挖掘】
0.reg和wire都采用的四值邏輯
reg變量在未進行賦值時,其默認(rèn)值為x,wire默認(rèn)為z,上圖中cnt_nxt之所以仿真開始時為不定態(tài),主要是因為它是由cnt進行運算后得到的,而cnt剛開始就是個x。
1.變量和線網(wǎng)聲明時初始化
線網(wǎng)在聲明的同時進行賦值操作實際上完成的是一種隱含的連續(xù)賦值操作(implicit continuous assignment),即相當(dāng)于該線網(wǎng)從聲明的時候就開始采用了連續(xù)賦值操作,此時如果有其他對于該線網(wǎng)的賦值操作,將會導(dǎo)致多驅(qū)動;與之相對應(yīng)的是變量在聲明時的初始化,實際上僅僅完成了對于該變量真正的初始化操作,后續(xù)對該變量的賦值操作將會覆蓋聲明時初始化的值。
示例詳見《硅芯思見:【173】隱藏的初始化》
2.縮減操作符
操作符 | 作用 |
&(縮減與) | 操作數(shù)中只要有任意一位的值為0,則操作的結(jié)果就為0;操作數(shù)中只要有任意一位的值為x或者z,則操作的結(jié)果就為x;否則結(jié)果為1 |
~&(縮減與非) | 上述結(jié)果取反即可 |
|(縮減或) | 操作數(shù)中只要有任意一位的值為1,則操作的結(jié)果就為1;操作數(shù)中只要有任意一位的值為x或者z,則操作的結(jié)果就為x;否則結(jié)果為0 |
~|(縮減或非) | 上述結(jié)果取反即可 |
^(縮減異或) | 操作數(shù)中只要有任意一位的值為x或者z,則操作的結(jié)果就為x;若操作數(shù)中有偶數(shù)個1,則操作結(jié)果為0;否則其操作結(jié)果為1 |
~^(縮減同或) | 上述結(jié)果取反即可 |
3.阻塞賦值與非阻塞賦值區(qū)別
詳見《Verilog系列:【17】阻塞賦值與非阻塞賦值》
阻塞賦值(blocking assignment) | 非阻塞賦值(non-blocking assignment) |
格式:“LHS”=“RHS” | 格式:“LHS”<= “RHS” |
阻塞賦值RHS會延遲指定延遲(如果沒有指定就是0延遲,如果指定了非零延遲,那么就延遲非零延遲,關(guān)于延遲位置不同結(jié)果不同可參見topic“阻塞賦值中的延遲”)后立即更新至LHS | 非阻塞賦值LHS會在當(dāng)前仿真時間槽(time-slot)最后被更新,即RHS變化后不會立即反應(yīng)在LHS上 |
當(dāng)多條阻塞賦值語句順序出現(xiàn)在同一個進程中時,所有的語句按順序執(zhí)行,即后續(xù)的語句必須在當(dāng)前賦值操作完成后才能進行 | 同一個進程中的非阻塞賦值在同一個時間槽中是同時執(zhí)行的,即不會互相阻塞 |
建議在組合邏輯的結(jié)構(gòu)中使用 | 建議在時序邏輯進程中使用 |
可以在過程性賦值和連續(xù)性賦值中使用 | 建議在時序進程中使用 |
當(dāng)阻塞賦值中的變量同時出現(xiàn)在不同的進程中時,可能會出現(xiàn)競爭的情況 | 非阻塞賦值LHS更新在仿真時間槽的最后,可以在一定程度上避免競爭的出現(xiàn) |
【示例】 initial begin temp_1 = #5 2'b10; temp_2 = #1 2'b01; end 從仿真0時刻開始,temp_1在時刻5被賦值為2'b10,temp_2在時刻6(5+1)被賦值為2'b01,即temp_2更新發(fā)生在temp_1之后,即兩次賦值有先后順序 |
【示例】 initial begin temp_1 <= #5 2'b10; temp_2 <= #1 2'b01; end 從仿真0時刻開始,temp_1在時刻5被賦值為2'b10,temp_2在時刻1被賦值為2'b01,即temp_2更新發(fā)生在temp_1之前,即兩次賦值從同一時刻同時開始 |
4.+:和-:位選操作
如果base_expr和width_expr經(jīng)過位選后超過d本身的位寬,那么讀取超出部分將獲得不定態(tài)表示。其中base_expr是可以在仿真運行過程中按照需要變化的,但是width_expr是必須是確定的。
【示例】
【仿真結(jié)果】
5.wire和reg分別在什么時候使用
wire常用于連續(xù)賦值語句(連續(xù)賦值語句左側(cè)信號)、模塊端口(input、output、inout,其中注意output默認(rèn)為wire),reg常用于過程性賦值語句(當(dāng)然也可以位于連續(xù)賦值語句的右側(cè)),關(guān)于連續(xù)賦值語句和過程性賦值語句的關(guān)系可以參看《Verilog系列:【32】Verilog中的幾種賦值語句》
6.異步復(fù)位、同步復(fù)位和異步復(fù)位同步撤銷
復(fù)位主要用于將數(shù)字電路中的觸發(fā)器置為一個確定的初始值上,例如可以是狀態(tài)機工作于初始狀態(tài)。而觸發(fā)器一般情況下分為兩種:一種是有復(fù)位引腳的,一種是沒有復(fù)位引腳的,帶有復(fù)位的觸發(fā)器占用的面積比沒有復(fù)位引腳的觸發(fā)器大一些。一般情況下,處于數(shù)據(jù)路徑上的觸發(fā)器的初始值無關(guān)緊要,此時可以使用不帶復(fù)位引腳的觸發(fā)器,以降低芯片的面積。兩者之間的優(yōu)缺點如下。
【同步復(fù)位】
l抗干擾性強,可以容忍一定的毛刺,但是前提是這個毛刺不要出現(xiàn)在setup和hold違例區(qū)間;
l利于后端人員進行STA分析;
l觸發(fā)器的復(fù)位信號完全同步于時鐘源,確保時鐘和復(fù)位作用下的邏輯電路的一致性;
l復(fù)位信號要確保大于時鐘周期,避免沒有被采樣到;
l因為觸發(fā)器本身不帶復(fù)位引腳,綜合后會增加很多其他的邏輯資源;
l如果時鐘信號出現(xiàn)問題,可能會影響到復(fù)位;
【異步復(fù)位】
相較于同步復(fù)位,異步復(fù)位有以下特點。
l復(fù)位信號不依賴于時鐘;
l大多數(shù)庫提供的觸發(fā)器都是自帶異步復(fù)位的觸發(fā)器;
l異步復(fù)位不管產(chǎn)生或撤銷復(fù)位信號,都是一個異步過程,但是撤銷時就出現(xiàn)了問題,如果異步復(fù)位在觸發(fā)器時鐘有效沿附近釋放,觸發(fā)器的輸出就會進入亞穩(wěn)態(tài),因此導(dǎo)致復(fù)位狀態(tài)丟失;
l毛刺容易對電路造成干擾,導(dǎo)致不期望的復(fù)位產(chǎn)生;
l異步復(fù)位需要滿足時序要求(recover time、remove time,類似于setup和hold);
為了綜合兩種復(fù)位的優(yōu)缺點,提出了一種異步復(fù)位同步釋放的方式,就是指在復(fù)位信號到來的時候不受時鐘信號的同步,而是在復(fù)位信號釋放的時候受到時鐘信號的同步,即用一個同步器來將異步復(fù)位信號轉(zhuǎn)換為同步的復(fù)位信號,從而確保復(fù)位操作的可控性和穩(wěn)定性。。其典型結(jié)構(gòu)圖如下。
其操作過程如下為當(dāng)復(fù)位信號rst_async_n有效時,第一個D觸發(fā)器的輸出是低電平,第二個D觸發(fā)器的輸出rst_sync_n也為低電平,此時驅(qū)動后級方框中的異步復(fù)位端口有效,其輸出被復(fù)位。復(fù)位撤銷時,rst_async_n經(jīng)過兩級觸發(fā)器同步后得到的rst_sync_n是與時鐘同步的,從而可以實現(xiàn)復(fù)位的同步撤銷。假設(shè)rst_async_n在clk的上升沿時撤除,那么第一個大黃框中的第一級觸發(fā)器處于亞穩(wěn)態(tài),但是由于兩級觸發(fā)器的同步作用,第二級觸發(fā)器的輸入為clk到來前第一級觸發(fā)器的輸出,即為低電平。因此,此時第二級觸發(fā)器的輸出一定是穩(wěn)定的低電平,方框左中觸發(fā)器此時還處于復(fù)位狀態(tài)。在第二個clk到來時,第一級觸發(fā)器的輸出已經(jīng)是穩(wěn)定的高電平了,故rst_sync_n已經(jīng)是穩(wěn)定的高電平,此時復(fù)位釋放,也就是同步釋放。
7.~和!區(qū)別
首先條件判斷語句根據(jù)根據(jù)判斷其關(guān)鍵字后的條件判斷表達(dá)式結(jié)果的真假(非零的結(jié)果被認(rèn)為"真",零的結(jié)果對應(yīng)為"假")來選擇不同的條件分支,即可以將條件表達(dá)式分為兩步來實現(xiàn):第一步計算條件表達(dá)式,第二步判斷條件表達(dá)式結(jié)果;其次,在Verilog中"!"的意思為邏輯非,"~"為按位操作符, "!"主要是對操作數(shù)進行邏輯非操作,其預(yù)算結(jié)果只能為"0"(假)或者"1"(真),"~"主要是對操作數(shù)進行按位運算,即對操作數(shù)的每一位進行取反操作.但是這里需要注意的是對于一位數(shù)據(jù)來說,兩種操作的結(jié)果是一樣的,但是如果操作數(shù)為多位數(shù)據(jù),那么兩個操作的運算結(jié)果將會不一樣.使用邏輯操作符"!",在進行位運算時使用按位運算符"
【示例】
【仿真結(jié)果】
從上例仿真結(jié)果可以觀測到,代碼10行沒有執(zhí)行,13行執(zhí)行。代碼中9行的條件判斷語句"if(!sig_1)"中的"!sig_1"計算結(jié)果為"0",條件表達(dá)式對應(yīng)的分支不會執(zhí)行,所以仿真過程中并沒有顯示對應(yīng)的消息;12行的"if(~sig_2)"中的"~sig_2"計算結(jié)果為"2'b10",為非零值,即條件表達(dá)式判斷的條件為真,所以對應(yīng)的分支被有效執(zhí)行;17和20行兩個條件表達(dá)式都為真,所以對應(yīng)的分支都被有效執(zhí)行,但是這時需要注意兩個條件表達(dá)式的具體計算結(jié)果并不相同,17行"!sig_1"計算結(jié)果為"1",而20行"~sig_2"計算結(jié)果為"2'b11",兩者的相同點是均為非零值,所以對于條件語句來說都是為真的條件,所以對應(yīng)的分支會被執(zhí)行.在具體使用這兩種操作符的時候,一般情況下推薦進行邏輯判斷時~"。
審核編輯:湯梓紅
-
仿真
+關(guān)注
關(guān)注
50文章
4124瀏覽量
134001 -
信號
+關(guān)注
關(guān)注
11文章
2807瀏覽量
77116 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110397 -
波形圖
+關(guān)注
關(guān)注
1文章
34瀏覽量
14973 -
代碼
+關(guān)注
關(guān)注
30文章
4828瀏覽量
69058
原文標(biāo)題:一道設(shè)計&驗證“麻雀”題
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Xilinx FPGA異步復(fù)位同步釋放—同步后的復(fù)位該當(dāng)作同步復(fù)位還是異步復(fù)位?
![Xilinx FPGA<b class='flag-5'>異步</b><b class='flag-5'>復(fù)位</b><b class='flag-5'>同步</b>釋放—<b class='flag-5'>同步</b>后的<b class='flag-5'>復(fù)位</b>該當(dāng)作<b class='flag-5'>同步</b><b class='flag-5'>復(fù)位</b>還是<b class='flag-5'>異步</b><b class='flag-5'>復(fù)位</b>?](https://file1.elecfans.com/web2/M00/8A/6C/wKgaomSSWS2AWl4kAAIkep_63Wk290.jpg)
同步復(fù)位和異步復(fù)位有什么聯(lián)系與區(qū)別,優(yōu)缺點!
![<b class='flag-5'>同步</b><b class='flag-5'>復(fù)位</b>和<b class='flag-5'>異步</b><b class='flag-5'>復(fù)位</b>有什么聯(lián)系與<b class='flag-5'>區(qū)別</b>,優(yōu)缺點!](https://file1.elecfans.com//web2/M00/A6/FC/wKgZomUMQaOAR_59AAAXHavQwHk241.png)
如何區(qū)分同步復(fù)位和異步復(fù)位?
Xilinx FPGA的同步復(fù)位和異步復(fù)位
IEEE Verilog阻塞賦值和非阻塞賦值的區(qū)別
![IEEE Verilog<b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>的<b class='flag-5'>區(qū)別</b>](https://file.elecfans.com/web1/M00/BE/C9/o4YBAF7plAWARRatAACAOGjDFj8064.png)
評論