簡單來說,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
沒有留言:
張貼留言