verilog HDL - 赋值语句 - 非阻塞/阻塞

vrilog数字系统设计 夏宇闻 【第3版】 4.91 + 14.1

非阻塞赋值方式(Non-Blocking )

如 b<= a;

1).在语句块中,上面语句所赋的变量值不能立即为下面的语句所用;
2).块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值所得到的;
3).在编写可综合的时序逻辑模块时,这是最常用的赋值方法。

阻塞赋值方式(Blocking )

如 b= a;

1).赋值语句执行完成后,块才结束;
2).b的值在赋值语句执行完成后立即就改变;
3).在时序逻辑中使用时,可能会产生意想不到的结果。

举例说明
`timescale 1ns / 1ps

module demo_BK;
reg clk,rst;
reg [7:0] a,b1,b2,c1,c2;

initial begin
    clk = 1;
    rst = 1;
    a = 0;
    b1 = 0;
    b2 = 0;
    c1 = 0;
    c2 = 0;
    
    #100;
    rst = 0;
end

always #2 clk = ~clk;

always@(posedge clk)begin
if(rst)
    a <= 8'd0;
else
    a <= a+1'd1;
end

//------------------------------------------- non_blocking
always@(posedge clk)begin
    b1 <= a;
    b2 <= b1;
end
//------------------------------------------- blocking
always@(posedge clk)begin
    c1 = a;
    c2 = c1;
end

endmodule

仿真结果如下图:
在这里插入图片描述
实际描述的电路功能图如下:
在这里插入图片描述

两者用法说明

要点:
(1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;
(2)在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。
理解说明:
RHS-赋值等号右边的表达式或变量可分别缩写为RHS表达式或RHS变量;
LHS-赋值等号左边的表达式或变量可分别缩写为LHS表达式或LHS变量。
原则1 时序电路建模时,用非阻塞赋值。
原则2 锁存器电路建模时,用非阻塞赋值。
原则3 用always块描述组合逻辑时,应采用阻塞赋值语句。
原则4 在同一个always块中描述时序和组合逻辑混合电路时,用非阻塞赋值。

原则5 不要再同一个always块中同时使用阻塞和非阻塞赋值。
原则6 严禁在多个always块中对同一个变量赋值。
原则7 用$strobe系统任务来显示,应该用非阻塞赋值的变量值。
原则8 在赋值时不要用#0延迟。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值