在Verilog中,过程赋值语句分为两个大类:阻塞型过程赋值语句和非阻塞型过程赋值语句。
为了清晰直观,两者基本对比如下:
| 阻塞型过程赋值语句 | 非阻塞型过程赋值语句 |
|---|---|
| 操作符“=”,变量=表达式 | 操作符“<=”,变量<=表达式 |
| 串行语句块中,各语句按照排列先后执行 | 各条语句并行执行,无先后之分 |
| 并行语句块中,同时执行,无先后之分 | – |
| 立即从右向左赋值 | 延时完成后,从右向左赋值 |
对于同样的语句块,在其他部分完全相同的情况下,过程赋值语句采用不同的阻塞与非阻塞的形式,综合结则不同。
以基本为例:
module blocking(din,clk,out1,out2);
input din,clk;
output out1,out2;
reg out1,out2;
always@(posedge clk)
begin
out1 = din;
out2 = out1;
end
endmodule
此阻塞型赋值语句综合的逻辑电路为图1:

若修改为非阻塞形式:
module blocking(din,clk,out1,out2);
input din,clk;
output out1,out2;
reg out1,out2;
always@(posedge clk)
begin
out1 <= din;
out2 <= out1;
end
endmodule
综合出的逻辑电路为图2:

由此可见,阻塞型和非阻塞型在语句的执行以及理解上并不相同,非阻塞型赋值语句更像是每一句都分配了一个D触发器。
在上课过程中,老师提出了一个问题:
如何利用阻塞型赋值语句生成图2所示的单触发器电路?
答案是颠倒两条语句顺序:
module blocking(din,clk,out1,out2);
input din,clk;
output out1,out2;
reg out1,out2;
always@(posedge clk)
begin
out2 = out1;
out1 = din;
end
endmodule
可以利用阻塞型赋值语句顺序执行的特点,实现我们的要求。
在一般情况下,以下情况分别应用阻塞型和非阻塞型赋值语句:
| 阻塞型赋值 | 非阻塞型赋值 |
|---|---|
| 组合逻辑电路 | 时序电路 |
| 锁存器电路 | |
| – | 既有组合逻辑又有时序逻辑 |
参考资料:
《Verilog HDL 数字集成电路设计原理与应用》
7787

被折叠的 条评论
为什么被折叠?



