You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:03:22