08 阻塞赋值与非阻塞赋值详解

1. 阻塞赋值与非阻塞赋值

阻塞赋值与非阻塞赋值只存在于时序逻辑中

//阻塞赋值与非阻塞赋值只有在时序逻辑中才有区别
always@(*)
    case{a, b, c}
        0: out = 8'b0000_0001;
//此处既不是阻塞赋值,也不是非阻塞赋值,虽然他有always,但是它不是时序逻辑


//非阻塞赋值
always@(posedge clk)
    counter <= counter + 1'd1;


//阻塞赋值
always@(posedge clk)
    counter = counter + 1'd1;

2. 三段关于阻塞赋值与非阻塞赋值的设计代码

非阻塞赋值:

module block_nonblock(
    clk,
    rstn,
    a,
    b,
    c,
    out
);
    
    input clk;
    input rstn;
    input a;
    input b;
    input c;
    output reg[1:0] out;
    
    reg [1:0] d;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        d <= 0;
    else
        d <= a+b;
        
    always@(posedge clk or negedge rstn)
    if(!rstn)
        out <= 0;
    else
        out <= d+c;
     
endmodule

阻塞赋值1:

module block_nonblock1(
    clk,
    rstn,
    a,
    b,
    c,
    out
);
    
    input clk;
    input rstn;
    input a;
    input b;
    input c;
    output reg[1:0] out;
    
    reg [1:0] d;
    always@(posedge clk or negedge rstn)
    if(!rstn) begin
        out = 0;
        d = 0;
    end
    else begin
        out = d+c; //阻塞赋值1
        d = a+b;
    end
     
endmodule

阻塞赋值2:

module block_nonblock1(
    clk,
    rstn,
    a,
    b,
    c,
    out
);
    
    input clk;
    input rstn;
    input a;
    input b;
    input c;
    output reg[1:0] out;
    
    reg [1:0] d;
    always@(posedge clk or negedge rstn)
    if(!rstn) begin
        out = 0;
        d = 0;
    end
    else begin
        d = a+b; //阻塞赋值2
        out = d+c;
    end
     
endmodule

2.1 通过电路图来区分阻塞赋值与非阻塞赋值

08 阻塞赋值与非阻塞赋值详解_第1张图片

2.1.1 查看RTL viewr的方法

对于阻塞赋值写法1:我们查看其RTL viewr图

RTL(Register Transfer Level,寄存器传输级)指:不关注寄存器和组合逻辑的细节(如使用了多少逻辑门,逻辑门之间的连接拓扑结构等),通过描述寄存器到寄存器之间的逻辑功能描述电路的HDL层次。RTL级是比门级更高的抽象层次,使用RTL级语言描述硬件电路一般比门级描述简单高效得多      

             

 

 

 

 08 阻塞赋值与非阻塞赋值详解_第2张图片

 08 阻塞赋值与非阻塞赋值详解_第3张图片

对于阻塞赋值写法2:我们查看其RTL viewr图

08 阻塞赋值与非阻塞赋值详解_第4张图片

2.1.2 在时序逻辑中使用阻塞赋值带来的问题

在时序逻辑中,如果用阻塞赋值来写的话,会存在一个问题,我们所写代码的先后顺序不一样,会导致我们写的代码最终综合出来的电路它不一样,那么他们的结果也会不一样。

2.2 通过仿真波形来区分阻塞赋值与非阻塞赋值

观察阻塞与非阻塞波形

08 阻塞赋值与非阻塞赋值详解_第5张图片

 

将设计内部信号加入波形

08 阻塞赋值与非阻塞赋值详解_第6张图片

时钟沿采样的值是时钟沿之前的值。

08 阻塞赋值与非阻塞赋值详解_第7张图片

你可能感兴趣的:(verilog学习,fpga开发,笔记,经验分享,学习)