Verilog编程:阻塞与非阻塞赋值的关键区别

需积分: 17 2 下载量 192 浏览量 更新于2024-07-11 收藏 447KB PPT 举报
"这篇资料主要讲述了Verilog模块编程中的关键概念,特别是关于阻塞赋值和非阻塞赋值的使用。它强调了在不同情况下如何正确选择赋值方式,以避免逻辑错误和不必要的锁存器。" 在Verilog语言中,阻塞赋值(blocking assignment,`=`)和非阻塞赋值(non-blocking assignment,`<=`)是构建数字系统模型的重要工具。它们在创建时序电路和组合逻辑电路时有着不同的作用。 1. **时序电路建模**:时序电路通常涉及到存储元件,如寄存器,应使用非阻塞赋值。非阻塞赋值确保赋值操作在当前时钟周期结束时才生效,这有助于保持数据的稳定性,避免亚稳态的出现。 2. **锁存器建模**:与时序电路类似,锁存器的建模也推荐使用非阻塞赋值,以确保在特定时钟边沿之后数据才会更新。 3. **组合逻辑建模**:在构建组合逻辑电路时,使用阻塞赋值是合适的。阻塞赋值会在赋值语句执行时立即改变变量的值,因此适合表达即时的逻辑关系。 4. **混合时序和组合逻辑**:在同一个always块中,如果需要同时描述时序和组合逻辑,应当使用非阻塞赋值。但要避免在同一always块内混用阻塞和非阻塞赋值,这可能导致逻辑混乱。 5. **避免多块赋值**:一个变量不应该在多个always块中被赋值,否则会造成不确定的行为,综合器可能插入额外的锁存器来处理这种情况。 6. **$strobe系统任务**:为了观察使用非阻塞赋值的变量值,可以使用$strobe系统任务。它允许在特定时间点打印变量的值,而不会干扰正常的执行流程。 7. **#0延迟**:在赋值时,不应使用#0延迟,因为这会导致立即赋值,可能不符合预期的时序行为。 8. **always块的使用**:每个always块应只响应一个事件控制表达式,可以是时钟边沿(posedge或negedge)或电平触发。对于时序逻辑,推荐使用单一时钟沿触发,以避免同步问题。在always块中,所有被赋值的信号必须是reg型或integer型,并且要避免组合反馈回路,防止综合器自动添加不必要的锁存器。 9. **无关状态`bx`**:将信号赋值为'bx(未知状态)可以让综合器简化电路,因为它会忽略这个值。 理解并正确使用Verilog中的阻塞和非阻塞赋值是数字系统设计的关键,它直接影响到设计的正确性和综合结果的效率。深圳大学信息工程学院提供的这些指导原则有助于开发者编写出更加清晰、可靠的Verilog代码。