Verilog测试平台中事件合并功能失效问题排查
Verilog事件赋值导致部分线程未触发的原因分析
在Verilog测试平台中尝试合并事件,预期触发后Thread 1和Thread 2的打印内容均能输出,但实际仅得到Thread 1的输出;将赋值改为event_a = event_b后,仅输出Thread 2的内容。使用Aldec和VCS工具验证,结果一致。
测试代码
module tb; //event variables event event_a, event_b; initial begin fork begin wait(event_a.triggered); $display ("[%0t] Thread1: Wait for event_a is over", $time); end begin wait(event_b.triggered); $display ("[%0t] Thread2: Wait for event_b is over", $time); end #20 ->event_a; #20 ->event_b; begin #10 event_b = event_a; end join end endmodule
仿真结果
# KERNEL: [20] Thread1: Wait for event_a is over # KERNEL: Simulation has finished. There are no more test vectors to simulate. # VSIM: Simulation has finished.
问题原因
Verilog中的event是引用类型,事件变量存储的是事件对象的引用,而非事件本身。当执行event_b = event_a时,并非让两个事件关联触发,而是让event_b变量指向event_a对应的事件实例,原来event_b自己的事件实例会被丢弃。
具体时间线拆解:
- 仿真到#10时,
event_b = event_a执行,此时event_b和event_a指向同一个事件对象。 - #20时,
->event_a和->event_b本质是对同一个事件对象的触发操作。 - Thread 2中
wait(event_b.triggered)等待的是初始创建的event_b事件对象的触发,但这个对象已经被丢弃,永远不会被触发,因此Thread 2的打印代码永远不会执行。 - 若将赋值改为
event_a = event_b,则event_a会指向初始的event_b对象,Thread 1等待的原event_a对象不会被触发,最终只有Thread 2的打印输出。
内容的提问来源于stack exchange,提问作者trushali-2005
相关产品推荐
相关产品推荐

