关于非阻塞赋值的一点理解

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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值