SystemVerilog wait() 语句
SystemVerilog wait() statement
SystemVerilog 是否支持以下代码?
int cnt = 0;
wait( cnt == (cnt+1) )
谁能告诉我 LRM 中的部分?
我想答案取决于您所说的支持是什么意思?您当然可以编写毫无意义且始终会导致错误 (1'b0) 的表达式。这将导致 wait 语句挂起并暂停执行它的任何进程。
这是支持的。但主要问题是,这样的等待语句会得到什么,因为 这个语句永远不会被评估为 "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
是的,支持。即使从逻辑上您知道它会挂起,您也不会得到任何编译错误。 (如果那是你问的意图)
"wait" 语句是级别敏感的,将无限等待直到表达式被评估为真。它通常用于在执行另一个事件之前等待一个事件,或者延迟代码的执行直到某个事件发生。
由于在 systemverilog 中线程是动态创建的,因此事件之间的同步是必要的,这就是可以使用等待语句的地方。
您可以在其中阅读有关等待语句的更多信息的 LRM 部分:9.4.3(级别敏感事件控制)
您可以使用 SystemVerilog 自己的事件类型来代替 uvm_event
。这消除了对 uvm_pkg
.
的依赖
class container;
event from_a;
task a();
...
-> from_a;
...
endtask
task b();
...
@ from_a;
...
endtask
endclass
您可以在 LRM 第 15 章找到很多关于进程间通信(邮箱、信号量、互斥量、事件)的内容。
SystemVerilog 是否支持以下代码?
int cnt = 0;
wait( cnt == (cnt+1) )
谁能告诉我 LRM 中的部分?
我想答案取决于您所说的支持是什么意思?您当然可以编写毫无意义且始终会导致错误 (1'b0) 的表达式。这将导致 wait 语句挂起并暂停执行它的任何进程。
这是支持的。但主要问题是,这样的等待语句会得到什么,因为 这个语句永远不会被评估为 "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
是的,支持。即使从逻辑上您知道它会挂起,您也不会得到任何编译错误。 (如果那是你问的意图)
"wait" 语句是级别敏感的,将无限等待直到表达式被评估为真。它通常用于在执行另一个事件之前等待一个事件,或者延迟代码的执行直到某个事件发生。
由于在 systemverilog 中线程是动态创建的,因此事件之间的同步是必要的,这就是可以使用等待语句的地方。
您可以在其中阅读有关等待语句的更多信息的 LRM 部分:9.4.3(级别敏感事件控制)
您可以使用 SystemVerilog 自己的事件类型来代替 uvm_event
。这消除了对 uvm_pkg
.
class container;
event from_a;
task a();
...
-> from_a;
...
endtask
task b();
...
@ from_a;
...
endtask
endclass
您可以在 LRM 第 15 章找到很多关于进程间通信(邮箱、信号量、互斥量、事件)的内容。