阻塞赋值和非阻塞赋值的区别(带仿真)

发布于 2025-02-21  117 次阅读


在always块中,使用阻塞赋值(=)和非阻塞赋值(<=)的数据改变时期不同,
使用阻塞赋值,数据在时钟上升沿将马上改变,非阻塞赋值,数据在时钟周期结束后才改变,具体仿真如下
针对ini_pulse、ini_en、pulse、en这四个信号生成四个OK响应信号,ini_pulse、ini_en经过阻塞赋值其响应信号马上就发生了改变,pulse、en为非阻塞赋值,在一个周期后响应信号才发生改变

`timescale 1ns / 1ps
module test_tb();    
reg clk;                     
reg ini_pulse=0;
reg ini_en=0;
reg pulse=0;
reg en=0;
wire pulse_mux;
reg OK_ini_pulse=0;
reg OK_ini_en=0;
reg OK_pulse=0;
reg OK_en=0;
reg OK_pulse_mux;
always begin
    #5 clk = ~clk; // 写时钟周期为 10ns
end
initial begin
    clk=0;
    @(posedge clk)
    ini_en=1;   //拉高使能
    ini_pulse=1;//生成脉冲
    @(posedge clk)
    ini_pulse=0;
    #10
    ini_pulse=1;
    #10
    ini_pulse=0;
    #100;
    $stop;
end
reg[1:0]cnt=0;
assign pulse_mux = (cnt==3) ? 1:0;//pulse_mux和pulse信号相比早一个周期,但是其响应信号还是会晚一个周期
always @(posedge clk ) 
begin
    if(cnt==3)begin
        pulse<=1;//把“<=”改成“=”你会发现响应信号会马上响应
        en<=1;
        cnt<=0;
    end
    else begin
        cnt<=cnt+1;
        pulse<=0;
    end
end
always @(posedge clk ) 
begin
    if(ini_pulse)  OK_ini_pulse<=1;
    else OK_ini_pulse<=0;
    if(ini_en) OK_ini_en<=1;
    else OK_ini_en<=0;  
    if(pulse) OK_pulse<=1;
    else OK_pulse<=0;
    if(en) OK_en<=1;
    else OK_en<=0;
    if(pulse_mux) OK_pulse_mux<=1;
    else OK_pulse_mux<=0;
end
endmodule

Pasted image 20250221104128

最后更新于 2025-03-03