在Verilog测试平台中,我试图编写以下行为:
等到事件发生(上升/下降沿)最长时间,即等效的VHDL指令:
wait until <event> for <duration>;
Run Code Online (Sandbox Code Playgroud)具有以下行为(提醒):
除非我弄错了,我在Verilog中找不到任何直接等效的函数...所以我尝试了以下代码:
reg watchdog;
// ...
// Set a signal 'watchdog' in background which will be triggered in 10 us.
fork
watchdog <= #10_000 1'b1;
join
// Wait until SIGNAL is set to '1' *OR* watchdog event occurs.
@(posedge SIGNAL or posedge watchdog);
// Reset the watchdog
watchdog <= 1'b0;
Run Code Online (Sandbox Code Playgroud)
此代码完成工作,但最后一条指令不取消或取代fork指令.因此,在第二次调用此代码时(例如watchdog <= #50_000 1'b1;),watchdog可能会触发第一次(很快就会发生).
有什么好主意吗?(取消第一次计划的等效或方式fork?)
PS:在SystemVerilog中这样做不是一个选项... ;-)
要在Verilog中执行此操作,您需要使用disable。我建议watchdog完全消除信号,只使用一个的两个分支fork。
下面是一个工作示例。请注意,disable f如果该分支成功,那么分支的每个分支都会调用。禁用fork将终止未成功的分支。
module top;
reg signal;
task test();
fork : f
begin
// Timeout check
#10
$display("%t : timeout", $time);
disable f;
end
begin
// Wait on signal
@(posedge signal);
$display("%t : posedge signal", $time);
disable f;
end
join
endtask
initial begin
// test signal before timeout
fork
test;
begin
signal = 0;
#5;
signal = 1;
#5;
signal = 0;
#10;
end
join
// test signal after timeout
fork
test;
begin
signal = 0;
#15;
signal = 1;
#5;
end
join
end
Run Code Online (Sandbox Code Playgroud)