阻塞赋值(Blocking Assignment)和非阻塞赋值(Non-blocking Assignment)是硬件描述语言(如Verilog)中的两种赋值方式,它们在仿真和综合时有不同的行为。
一、阻塞赋值(Blocking Assignment)
阻塞赋值使用 =
运算符。它的特性是赋值语句会立即执行,且会阻塞(即在当前语句执行完毕之前,后续语句不会执行)。这类似于软件编程中的顺序执行。
示例verilog代码
module blocking_assignment;
reg [7:0] a, b, c;
initial begin
a = 8'd1; // a = 1
b = a; // b = 1 (b 被赋值为 a 的值)
c = b; // c = 1 (c 被赋值为 b 的值)
end
endmodule
在这个例子中,a
先被赋值为 1,然后 b
被赋值为 a
的值,最后 c
被赋值为 b
的值。每一步操作是顺序执行的。
二、非阻塞赋值(Non-blocking Assignment)
非阻塞赋值使用 <=
运算符。它的特性是赋值语句会被安排在当前时间步的结束时执行,且不会阻塞(即所有非阻塞赋值语句会在当前时间步的结束时同时执行)。
示例verilog代码
module nonblocking_assignment;
reg [7:0] a, b, c;
initial begin
a <= 8'd1; // a = 1 (在当前时间步结束时)
b <= a; // b = a (在当前时间步结束时 b 被赋值为 a 的初始值,此时 a 还未更新)
c <= b; // c = b (在当前时间步结束时 c 被赋值为 b 的初始值,此时 b 还未更新)
end
endmodule
在这个例子中,a
在当前时间步结束时被赋值为 1,但 b
被赋值时,a
还没有被更新,因此 b
仍然保持初始值(假设为 0),同理,c
也保持初始值。
总结
- 阻塞赋值(
=
):按顺序执行,阻塞后续语句。 - 非阻塞赋值(
<=
):在时间步结束时同时执行,不阻塞后续语句。
选择哪种赋值方式取决于具体的仿真需求和硬件逻辑设计要求。阻塞赋值通常用于组合逻辑,而非阻塞赋值用于时序逻辑。