核心要点
- 用途 :用于在
always或initial块中对寄存器类型变量(如reg)进行赋值。 - 执行方式 :在同一个仿真时刻,所有非阻塞赋值语句的右侧表达式会先统一计算 ,然后在该时刻结束时同时更新左侧变量,表现为"并行"执行。
- 典型应用场景 :时序逻辑电路(如触发器、寄存器)建模中推荐使用,以避免竞争冒险问题 34。
与阻塞赋值的区别
| 特性 | 阻塞赋值 (=) |
非阻塞赋值 (<=) |
|---|---|---|
| 执行顺序 | 顺序执行(前一条完成才执行下一条) | 并行执行(所有 RHS 先计算,再统一赋值) |
| 适用场景 | 组合逻辑 | 时序逻辑 |
| 变量更新时机 | 立即更新 | 仿真时刻结束时更新 45 |
注意事项
<=在 Verilog 中仅用于过程块内的赋值 ,不能用于连续赋值(如assign语句)11。- 虽然符号与"小于等于"关系运算符相同,但在不同上下文中语义完全不同:
- 在赋值语句中(如
a <= b;):表示非阻塞赋值。 - 在条件判断中(如
if (a <= b)):表示小于等于比较 12。
- 在赋值语句中(如
推荐实践:在
always @(posedge clk)等时序逻辑块中统一使用<=,在组合逻辑块中使用=,以确保仿真与综合结果一致 34。