verilog阻塞非阻塞
时间: 2024-12-30 16:21:06 浏览: 13
### Verilog 中阻塞赋值与非阻塞赋值的区别及使用场景
#### 阻塞赋值 (Blocking Assignment)
在Verilog中,阻塞赋值使用`=`操作符表示。当执行到该类型的赋值语句时,程序会立即完成赋值动作并继续向下一条指令前进,在同一时刻内可以连续进行多次这样的赋值而不会受到其他过程的影响。
对于组合逻辑的设计来说,由于其输出依赖于当前输入状态的变化而不是过去的任何存储数据,因此非常适合采用阻塞赋值来实现。例如:
```verilog
always @(*) begin
sum = a + b;
end
```
这段代码展示了如何利用阻塞赋值构建简单的加法器电路[^1]。
#### 非阻塞赋值 (Non-blocking Assignment)
相比之下,非阻塞赋值则通过`= `(注意等号后面有一个空格)来进行表达。这种形式下的赋值会在整个进程结束之后才真正生效;也就是说,在同一个进程中所有的非阻塞赋值都会被收集起来直到最后一步才会一起更新变量的值。这使得它特别适合用来描述同步时序元件的行为模式,比如寄存器文件或是有限状态机的状态转移机制。
下面是一个典型的例子,展示了一个由多个D触发器组成的移位寄存器是如何借助非阻塞赋值得以正确建模的:
```verilog
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 0;
else
q <= d;
end
```
这里的关键在于每次遇到上升沿事件(`posedge clk`)的时候,新的输入信号d会被记录下来准备写入q之中,但是这个改变并不会立刻发生而是要等到下一个仿真时间单位到来之时才会正式实施。这样做的好处是可以避免竞争冒险现象的发生,从而提高系统的稳定性[^2]。
#### 组合逻辑 vs 时序逻辑的应用选择
综上所述,针对不同性质的功能模块应当合理选用相应的赋值方式:如果目标是创建纯粹基于现时输入计算得出结果的组合逻辑,则应优先考虑运用阻塞赋值;而对于那些涉及到历史信息保存以及随时间演化的动态特性而言——即所谓的时序逻辑部分,则更倾向于采取非阻塞的方式加以处理[^3]。
阅读全文