爲什麼我會得到如下所示的結果?我期望多次觸發update_ev事件應該會導致顯示「Main Loop,..」被執行兩次。但它只執行一次。Systemverilog - 多個進程觸發相同的事件
program multiple_trigger();
initial begin
event update_ev;
bit orResult, prev_orResult, A, B;
// Multiple trigg logic
fork
begin : threadDisplay
forever begin
prev_orResult = orResult;
// Update status
@(update_ev);
// Compute A OR B
orResult = A | B;
$display("\n Main Loop , %0t A=%0b, B=%0b orResult=%0b",$time(), A, B, orResult);
if (prev_orResult != orResult) begin
$display("\n In the IF condition, %0t A=%0b, B=%0b orResult=%0b",$time(), A, B, orResult);
end
end // forever
end : threadDisplay
// 10 A=0
begin : threadA
#10;
A = 1'b0;
->update_ev;
end : threadA
// 10 B=1'b1
begin : threadB
#10;
B = 1'b1;
->update_ev;
end : threadB
join_none
#100;
end
endprogram
// Actual Result----------------------------------------
Main Loop , 10 A=0, B=1 orResult=1
In the IF condition , 10 A=0, B=1 orResult=1
//-----------------------------------------------------
// Expected Result----------------------------------------
Main Loop , 10 A=0, B=0 orResult=0
Main Loop , 10 A=0, B=1 orResult=1
In the IF condition , 10 A=0, B=1 orResult=1
// -------------------------------------------------------
HI Greg,謝謝你的回覆。我打算在我的驗證環境中使用它。假設解決多個進程(thread_A,thread_B ....)的目的,試圖通知一個聽力進程(disp_thread)關於共享變量的一些變化。聽證過程應該決定,與線程執行的順序無關,最終結果與前一個結果相同或不同。你認爲 - >>應該解決目的嗎? –
' - >>'應該在這種情況下工作。另一個選擇是在@(update_ev)之後放一點點延遲;假設是否有一點延遲是可以接受的。 – Greg
我永遠不會建議在測試臺中放一點點延遲。一旦你開始在整個地方推遲延遲來定義排序,你可以結束事情變得難以管理。 –