在 Verilog 中使用 Fork-Join

Use of Fork-Join in Verilog

我想执行一项任务,并行检查下面评论的两个语句之一,并且不会中断后面程序的执行: 任务检查是否已生成 startTx。它必须等待 startTx 信号 5 个时钟周期。如果 startTx 被断言,它会打印一条成功的消息。如果不是(超时后),它会打印一条错误消息并增加错误计数器。

到目前为止我所做的是:

    task checkStart;
      begin
      fork
    // evento 1
        begin
          waitCycles(5); // timeOut
          $display("[Error! %t] Time Out has been reached", $time);
          errors = errors + 1;
        end
    // evento 2
        begin 
          @(posedge(startTx))
          $display("[Info] startTx has been generated successfully"); 
        end
      join
      disable fork; 
      end
    endtask

但似乎没有工作,因为它显然会检查两个语句是否为真,我希望 SystemVerilog 中的 'join_any' 能够在两个语句之一为真时中断。

这无需使用 SystemVerilog join_any。注释 startTx 或取消注释以查看发生的两种情况。

module tb ();

  bit SIGNAL;
  bit startTx;

  int errors;
  
  task checkStart;
    fork
      // evento 1
      begin  : timeout
      #500; // timeOut
      $display("[Error! %t] Time Out has been reached", $time);
      errors = errors + 1;
      $finish;
      end
    // evento 2
    begin  :wait_for_signal
      @(posedge(startTx))
      $display("[Info] startTx has been generated successfully"); 
      disable timeout;
    end
     //
    join
    //  
    $display("+++++ Finished checkStart ++++++");
  endtask  
        
initial
 begin
   checkStart();
    // Do something else
    #20;
    $display("**** normal finish ****");
    $finish;   
 end
  
initial
  begin
    #1;
    // coment one of these at a time
    //startTx = 1;
    startTx = 0;
  end

endmodule