当前位置: 首页 > 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.xdnf.cn/news/1060993.html

相关文章:

  • QT6与VS下实现没有CMD窗口的C++控制台程序
  • MySQL 的 WITH ROLLUP 功能
  • python画三维立体图
  • 容器运行时保护:用Falco构建云原生安全防线
  • angular 图斑点击,列表选中并滚动到中间位置
  • ROS学习之服务通信
  • 2025虚幻引擎文件与文件夹命名规律
  • Tensorflow C++ API从入门到放弃
  • STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议
  • MySQL八股文
  • AIGC - Prompt Optimizer 提示词优化器
  • 编程马拉松的定义、运作与发展
  • 解锁微服务潜能:深入浅出 Nacos
  • S32DS上进行S32K328的时钟配置,LPUART时钟配置步骤详解
  • SSH服务与rsync服务配置实战
  • FPGA基础 -- Verilog 概率分布函数
  • Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
  • 【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
  • AJAX拦截器失效排查指南:当你的beforeSend有效但error/complete沉默时
  • CppCon 2017 学习:Everything You Ever Wanted to Know about DLLs
  • API 接口:程序世界的通用语言与交互基因
  • Spring Boot 虚拟线程 vs WebFlux:谁更胜一筹?
  • 主流防火墙策略绕过漏洞的修复方案与加固实践
  • 啊啊啊啊啊啊啊啊code
  • C++实现手写strlen函数
  • 什么是池化
  • [11-5]硬件SPI读写W25Q64 江协科技学习笔记(20个知识点)
  • Java求职者面试指南:Spring, Spring Boot, Spring MVC, MyBatis技术点深度解析
  • RK3568笔记八十五:LVGL播放AVI视频
  • MySQL读写分离技术详解:架构设计与实践指南