作者:李秋凤,华清远见嵌入式学院讲师。 稍微接触过Verilog HDL的都对阻塞与非阻塞赋值略知一二,也是我们经常强调的重点之一,在课堂上还是有学员问什么不一样呢,为什么我用阻塞赋值也能得出正确的结果呢? 在编写可综合代码的时候,建议大家不要忘了打开RTL网表查看器看看我们自己综合出来的电路是不是自己想要的逻辑。 我就阻塞与非阻塞赋值这个问题详细说明一下。 1、连续赋值 连续赋值语句的硬件实现是:从赋值语句(=)右边提取出的逻辑,用于驱动赋值语句左边的线网(net) 连续赋值语句 module continousassignment(a,b,c); 在电子设计自动化(EDA)和可编程逻辑器件(PLD)的设计中,理解阻塞赋值(Blocking Assignment)和非阻塞赋值(Non-Blocking Assignment)是非常关键的。这两种赋值方式在Verilog HDL中有着不同的行为和用途。 连续赋值是Verilog HDL中的一种基本赋值方式,它主要用于描述组合逻辑。例如,当定义一个连续赋值`assign c = a & b;`时,硬件会将右边的逻辑表达式`a & b`的值直接驱动到左边的线网(net)`c`,即在组合逻辑路径中,`c`的值会即时更新为`a`和`b`的逻辑与。 然而,对于时序逻辑,我们就需要用到过程赋值。过程赋值有两种形式:阻塞赋值( Blocking Assignment,`= `)和非阻塞赋值(Non-Blocking Assignment,`<=`)。 1. 阻塞赋值:在`always`块中,阻塞赋值按照语句的顺序执行。这意味着在执行完一条语句后,当前块中的其他语句才会看到更新的值。例如: ```verilog always @ (posedge clk) begin q1 = q1 + 3'b1; q2 = q1; end ``` 在这个例子中,每当时钟上升沿到来,`q1`先被加1,然后`q2`被赋予`q1`的新值。因此,`q1`和`q2`在每个时钟周期结束时是同步更新的。 2. 非阻塞赋值:非阻塞赋值则是在同一时刻并行执行的。赋值操作不会立即改变变量的值,而是将其延迟到当前`always`块的末尾。例如: ```verilog always @ (posedge clk) begin q1 <= q1 + 3'b1; q2 <= q1; end ``` 在这种情况下,`q1`和`q2`的更新发生在时钟边缘之后,`q2`总是获得上一个时钟周期`q1`的值。 理解这两者之间的区别至关重要,因为它们直接影响着逻辑综合和电路行为。阻塞赋值通常用于组合逻辑,因为它能立即更新信号,而非阻塞赋值适用于寄存器传输逻辑(RTL),因为它确保了在时序逻辑中的正确次序。此外,同一模块内,针对同一变量不应同时使用阻塞和非阻塞赋值,以避免混淆和错误。 在编写可综合代码时,开发者应利用RTL网表查看器检查综合结果,确保代码生成的电路与预期逻辑一致。这有助于发现潜在的问题,并提高设计的正确性和可靠性。掌握阻塞与非阻塞赋值的原理和应用,是成为一名熟练的EDA/PLD设计师的基础。
- 粉丝: 7
- 资源: 925
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助