Verilog阻塞与非阻塞赋值详解及其应用
版权申诉
5星 · 超过95%的资源 52 浏览量
更新于2024-09-12
收藏 584KB PDF 举报
Verilog语言中的阻塞赋值与非阻塞赋值是两种不同的数据更新机制,它们对程序执行流程有着显著的影响。阻塞赋值(Blocking Assignment)是一种实时操作,当遇到阻塞赋值时,编译器会在当前时间步立刻计算右侧表达式(Right Hand Side, RHS)的值,并立即更新左侧变量。这意味着在同一个时间步内,阻塞赋值会阻止其他语句的执行,直到赋值完成。这种赋值适合于需要立即反映状态变化的情况。
非阻塞赋值(Non-blocking Assignment),又称异步赋值,其右侧表达式同样会被计算,但左侧变量的更新则是异步的。非阻塞赋值不会阻塞其他语句,而是将计算结果放入事件队列,等待所有活跃事件处理完毕后,才会在下一个时间步进行左值更新。因此,非阻塞赋值更适合于不需立即反映的状态更新,或者与系统任务配合,如显示任务$display和选通任务$strobe。
$display任务用于即时显示指定格式的数据,而$strobe则不同,它会推迟到事件列表中所有活跃事件完成后在时间步末尾执行,这意味着$strobe的输出不会受到阻塞赋值的影响,确保了结果的准确性。在编写仿真测试时,$strobe通常比$display更推荐使用,因为$display可能会因阻塞赋值导致输出不准确。
举例说明:
1. 当没有延时时,如果初始代码中有阻塞赋值和$display,如`x = 1'b1; $display("x1=%d", x);`,结果将是先显示x1=0,然后在下一个时钟周期显示x1=1,因为阻塞赋值和显示在同一时钟周期发生。
2. 带有延时的情况,比如延时分别置于RHS前,`#50 clk上升沿, #100 RHS_a->a`,由于延时,$display和RHS的执行顺序会根据延时发生改变,影响最终输出。
通过理解阻塞与非阻塞赋值以及系统任务的特性,硬件设计师可以更有效地控制和预测Verilog程序的行为,确保硬件设计的正确性和效率。同时,在实际应用中,选择合适的赋值方式和系统任务是优化设计的关键步骤。
2020-11-11 上传
2020-07-26 上传
2020-08-27 上传
2012-07-25 上传
2020-08-14 上传
2023-07-26 上传
点击了解资源详情
点击了解资源详情
weixin_38677936
- 粉丝: 3
- 资源: 954
最新资源
- WordPress作为新闻管理面板的实现指南
- NPC_Generator:使用Ruby打造的游戏角色生成器
- MATLAB实现变邻域搜索算法源码解析
- 探索C++并行编程:使用INTEL TBB的项目实践
- 玫枫跟打器:网页版五笔打字工具,提升macOS打字效率
- 萨尔塔·阿萨尔·希塔斯:SATINDER项目解析
- 掌握变邻域搜索算法:MATLAB代码实践
- saaraansh: 简化法律文档,打破语言障碍的智能应用
- 探索牛角交友盲盒系统:PHP开源交友平台的新选择
- 探索Nullfactory-SSRSExtensions: 强化SQL Server报告服务
- Lotide:一套JavaScript实用工具库的深度解析
- 利用Aurelia 2脚手架搭建新项目的快速指南
- 变邻域搜索算法Matlab实现教程
- 实战指南:构建高效ES+Redis+MySQL架构解决方案
- GitHub Pages入门模板快速启动指南
- NeonClock遗产版:包名更迭与应用更新