Verilog阻塞赋值与非阻塞赋值的理解(个人总结)

首先写在always块外面的叫连续赋值,不是本文讨论内容。写在always块内的叫过程赋值,有阻塞赋值(=)和非阻塞赋值(<=)两种。

代码都是对应实际电路的。本文从仿真角度理解阻塞赋值与非阻塞赋值的区别。

这里以组合电路和边沿触发的同步时序电路为例。

组合电路

reg a,b,c,d,e,f,g;
always@(*) begin
    e = a&b;
    f = c|d;
    g = e^f;
end

 书写组合电路时,我们想要的结果是:

1)先将a和b与操作的结果赋给e,c和d或操作的结果赋给f

2)再将e和f异或操作的结果赋给g

因此我们使用阻塞赋值(=),代码仿真时会顺序执行第3,4,5行的语句。先改变e,再改变f,最后根据e,f改变后的值改变g。(可以想见这里先改变f,再改变e也是可以的,所以第3,4行代码顺序可以互换)

边沿触发的同步时序电路

reg a,b,c,d,e,f;
always@(posedge clk or negedge rst_n) begin
    c <= a;
    d <= b;
    f <= c&d;
end

书写边沿触发的同步时序电路时,我们要考虑次态和现态:

1)根据现态计算次态。

2)更新状态,把次态赋值给现态。状态即各个触发器的输出(c,d,f)。

因此我们使用非阻塞赋值(<=),代码仿真时叫做“并行执行”,也就是先把当前的右值用到的变量值(a,b,c,d)先存下,计算后统一赋给左值(c,d,f)。

如果这时使用阻塞赋值(=),c和d的值先改变,f就不是想要的结果了。

总结

个人理解正是因为数字电路的特性,Verilog HDL用到了两种过程赋值。也有了约定俗称的“组合逻辑用阻塞,时序逻辑用非阻塞”的说法。两种赋值语句在综合中是如何实现的,有待继续学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值