在 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
我想执行一项任务,并行检查下面评论的两个语句之一,并且不会中断后面程序的执行: 任务检查是否已生成 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