@Verilog中阻塞赋值和非阻塞赋值的区别
想要区分阻塞赋值和非阻塞赋值,首先要了解串行和并行的区别。
串行区分先后顺序。
并行没有先后顺序,可以同步进行。
其次理解“阻塞”二字,什么是“阻塞”?“阻塞”的是什么?
阻塞的是下一条语句,即如果当前语句没有被执行,那么就不会执行下一条语句。
两种赋值方法及其所描述的电路结构举例说明:
非阻塞赋值(Non-Blocking)“<=”
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
a <= 1'b0;
b <= 1'b0;
end
else begin
a <= c;
b <= a;
end
end
阻塞赋值(Blocking)“=”
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
a <= 1'b0;
b <= 1'b0;
end
else begin
a = c;
b = a;
end
end
⚠️:Verilog是硬件电路描述语言,其描述的是电路结构,不是常规意义上的程序。
软件程序是由CPU一条一条语句地按序执行。
硬件电路是并行执行,这使效率得到了很大的提升,但是也带来了一些问题,例如在需要满足特定执行顺序要求时,就引出了状态机的概念。
最后,大家在看代码时,也许会遇到有的case语句用的是非阻塞赋值,有的又是阻塞赋值,这是为什么呢?