来自 SV 等待语句的跨模块引用解析错误

Cross-module reference resolution error from SV wait statement

我想等待任务的输出变量。
例如:wait(user_defined_task_name(output_variable_type_name) == 1)

在下面显示的这个例子中,我的目的是使 wait 语句在 0ns 到 3ns 之间处于活动状态(基本上是从时间戳开始到 t2=1)

这是一个工作示例;

class cl;
  task run(output bit t);
    $display("time=%0t , t=%0b",$realtime, t); 
    #1;
    $display("time=%0t , t=%0b",$realtime, t); 
    #2;
    t = 1;
    $display("time=%0t , t=%0b",$realtime, t); 
  endtask
endclass

class c2 extends cl;
  bit t2;
  task run1();
    wait(run(t2) == 1); // error from this line, what am i violating here?
    $display("t2 working t2=%0b time = %0t", t2, $realtime);
     
  endtask
endclass

module tmp;
  c2 c2_h=new;
  initial begin 
    c2_h.run1();
    $display("test msg");
  end
endmodule

eda输出日志:

Top Level Modules: tmp TimeScale is 1 ns / 1 ns

Error-[XMREF] Cross-module reference resolution error testbench.sv, 19 Cross-module reference resolution error is found. Function is expected, but actual target is not a function. Source info: run(this.t2)

1 error CPU time: .116 seconds to compile Exit code expected: 0, received: 1

当我在 Cadence 模拟器上 运行 你的代码时,我收到不同的消息:

xmvlog: *E,INVCTX The task 'run' cannot be used in this context.

使用 nchelp 实用程序获取有关该消息的更多信息:

A task or void function cannot be passed as an actual argument because they do not return a value that can be used. They also cannot be used as part of an expression.

在你的简单示例中,似乎没有必要使用wait。您可以简单地自行调用任务:

  task run1();
    run(t2);
    $display("t2 working t2=%0b time = %0t", t2, $realtime);     
  endtask

您的代码有几个问题。 task 不是 return 值,不能在表达式中使用。您只能将其称为独立声明。但是如果你把run改成function函数就不能消耗时间了。

在您的特定示例中,直到任务结束才更改 t 参数的值,并且 output 参数在退出任务时被复制出来,因此您可能好吧,只需将任务 run(t2) 称为语句,它将阻塞直到 returning.

task run1();
    run(t2);
    $display("t2 working t2=%0b time = %0t", t2, $realtime);     
endtask

另一方面,如果 run 在任务中间某处设置了 t 参数,并且您想在发生这种情况后立即继续 run1 任务,那么您本来可以使用 fork/join_noneref 参数。

class cl;
  task run(ref bit t);
    $display("time=%0t , t=%0b",$realtime, t); 
    #1;
    $display("time=%0t , t=%0b",$realtime, t); 
    #2;
    t = 1;
    #2;
    $display("time=%0t , t=%0b",$realtime, t); 
  endtask
endclass

class c2 extends cl;
  bit t2;
  task run1();
    fork
      run(t2);
    join_none
    wait(t2 == 1);
    $display("t2 working t2=%0b time = %0t", t2, $realtime);
     
  endtask
endclass