SystemVerilog是否支持以下代码?
int cnt = 0;
wait( cnt == (cnt+1) )
任何人都可以指出LRM中的部分吗?
答案 0 :(得分:4)
支持此功能。但主要的问题是,你会通过这样的等待声明得到什么,因为这句话永远不会被评估为" true" 。
如果您通过此等待声明提供更多详细信息以及您想要做什么,我可以帮助您。
同时,根据你的等待声明,这是代码的输出。这将有助于您了解此等待语句将执行的操作:
// Sample code, as per your wait statement
module top();
int cnt;
bit clk;
always #5 clk = ~clk;
always @ (posedge clk)
cnt <= cnt + 1;
initial
begin
$display("***** Before wait *****");
wait(cnt == (cnt + 1))
$display("***** After wait *****");
end
initial #100 $finish;
initial $monitor("cnt - %0d", cnt);
endmodule
// Output of this sample code
***** Before wait *****
cnt - 0
cnt - 1
cnt - 2
cnt - 3
cnt - 4
cnt - 5
cnt - 6
cnt - 7
cnt - 8
cnt - 9
cnt - 10
$finish called from file "testbench.sv", line 20.
$finish at simulation time 100
答案 1 :(得分:2)
我猜答案取决于支持的含义?你肯定被允许编写没有意义的表达式,并且总是会导致错误(1'b0)。这将导致等待语句挂起并暂停执行它的任何进程。
答案 2 :(得分:1)
是的,它是受支持的。即使逻辑上你知道它会挂起,你也不会得到任何编译错误。 (如果这是你的意图,请问)
“wait”语句是级别敏感的,并且将无限期地等待,直到表达式被评估为真。它通常用于在执行另一个事件之前等待事件,或者延迟执行代码直到某个事件发生。
由于在systemverilog中线程是动态创建的,因此事件之间的同步是必要的,也就是可以使用wait语句的地方。
LRM部分,您可以在其中阅读有关等待语句的更多信息:9.4.3(级别敏感事件控制)
答案 3 :(得分:0)
您可以使用SystemVerilog自己的事件类型代替uvm_event
。这将删除对uvm_pkg
的依赖性。
class container;
event from_a;
task a();
...
-> from_a;
...
endtask
task b();
...
@ from_a;
...
endtask
endclass
你可以找到很多关于进程间通信(邮箱,信号量,互斥,事件)@LRM第15章。