Verilog阻塞与非阻塞赋值详解及其应用

版权申诉
5星 · 超过95%的资源 3 下载量 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程序的行为,确保硬件设计的正确性和效率。同时,在实际应用中,选择合适的赋值方式和系统任务是优化设计的关键步骤。