專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

關于verilog阻塞賦值與非阻塞賦值的一些淺見

作者:未知   來源:傲嬌的放牛娃   點擊數(shù):  更新時間:2014年06月08日   【字體:

最近學到了關于verilog的阻塞賦值與非阻塞賦值的一些區(qū)別,經過網上查閱與仿真實驗,有了一些理解。希望能夠記下來。

 

說到verilog的阻塞與非阻塞賦值,不得不說的就是verilog的事件表,如下:

阻塞賦值,屬于活躍事件,計算完RHS(Right Hand Side)立即更新左值。期間同一塊內其他語句不能執(zhí)行,即阻塞其他語句執(zhí)行。

而非阻塞右值計算屬于活躍事件,非阻塞左值更新屬于非活躍事件,即計算完RHS,不能立即更新左值,而要等所有活躍事件完成,才能完成左值更新,出事件隊列。


然后說說$display$strobe

顯示任務($display)在執(zhí)行到該語句時立即執(zhí)行顯示

選通任務($strobe)要推遲到事件列表當前時階結束時進行。

 

$strobe
當該時刻的所有事件處理完后,在這個時間步的結尾打印一行格式化的文本,
規(guī)則
這些系統(tǒng)任務的變量的語法幾乎和$display 任務一樣

但是$strobe 被調用時,在該塊中所有活動都完成了,$strobe 才打印文本,這包括所有阻塞性和非阻塞性賦值的作用

提示
在寫仿真結果時請盡量使用$strobe 少用$display $write
舉例
initial
begin
x = 1'b0;
$display("x1=%d",x);        
$strobe("x2=%d",x);           
x = 1'b1;                   

end

最后顯示 x1=0;x2=1;


(1)

(若無延時,計算完所有RHS,同步更新到RLS,加了延時,

并且此時延時在最前邊,表示計算右值與賦值都被延時)

#50延時,clk上升沿,

#100延時,RHS_a ->a

#50 RHS_b -> b 

#50 RHS_c ,$display, RHS_c -> c;


打印結果:

 

波形結果:

 

(2)

(此時延時,指的是輸入與輸出間的延時)

#50延時,clk上升沿RHS_a,RHS_b,RHS_c, $display

#50延時,RHS_b->b,RHS_c->c

 

#50延時,(另一個clk上升沿)$display  RHS_a->a


打印結果:

 

波形結果:

 

(3)

#50延時,clk上升沿

#100延時,RHS_a->a

#50延時,RHS_b->b

#50延時,RHS_c->c,$display


打印結果:

 

波形結果:

 

(4)

#50 lk上升沿

RHS_a  #100延時  RHS_a->a

RHS_b  #50延時  RHS_b->b

RHS_c  #50延時  RHS_c->c,$display


打印結果:

 

波形結果:

 

因此,將begin-end改為fork-join,系統(tǒng)運行結果如下;


(1)

打印結果:

 

波形結果:


(2)

打印結果:


波形結果:

 

(3)

打印結果:


波形結果:

 

(4)

打印結果:


波形結果:

 

其實$display的執(zhí)行時間與仿真器有關,硬件上,$display的運行時間與并行的程序的相對時間是不確定的,而仿真器則設置了固定的開始時間。


本文只是個人的一點薄見,希望能夠拋磚引玉,愿各位高手不吝賜教。轉載請說明。

關閉窗口

相關文章