阻塞赋值和非阻塞赋值总是容易把人绕晕,已经使用Verilog编程一段时间了,现在终于感觉清楚了一点阻塞和非阻塞赋值的具体规则:
- always块中的被赋值变量必须为reg型;
- alwyas@(posedge clk)类似的语句用来描述时序逻辑,赋值使用非阻塞赋值 “<=”;
- always @(*)语句用来描述复杂的组合逻辑电路,赋值使用阻塞赋值 “=”;
- assign语句只能描述组合逻辑,被赋值变量为wire型,赋值使用阻塞赋值 “=”;
阻塞赋值、非阻塞赋值名称的含义:
- 阻塞赋值是说,多行赋值语句必须按顺序执行,上一行语句执行完才能执行下一行语句,“阻塞”着向下执行。
- 非阻塞赋值是说,多行赋值语句满足赋值条件时同时执行,没有“阻塞”