System verilog fork..加入SystemVerilog

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(

我正在尝试使用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("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会更容易