System verilog fork..加入SystemVerilog
我正在尝试使用fork..join实现req##[3:5]ack。我能够为req##[5]ack运行逻辑。但我无法运行请求确认 我正在尝试-System verilog fork..加入SystemVerilog,system-verilog,fork-join,System Verilog,Fork Join,我正在尝试使用fork..join实现req##[3:5]ack。我能够为req##[5]ack运行逻辑。但我无法运行请求确认 我正在尝试- wait(req) fork:check_ack begin wait(ack) $display("Ack passed"); end begin repeat(5) @(posedge clk); $display(
wait(req)
fork:check_ack
begin
wait(ack)
$display("Ack passed");
end
begin
repeat(5)
@(posedge clk);
$display("Ack failed");
end
begin
repeat(3)
@(posedge clk);
$display("Ack failed");
end
join_any
disable check_ack;
我还需要在3个周期后继续检查。您需要创建一个状态位,以指示何时在范围内
bit in_range;
@(posedge clk iff req);
fork
begin
in_range = 0;
@(posedge clk iff ack) if (in_range) $display("passes");
else $display("fails");
end
begin
repeat(3) @(posedge clk) ;
in_range <='1;
wait(0);
end
begin
repeat(5) @(posedge clk);
$display("fails");
end
join_any
disable fork;
_范围内的位;
@(posedge时钟iff请求);
叉
开始
在_范围内=0;
@(posedge clk iff ack)如果(在_范围内)$显示(“通过”);
else$显示(“失败”);
结束
开始
重复(3)@(posedge clk);
在_range中,您需要创建一个状态位,指示您何时在该范围内
bit in_range;
@(posedge clk iff req);
fork
begin
in_range = 0;
@(posedge clk iff ack) if (in_range) $display("passes");
else $display("fails");
end
begin
repeat(3) @(posedge clk) ;
in_range <='1;
wait(0);
end
begin
repeat(5) @(posedge clk);
$display("fails");
end
join_any
disable fork;
_范围内的位;
@(posedge时钟iff请求);
叉
开始
在_范围内=0;
@(posedge clk iff ack)如果(在_范围内)$显示(“通过”);
else$显示(“失败”);
结束
开始
重复(3)@(posedge clk);
在范围内谢谢@dave_59,它很有效。但是,我尝试使用嵌套的fork..join.You没有任何意义。这是第一次提到任何嵌套是的,尝试这样的断言没有任何意义,但我被赋予了尝试使用fork-join的任务。谢谢@dave_59,它很有效。但是,我尝试使用嵌套的fork..join.You没有任何意义。这是第一次提到任何嵌套是的,尝试这样的断言没有任何意义,但我的任务是尝试使用fork-join。这是一个断言,为什么不为此使用sva?@Serge是的,这是一个断言。我的任务是尝试使用嵌套fork..join.实际上,您的断言req##[3:5]ack
没有多大意义。这意味着在req之后“req”必须为真,ack必须为真(尽管它可以开始3到5个周期)。我猜你想要的是像req |->#[3:5]ack
或者甚至像$rose(req)|->#-…
你能证实你的确切意图吗?@Serge是的意图是生成req |->#[3:5]ack这是一个复杂的案例。我认为用传统的verilog无法真正解决这个问题。理论上实现断言的方式是,它为每个时钟边缘启动3个线程,而'req'较高,具有相应的延迟,如果其中任何一个线程失败,则会失败。听起来好像verilog中不存在动态线程。您需要转到svtb端,或者在“c/c++”中执行。只跟踪“req”的posedge会更容易。这是一个断言,为什么不使用sva呢?@Serge是的,这是一个断言。我的任务是尝试使用嵌套fork..join.实际上,您的断言req##[3:5]ack
没有多大意义。这意味着在req之后“req”必须为真,ack必须为真(尽管它可以开始3到5个周期)。我猜你想要的是像req |->#[3:5]ack
或者甚至像$rose(req)|->#-…
你能证实你的确切意图吗?@Serge是的意图是生成req |->#[3:5]ack这是一个复杂的案例。我认为用传统的verilog无法真正解决这个问题。理论上实现断言的方式是,它为每个时钟边缘启动3个线程,而'req'较高,具有相应的延迟,如果其中任何一个线程失败,则会失败。听起来好像verilog中不存在动态线程。您需要转到svtb端,或者在“c/c++”中执行。只跟踪“req”的posedge会更容易