event是SystemVerilog语言中的一个强大特性,可以支持多个并发进程之间的同步。
我们可以在一个进程trigger这个event,同时在另外一个进程等待这个event(边沿敏感的@和电平敏感的wait)。
event的触发语法非常简单,那就是“->”运算符。
下面是Systemverilog event的示例
module et; event etrig; initial begin #10; -> etrig; //trigger named event 'etrig' #10; -> etrig; //trigger named event 'etrig' end always @(etrig) //execute when event etrig is triggered //edge sensitive $display("@ etrig occurred at time %0t",$time); initial begin wait (etrig.triggered) ; //level sensitive 'wait' on the //event 'etrig' $display("'wait' etrig occurred at time %0t",$time); end endmodule
仿真log:
@ etrig occurred at time 10 'wait' etrig occurred at time 10 @ etrig occurred at time 20 V C S S i m u l a t i o n R e p o r t
在module“et”中,我们声明了一个名为“etrig”的event。
在时间10触发它,然后在时间20触发它。
“always”语句块等待“etrig”上的触发器,这是边沿敏感的。像仿真log显示的那样,打印了2次边沿触发。
该module还展示了如何使用电平敏感的被触发方式(wait)
wait (eventName.triggered);
wait(eventName.triggered)相比@的一个特点是不关心wait和"->"之间的执行顺序。
下面是另一个例子,展示多个event事件并行触发控制:
module et;
event e1, e2, e3;
initial begin
#10;
fork
-> e1;
-> e2;
-> e3;
join
end
always @(e1)
$display("event e1 triggered at time %0t",$time);
always @(e2)
$display("event e2 triggered at time %0t",$time);
always @(e3)
$display("event e3 triggered at time %0t",$time);
endmodule
仿真log:
event e1 triggered at time 10 event e2 triggered at time 10 event e3 triggered at time 10 V C S S i m u l a t i o n R e p o r t
在上面的例子中,会并行地触发3个event(e1、e2、e3),分别控制3个独立的进程)。从仿真log可以看出,3个event被同时触发。
event序列:wait_order ()
在SystemVerilog中我们还可以使用语法wait_order等待事件以特定的顺序触发。
例如,wait_order (eveA, eveB, eveC)等待事件按照顺序eveA -> eveB ->eveC触发。
module et;
event etrig1, etrig2;
initial begin
#10;
-> etrig1; //trigger named event 'etrig1'
#10;
-> etrig2; //trigger named event 'etrig2'
#10;
-> etrig1; //trigger named event 'etrig1'
#100;
end
initial begin
wait_order (etrig1 , etrig2); //OK
$display("'wait' etrig1, etrig2 occurred at time
%0t",$time);
wait_order (etrig2 , etrig1); //OK
$display("'wait' etrig2, etrig1 occurred at time
%0t",$time);
end
endmodule
Simulation log:
'wait' etrig1, etrig2 occurred at time 20 'wait' etrig2, etrig1 occurred at time 30 V C S S i m u l a t i o n R e p o r t
在上面的例子中,在时间10时触发etrig1,然后在时间20时触发etrig2,然后在时间30再次etrig1。所以,事件的顺序是
etrig1 - > etrig2- > etrig1。
审核编辑:汤梓红
-
Verilog
+关注
关注
30文章
1370浏览量
114192 -
System
+关注
关注
0文章
166浏览量
38473 -
数据类型
+关注
关注
0文章
237浏览量
14115
原文标题:SystemVerilog中的event数据类型
文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
[启芯公开课] SystemVerilog for Verification
做FPGA工程师需要掌握SystemVerilog吗?
wifi配置管理器示例使用esp_event_handler_register注册事件处理程序失败是何原因?
SystemVerilog Assertion Handbo
SystemVerilog的断言手册
基于事件结构的SystemVerilog指称语义
SystemVerilog的正式验证和混合验证
华为游戏服务示例代码教程案例
SystemVerilog中枚举类型的使用建议
一些有趣的数组相关的SystemVerilog约束
一些有趣的数组相关的SystemVerilog约束
SystemVerilog中的$timeformat是做什么的?

Systemverilog event的示例
评论