Vivado下阻塞赋值和非阻塞赋值的对比

news/2024/11/19 19:25:37/

Verilog 基础知识 中已经介绍过了阻塞赋值和非阻塞赋值的区别,下面通过一个在Vivado中的简单例子来直观的反映两者的不同。
首先给出设计源代码如下。

module block(a,b,c,clk,x);input x;input clk;output reg a,b,c;always@(posedge clk)
begina = x;   //阻塞赋值b = a;c = b;
//    a <= x;   //非阻塞赋值
//    b <= a;
//    c <= b;
end
endmodule

仿真测试源代码如下。

`timescale 1ns / 1ps
module sim_block();
reg x;
reg clk;
wire a,b,c;initial 
beginx = 0;clk = 1;foreverbegin#({$random}%100)x = ~x;  //x的值在100ns内随机翻转一次end
endalways #10 clk = ~clk;// Instantiate the Unit Under Test (UUT) 例化待测设计
block uut_block(.x(x),.clk(clk),.a(a),.b(b),.c(c)
);
endmodule

运行仿真后,阻塞赋值的结果如下图所示,其中仿真运行时间设置的是1us。
在这里插入图片描述
通过上图可以看到,阻塞赋值方式下,在时钟上升沿到来后,a,b,c的值是同时发生变化的,也就是在时钟上升沿到来后,x的值立刻赋给a,a又立刻赋值给b,b又立刻赋值给c。
非阻塞赋值的仿真结果如下图所示。
在这里插入图片描述
可以看到,如果是非阻塞赋值,在时钟上升沿到来后,x的值没有立刻赋给a,a的值没有立刻赋值给b,b的值也没有立刻赋值给c,b为a原来的值,同样,c为b原来的值。这就导致仿真一开始b和c的值都是未知的,因为上述仿真测试代码里并没有对a和b的值做初始化。非阻塞赋值情况下新的值会延迟一个时钟周期才会给到。
阻塞赋值的RTL图如下图所示。
在这里插入图片描述
非阻塞赋值的RTL图如下图所示。
在这里插入图片描述
通过阻塞赋值和非阻塞赋值的RTL图也可以看出明显的不同,非阻塞赋值情况下得到的都是D触发器的旧值。
所以一般情况下,在组合逻辑中使用阻塞赋值,执行赋值语句后立即改变,在assign语句中必须用阻塞赋值。在时序逻辑电路中使用非阻塞赋值,这样可以避免仿真时出现竞争冒险现象。


http://www.ppmy.cn/news/98548.html

相关文章

CDGA 认证:第七章 数据安全(重点章节)习题集解析

1. 数据安全架构是企业架构的一部分,描述了在企业内部如何实现数据安全以满足业务规则和外部法规,以下选项不属于安全架构所涉及内容的是( ) A 数据加密标准和机制 B 通过互联网的数据传送协议 C 远程访问标准 D 内部系统和业务部门 【答案解析】DAMA-DMBOK2 P198-199 数…

为什么不用Go开发操作系统?

操作系统 (OS) 是计算机系统的心脏和灵魂&#xff0c;它管理着计算机的硬件和软件资源&#xff0c;并为用户提供与计算机交互的方式。传统上&#xff0c;C 和 Assembly 等语言因其低开销和 “接近机器码” 的特性而被用于开发操作系统。 但诸如 Go 等高级语言的兴起引入了一些…

方法——慎用重载

前言&#xff1a; 何为重载&#xff0c;类中两个方法同名&#xff0c;但是参数列表不同&#xff0c;称为重载。注意&#xff0c;是参数列表&#xff0c;不是返回值&#xff0c;实际上同名方法同参数列表&#xff0c;但不同返回值是不允许的。 // 重载示例,重载方法允许有不同的…

Unity烟花特效实现(附源码)

Unity烟花特效 附代码 写在前面效果代码地址核心步骤 写在后面 写在前面 朋友过生&#xff0c;不知道送什么礼物&#xff0c;就想着用自己所学知识做个特效当礼物吧&#xff0c;嘿。 主要参考了 这位up的视频 &#xff0c;感谢 效果 代码地址 https://github.com/hahahappyb…

(10) 朴素贝叶斯

文章目录 1 概述2 不同分布下的贝叶斯2.1 高斯朴素贝叶斯GaussianNB2.1.1 认识高斯朴素贝叶斯2.1.2 探索贝叶斯&#xff1a;高斯朴素贝叶斯擅长的数据集2.1.3 探索贝叶斯&#xff1a;高斯朴素贝叶斯的拟合效果与运算速度 2.2 概率类模型的评估指标2.2.1 布里尔分数Brier Score2…

基于STM32的IIC驱动协议实现

目录 1.简介 2.特点 3.协议细节 1.简介 IIC(Inter&#xff0d;Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行线&#xff0c;用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线&#xff0c;可发送和接收数据。在 CPU 与被控 IC 之…

爆肝整理,最全单元测试-测试用例总结(全覆盖)及拿即用...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

nginx(七十九)rewrite模块指令再探

一 rewrite模块再探 ① 知识回顾 1) 结合自己遇到过的案例场景2) 关注一些易错点、难点3) 本文内容很杂,建议读者选取感兴趣的阅读 rewrite模块 rewrite功能 ② nginx中利用if 等价&&多条件 需求背景&#xff1a; 1) nginx不支持&&、||、and、or等逻辑…