1.书中定义
2.名词术语的理解
1.书中定义
近期在学习《Verilog数字系统设计教程》,发现对于书中”非阻塞赋值”的说明很是疑惑,书中关于“非阻塞赋值”的说明如下图所示(图中RHS表示赋值操作符号右边的变量或表达式,LHS表示赋值操作符号左边的变量或表达式):
看到这里,那怎么理解“赋值开始时刻”和“赋值结束时刻”呢?
2.名词术语的解释
以下假定always块赋值语句在时钟上升沿或复位下降沿触发
A.赋值开始时刻
赋值开始时刻可以理解为时钟上升沿或复位下降沿前的时刻,在该时刻,同时计算该always块中所有RHS的值;
B.赋值结束时刻
赋值结束时刻可以理解为该always块中所有RHS计算完成的时刻,在该时刻,把计算完成后的RHS值更新至LHS;
为方便理解,给出以下代码、testbench及仿真波形。
module non_blocking(
input clk,
input rst_n,
input wire [2:0]a,
output reg[2:0] b,
output reg[2:0] c
);
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
b=3'd1;
c=3'd2;
end
else begin
b<=a;
c<=b;
end
end
endmodule
module tb();
reg clk;
reg rst_n;
reg [2:0]a;
wire[2:0]b;
wire[2:0]c;
initial begin
clk<=0;
rst_n<=1;
a<=3'd3;
#20 rst_n<=0;
#35 rst_n<=1;
end
always #10 clk=~clk;
non_blocking B(
.clk(clk),
.rst_n(rst_n),
.a(a),
.b(b),
.c(c)
);
endmodule
整个代码的运行过程如下:
1.在55ns,rst_n高电平无效,a为3,b为1,c为2,b和c的值一直保持到clk上升沿到来时刻。
2.在70ns,clk上升沿到来,在该时刻,同时计算always块中所有RHS的值,即计算a和b,由过程1知,a为3,b为2;待a和b均计算完成,同时更新LHS的值,即b为3,c为2。
3.在90ns,clk上升沿到来,在该时刻,同时计算always块中所有RHS的值,即计算a和b,由过程2知,a为3,b为3;待a和b均计算完成,同时更新LHS的值,即b为3,c为3。