← 问题记录——李锐博恩

推荐答案 测试一下

什么是阻塞赋值?什么是非阻塞赋值?并举例说明:

什么是阻塞赋值?
编程题 中等 笔试真题

参考答案

阻塞赋值(=)和非阻塞赋值(<=)是 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 编码规范的核心原则。 易错点:混淆两种赋值的执行顺序和综合结果;误将非阻塞赋值用于组合逻辑导致锁存器。

涉及知识点

  • 阻塞赋值顺序执行特性
  • 非阻塞赋值并行执行特性
  • 组合逻辑与时序逻辑区分
  • 阻塞赋值用于组合逻辑
  • 非阻塞赋值用于时序逻辑
  • 混合使用导致的仿真与综合不一致
← 上一题
登录后反馈错题