当前位置: 首页 > news >正文

FPGA基础 -- Verilog 命名事件

Verilog 的“命名事件(Named Events)”机制 进行一次系统、专业的培训。该机制在 Verilog 中是比较冷门但重要的仿真控制特性,主要用于 模块间同步、行为仿真触发、事件通信,在复杂的 Testbench、行为模型中尤为重要。


一、命名事件是什么?

命名事件(Named Event) 是 Verilog 提供的一种可以显式创建、显式触发、显式等待的“同步信号”,和 event 关键词相关。它们不是信号,也不是变量,而是一种 仿真时间上的触发机制

它不是综合语法,只用于 仿真(Simulation only)


二、基本语法与操作

1. 定义事件

event my_event;

定义了一个命名事件变量 my_event


2. 触发(trigger)事件

-> my_event;

或:

->> my_event;  // 延迟触发(Verilog-2005)

这表示立即触发事件 my_event,供其它地方监听。


3. 等待事件发生

@(my_event);  // 等待 my_event 被触发

也可以和其他触发条件组合:

@(posedge clk or my_event);

三、案例分析:事件触发与等待

module event_example;event done_event;   // 定义一个事件initial begin$display("T=%0t: Waiting for event...", $time);@(done_event);   // 等待事件触发$display("T=%0t: Event triggered!", $time);endinitial begin#50;             // 延迟 50 时间单位-> done_event;   // 触发事件$display("T=%0t: Event sent", $time);endendmodule

输出:

T=0: Waiting for event...
T=50: Event sent
T=50: Event triggered!

四、事件机制使用场景

1. 多模块同步(仿真侧)

// DUT 和 TB 控制之间通过事件同步开始测试

2. 行为级通信

在 FSM 中一个状态机等待另一个模块触发完成事件。

3. Testbench 编写中常用

  • 等待某个模拟行为完成(如 DMA 传输完成)
  • 协调不同 initial 块之间的动作顺序
  • 等待某个周期性过程完成再发下一组数据

五、多个事件组合(进阶)

1. 多个事件等待

@(event_a or event_b);

2. 多次触发也可以

repeat(3) @(event_x);

六、事件的传递与参数化

事件是 传引用的,因此可以作为参数传入子模块:

task wait_for_event(event e);@(e);  // 等待传入的事件
endtask

或者在 fork-join 结构中,通过共享事件做子任务完成的同步。


七、Verilog-2005 延迟触发 ->>

->> event_name; // 表示下一时间单位才触发

这在一些 race condition 下非常有用,避免当前时间立刻触发带来的不确定行为。


八、仿真工具支持与注意事项

特性支持情况
仿真支持✅ ModelSim、VCS、Verilator 等均支持
语义层面综合支持❌ 绝不用于综合 RTL
多线程并发场景✅ 搭配 fork-join 同步子任务
建议用法✅ 仅限 Testbench 和验证模型中使用

九、命名事件 VS 信号控制的对比

方面命名事件触发信号
本质模拟器中的同步机制电平/边沿
仿真可用
RTL综合
可追踪性模拟器内部事件(不可见)信号波形可观察
用途高层行为建模与协调真实电路逻辑

十、总结与工程建议

建议内容说明
✅ 推荐在 Testbench 中使用命名事件协调流程控制适合用于多个线程/过程的同步,如等待初始化完成、总线传输结束等
❌ 不要用于 RTL 模块或计划综合的代码中不属于综合语法,综合工具会忽略或报错
✅ 与 fork-join、任务、函数配合使用更具威力实现多线程任务的完成同步
http://www.lqws.cn/news/441811.html

相关文章:

  • Cursor Pro取消500次请求限制,无限用的体验更好了吗?
  • 【vim】通过vim编辑器打开、修改、退出配置文件
  • 新生活的开启:从 Trae AI 离开后的三个月
  • 【研发工具】.Net创建多项目模板(Visual Studio)
  • 轻量化社交管理方案:Skout与云手机的巧妙搭配
  • 暑期前端训练day1
  • SpringBoot扩展——应用Web Service!
  • 【 感知集群】大规模分布式基础设施的AI赋能蓝图
  • 深度学习之目标检测YOLO简介和YOLO v1模型算法流程详解说明(超详细理论篇)
  • Redis
  • 动态规划算法思路详解
  • 【高录用】2025年数字金融,大数据与商业管理国际会议 (DFBBM 2025)
  • 蚀刻效果解释
  • LeetCode | 一文弄懂树:定义、原理、应用与题型分类
  • SpringBoot新闻项目学习day3--后台权限的增删改查以及权限管理分配
  • 算法导论第十九章 并行算法:解锁计算新维度
  • Oracle 数据库性能优化之重做日志(redo)
  • 刘波卸任OPPO法定代表人、经理等职务,段要辉“接棒”
  • FPGA基础 -- Verilog 禁止语句
  • django rest_framework 自定义403 Forbidden错误页面
  • NetworkManager介绍与用法
  • 【Bluedroid】蓝牙启动之 btif_init_ok 流程源码解析
  • 二叉树基本学习
  • “开放原子园区行”太原站:openKylin以开源之力,赋能产业发展
  • Go 运维巡检系统(opsxj)开发与实践
  • 01.线性代数是如何将复杂的数据结构转化为可计算的数学问题,这个过程是如何进行的
  • 前端跨域解决方案(5):websocket
  • SQL注入安全研究
  • JMeter 高阶玩法:分布式压测的技术核心技术要点
  • 容器运行时保护:用Falco构建云原生安全防线