数字IC设计学习笔记
5. 阻塞赋值与非阻塞赋值
1 Verilog 代码
2 原理图
3 Modelsim仿真
- 阻塞赋值(block): “=”,语句执行有先后顺序,串行执行
- 非阻塞赋值(unblock):"<=",语句执行无先后顺序,并行执行
- 注意:不要再同一个always块中混合使用阻塞赋值和非阻塞赋值
1 Verilog 代码
module block_unblock(
input clk,
input rst_n,
input a,
input b,
input c,
output reg [1:0] out //out = a+b+c;
);
reg [1:0] d; //d = a+ b; out = d+c;
always@(posedge clk or negedge rst_n)
if(!rst_n)
// out = 2'd0;
out <= 2'd0;
else begin
//----blocked 1--------------
// d = a + b;
// out = d + c;
//----blocked 2--------------
// out = d + c;
// d = a + b;
//----unblocked 1------------
// out <= d + c;
// d <= a + b;
//----unblocked 2------------
// d <= a + b;
// out <= d + c;
//----unblock 3--------------
out <= a + b + c;
end
endmodule
2. 原理图
(1). block1 原理图
(2). block 2 原理图
(3). unblock 1 原理图
(4). unblock 2 原理图
(5). unblock 3 原理图(推荐)
3 Modelsim仿真
block 2 仿真结果
// out = d + c;
// d = a + b;
先执行out = d + c; 此时的d值,为前一个时钟周期的值;后执行d = a + b;此时的d值,将在下一个时钟有效沿时被采集;由于多一级d寄存器,导致延时一拍,结果出现错误。
unblock 1, 2 由于多一级d寄存器,同样出现错误仿真结果
unblock 3 仿真结果(推荐)
【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~