pretty code

2024年8月11日 星期日

Verilog race condition example

在 IEEE Std 1364-2005 Section 11 提到 Event simulation 和 stratified event queue 等概念,雖然只有 4 頁,但卻很難用自己的話來闡述它。

簡單來說,event 在執行時,會將其加到 event queue 並分為 5 大區塊,只有放到 active event region 的 event 才會被移出,其它 region 則是會隨時機移到 active event queue。

由於 simulation 是用軟體模擬,不像硬體電路可以並行,故在執行上會有先後之分,因此這章節會定義哪些 execution event 其執行順序是確定的,哪些又不是。

因此我們要注意撰寫 Verilog code 以避免 race condtion 發生。

下面是一個簡單的例子可以看出隨著調整不同區塊的位置,其模擬結果也會不同。

flag = 1

0: initial1 d = 0
0: initial2 d = 0
0: always1 d = 0
0: always2 d = 0

flag = 0

0: initial1 d = x
0: initial2 d = x
0: always1 d = 1
0: always2 d = 1

`timescale 1ns/1ns
`define flag 0

module test();
    reg d;
    
    initial begin
        if (`flag)
            d = 0;
    end
    
    initial begin
        $display("%t: initial1 d = %d", $time, d);
    end
    
    always @(*) begin
        $display("%t: always1 d = %d", $time, d);
    end
    
    always @(*) begin
        $display("%t: always2 d = %d", $time, d);
    end
    
    initial begin
        $display("%t: initial2 d = %d", $time, d);
    end
    
    initial begin
        if (!`flag)
            d = 1;
    end
endmodule

沒有留言: