阻塞赋值与非阻塞赋值的含义:
在组合逻辑电路中使用阻塞赋值,其效果和c语言是一样的顺序执行,但在时序逻辑电路中常使用非阻塞赋值。非阻塞赋值最明显的就是所有语句块以及一个语句块中的不同变量都是在同步时钟控制下并行执行,这样就会出现输入与输出“延一拍”的效果,也称为“打拍”。
下面写个代码验证一下
代码段:
`timescale 1ns/1ns
module non_blocking
(
input wire sys_clk ,
input wire sys_rst_n ,
input wire in ,
output reg out
);
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
begin
out <= 1'b0;
end
else
begin
out <= in;
end
endmodule
仿真段:
`timescale 1ns/1ns
module tb_non_blocking();
wire out;
reg sys_clk;
reg sys_rst_n;
reg in;
initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
in <= 1'b0;
#20;
sys_rst_n <= 1'b1;
end
//sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50Mhz
always #10 sys_clk = ~sys_clk;
//key_in:产生输入随机数,模拟按键的输入情况
always #20 in <= {$random} % 2; //取模求余数,产生非负随机数0、1,每隔20ns产生一次随机数
non_blocking non_blocking_inst
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.in (in ),
.out (out )
);
endmodule
仿真波形:
由仿真波形图可以看出,非阻塞赋值的 out输出 确实比 输入in 慢一拍。