【问题标题】:Cross-module reference resolution error from SV wait statement来自 SV 等待语句的跨模块引用解析错误
【发布时间】:2021-10-27 18:32:08
【问题描述】:

我想等待任务的输出变量。
例如: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 输出日志:

顶级模块: tmp TimeScale 为 1 ns / 1 ns

Error-[XMREF] 跨模块参考解析错误 testbench.sv, 19 发现跨模块引用解析错误。功能是 预期,但实际目标不是函数。来源信息: 运行(this.t2)

1 错误 CPU 时间:0.116 秒编译预期退出代码:0, 收到:1

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

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

    在您的特定示例中,在任务结束之前您不会更改 t 参数的值,并且在退出任务时会复制 output 参数,因此您不妨只调用任务@ 987654326@ 作为一个语句,它会阻塞直到返回。

    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
    

    【讨论】:

    • “任务不返回值,不能在表达式中使用。” - 回答我的问题。奖金带走积分; (1) 任务作为语句阻塞直到返回,(2) 我也可以使用 fork join_noneref 使事情同时运行。谢谢!
    【解决方案2】:

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

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

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

    任务或 void 函数不能作为实际参数传递 因为它们不返回可以使用的值。他们也不能 用作表达式的一部分。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多