【Verilog】阻塞/非阻塞赋值

张开发
2026/4/11 8:03:56 15 分钟阅读

分享文章

【Verilog】阻塞/非阻塞赋值
目录阻塞赋值非阻塞赋值Verilog模块编码的8个原则阻塞赋值阻塞赋值使用的赋值运算符为“”阻塞赋值的过程是立刻执行的即阻塞赋值运算符右侧表达式求值完后立刻会更新至运算符左侧并且这个执行的过程不受其他语句执行的影响其后的语句只有当前的赋值操作执行完成后才能顺利执行非阻塞赋值非阻塞赋值使用的赋值运算符为“”非阻塞赋值执行过程为当当前仿真时间槽time-slot开始分析计算获得右侧表达式的值在当前时间槽执行结束时更新左侧表达式的值在右侧表达式分析计算和左侧表达式被更新之前任何其他事件都可以执行同时也有可能修改已经计算完成的右侧表达式的值即非阻塞赋值的过程不影响其他语句的执行根据非阻塞赋值的特点其赋值运算符左侧操作数只能作为寄存器类型因此非阻塞赋值只能用于过程语句中initial和always不允许在连续赋值语句中使用非阻塞赋值所谓阻塞的概念是指在同一个always块中其后面的赋值语句从概念上是前一条赋值语句结束后开始赋值的Verilog模块编码的8个原则时序电路建模时用非阻塞赋值锁存器电路建模时用非阻塞赋值用always块建立组合逻辑模型时用阻塞赋值在同一个always块中建立时序和组合逻辑电路时用非阻塞赋值在同一个always块中不要既用非阻塞赋值又用阻塞赋值不要在一个以上的always块中为同一个变量赋值用$strobe系统任务来显示用非阻塞赋值的变量值在赋值时不要使用#0延时下面两段代码中in、q1、q2和q3的初值分别为0、1、2、3那么经历1个时钟周期后左侧q3的值和右侧q3的值分别变成了always(posedge clk)beginq1in;q2q1;q3q2;endalways(posedge clk)beginq1in;q2q1;q3q2;endA. 0、0B. 0、3C. 2、0D. 0、2D“”是阻塞赋值当 clk 的上升沿到来时in 的值赋给 q1然后 q1 的值赋给 q2然后 q2 的值赋给 q3。最终结果 q3 等于 in 的值为 0。“”是非阻塞赋值当 clk 的上升沿到来时in 的值赋给 q1同时 q1 的值赋给 q2同时 q2 的值赋给 q3。最终结果 q3 等于 q2的值为 2┌─────┐ in ──►│ D │──► q1 │ Q │──► q2 │ │──► q3 └──▲──┘ │ clk┌─────┐ ┌─────┐ ┌─────┐ in ──►│ D Q │──►──►│ D Q │──►──►│ D Q │──► q3 │ │ q1 │ │ q2 │ │ └──▲──┘ └──▲──┘ └──▲──┘ │ clk │ clk │ clk └─────────────┴─────────────┘

更多文章