来自 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_none
和 ref
参数。
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
我想等待任务的输出变量。
例如: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_none
和 ref
参数。
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