Verilog相当于"等到......为......"?

Mou*_*tix 9 verilog vhdl

在Verilog测试平台中,我试图编写以下行为:

具有以下行为(提醒):

  • 事件发生;
  • 或持续时间到期.

除非我弄错了,我在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中这样做不是一个选项... ;-)

dwi*_*kle 5

要在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)