← 数字电路笔试题目总结

推荐答案 测试一下

BLOCKING和NONBLOCKING赋值的区别

编程题 中等 笔试真题

参考答案

阻塞赋值(=)和非阻塞赋值(<=)是Verilog HDL中两种基本赋值方式,区别主要体现在执行顺序、仿真行为以及综合后硬件电路三个方面。 1. **执行顺序**:阻塞赋值在always块内按书写顺序顺序执行,当前赋值完成后才执行下一条语句,因此会阻塞后续语句的执行。非阻塞赋值在always块内“并行”执行,所有非阻塞赋值的右值在当前时刻立即计算,但赋值更新发生在整个always块结束之后。 2. **仿真行为**:阻塞赋值在每个仿真时间步内立即更新左值,后续语句直接使用新值。非阻塞赋值将计算出的值暂存于事件队列,待当前时间步所有阻塞赋值和连续赋值完成后统一更新,所以同一always块内多个非阻塞赋值之间不互相影响,表现为并行独立。 3. **综合后硬件**:使用阻塞赋值描述的always块会综合为组合逻辑(若缺少时钟沿触发或敏感列表不含时钟),因为赋值动作是立即且顺序的;若在时钟沿敏感的always块中错误使用阻塞赋值,可能综合出意外的锁存器或时序逻辑行为混乱。非阻塞赋值通常用于时序逻辑(如always @(posedge clk)),综合为寄存器,保证多寄存器之间的数据同步更新。 4. **常见规范**:- 组合逻辑always块(如always @(*))使用阻塞赋值。- 时序逻辑always块(如always @(posedge clk))使用非阻塞赋值。- 同一always块内不要混合使用阻塞和非阻塞赋值,避免仿真与综合不一致。 5. **易错点**:初学者常将阻塞赋值用于时钟沿触发块,导致多级寄存器间出现数据竞争或仿真结果与预期不符;或在组合逻辑中使用非阻塞赋值,造成仿真中出现“惯性延迟”现象,综合出意想不到的寄存器。 6. **总结**:阻塞赋值适合描述组合逻辑反馈、连续赋值过程;非阻塞赋值适合描述时序逻辑中寄存器的状态更新。正确选择赋值方式对RTL设计的正确性和可综合至关重要。

涉及知识点

  • 阻塞赋值与非阻塞赋值语法
  • 仿真事件队列与更新顺序
  • 综合后组合/时序逻辑行为
  • 编码规范:阻塞用于组合,非阻塞用于时序
  • 混合使用的风险与误区
← 上一题
登录后反馈错题
下一题 →