推荐答案
测试一下
题目
什么是阻塞赋值?什么是非阻塞赋值?并举例说明:
什么是阻塞赋值?
参考答案与知识点
参考答案
阻塞赋值(=)和非阻塞赋值(<=)是 Verilog 中两种基本赋值方式,用于描述组合逻辑和时序逻辑。阻塞赋值在块内顺序执行,即上一条赋值完成后再执行下一条,且立即更新目标变量,常用于组合逻辑电路(如 assign 语句或 always @(*) 块)。非阻塞赋值在时钟边沿触发时,先计算右值,然后在块结束时统一更新左值,不阻塞后续语句的执行,常用于时序逻辑电路(如 always @(posedge clk) 块)。
示例:
阻塞赋值:
always @(a or b) begin
c = a & b; // 立即更新 c
d = c | 1; // 使用更新后的 c
end
若 a=1,b=0,则 c=0,d=1。
非阻塞赋值:
always @(posedge clk) begin
c <= a & b; // 计算 a&b 但不立即更新
d <= c | 1; // 使用旧的 c
end
若 clk 上升沿前 a=1,b=0,c 旧值=0,则上升沿后 c=0, d=1;若 c 旧值=1,则 c=0, d=1(注意 d 使用旧 c)。
错误用法:在同一个 always 块中混合使用阻塞和非阻塞赋值可能导致综合异常或仿真不一致。阻塞赋值用于组合逻辑,非阻塞赋值用于时序逻辑,这是 Verilog 编码规范的核心原则。
易错点:混淆两种赋值的执行顺序和综合结果;误将非阻塞赋值用于组合逻辑导致锁存器。
涉及知识点
- 阻塞赋值顺序执行特性
- 非阻塞赋值并行执行特性
- 组合逻辑与时序逻辑区分
- 阻塞赋值用于组合逻辑
- 非阻塞赋值用于时序逻辑
- 混合使用导致的仿真与综合不一致