2023年12月25日 星期一

Verilog 非阻塞賦值

雖然知道這個概念,但每次看 wave 時都會中招XD

reg [3:0] a = 1,  b = 0;
always @(posedge clk) begin
    if (a != 0) 
        a <= a + 1    
end

always @(posedge clk) begin
    if (a == 1)
        b <=  1
end

假設兩個 always block 第一次 if 那個時間點是 10 ns,在此當下 a = 1, b = 0,因為電路是並行緣故。

但因為 wave 在此點後都會顯示新的值,故常會認為該點也是新的值!

我想我還需要一點時間來習慣,這個非流水線乘法器是個不錯的例子,忘記可以回來複習。

另外,關於如何在白紙上計算驗證也是我現在頭痛的問題,寫的真亂。


65 ns 時,因為 data_rdy = 1,故會進到 cnt 與 cnt_temp 互相作用的那個 always block,但因為電路並行,故 cnt_temp 值還未反映到 cnt,因此 mult1 和 mult2 那個 always block if 判斷都要看非阻塞賦值前的值,同理兩個 shift 變數也要以非阻塞賦值前的值來做計算。

沒有留言:

張貼留言