Verilog基础:避免混合使用阻塞和非阻塞赋值

news2024/7/6 17:53:58

相关阅读

Verilog基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


        “避免在一个always块中混杂阻塞赋值和非阻塞赋值”,这条原则是著名的Verilog专家Cliff Cummings在论文SUNG2000中提出的,这个观点在公众讨论时受到了广泛的质疑。有人认为可以在时钟沿触发的always块里把组合逻辑的阻塞赋值和时序逻辑的非阻塞逻辑安全地混杂在一起。诚然,但是这种编码风格有以下几点不足。

  1. 这种always块的事件调度理解起来比较费劲。
  2. 这种always块内的非阻塞赋值应该放在最后。
  3. 在零延迟的RTL模型中,触发器的输入信号(临时变量)和对应的触发器输出会在同一个时钟沿变化,这种波形令人困惑。

        下面来看一下段简单的代码,它拥有正确的代码风格,即没有把阻塞赋值和非阻塞赋值混杂在一起。

module test(
    output reg q,
    output y,
    input a, b, c, clk, rst_n);

    wire d;
    always@(posedge clk or negedge rst_n)
        if(!rst_n) q <= 0;
        else       q <= d;

    assign d = a & b;
    assign y = q & c;

endmodule

        以上Verilog代码的综合结果如图1所示。

图1 对应的综合电路 

        虽然下面的代码也正确地构建上面的电路,但是这段代码把阻塞和非阻塞赋值混杂在同一个always块中。这种编码风格经常被那些具有VHDL背景的工程师采用,因为他们为了提高VHDL仿真性能,习惯于把变量和信号赋值混杂在用一个process块中,但是在Verilog中使用这种风格并不会提高仿真性能。

module test(
    output reg q,
    output y,
    input a, b, c, clk, rst_n);

    always@(posedge clk or negedge rst_n)
        if(!rst_n) q <= 0;
        else begin:logic
            reg d;
            d = a & b;
            q <= d;
        end

assign y = q & c;

endmodule

        以上Verilog代码的综合结果如图2所示。 

图2 对应的综合电路 

        虽然这段代码在仿真和综合时都正确,但是最好还是不要使用这种编码风格,因为仿真波形会让人困惑。这种混杂的编码风格意味着:当与非门的输入发生变化时,组合信号d不会发生变化,组合信号d发生变化的唯一时刻是在时钟的有效沿或复位。对于大型的设计,工程师要花费很多时间去理解这种怪异的行为——触发器的输入和对应的输出在同一个沿变化,这在真实的硬件上是不会发生的,只是这种编码风格产生的副作用。

        除此之外,为了定义内部信号,需要有一个命名块(在上面为logic)。

        有的工程师说:对于上述混杂的Verilog代码,当非阻塞赋值用完内部信号后,就把它们赋值为x,这样就不会有人在波形上查看这些内部信号,也不会让人糊涂。下面就是使用这种奇怪编码风格后的代码。对于这种编码风格,内部信号在整个仿真过程中都显示成x,即使他们具有暂时的中间值。为了使用这种不好的编码风格,就制造了这么多的麻烦。

module test(
    output reg q,
    output y,
    input a, b, c, clk, rst_n);

    always@(posedge clk or negedge rst_n)
        if(!rst_n) q <= 0;
        else begin:logic
            reg d;
            d = a & b;
            q <= d;
            d <= 1'bx;
        end

assign y = q & c;

endmodule

         以上Verilog代码的综合结果如图3所示。 

图3 对应的综合电路 

        我们可以看到这种在同一个always块内混杂阻塞和非赋值赋值的编码风格有的缺点:仿真性能差,可读性差(需要对Verilog事件调度有很好的理解),不容易编码(可能以错误的方式混杂了两种赋值,波形令人困惑)。这种风格并没有什么明显的优点,所以Cliff Cummings坚持认为不要在同一个always块中混杂两种赋值。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1110512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AWS】亚马逊云的使用

现已推出预览版 — Amazon SageMaker Studio Lab&#xff0c;一项具有机器学习 (ML) 功能的免费学习和实验服务

公网使用PLSQL远程连接Oracle数据库【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址…

2.2.2 交换机间相同vlan的通信

实验2.2.2 交换机间相同vlan的通信 一、任务描述二、任务分析三、实验拓扑四、具体要求五、任务实施1.设置交换机的名称&#xff0c;创建VLAN&#xff0c;配置access并分配接口。对两台交换机进行相同的VLAN划分&#xff0c;下面是SWA配置过程&#xff0c;同理可实现SWB的配置。…

低代码源代码交付的平台有哪些?

一、前言 作为这两年IT界的风口&#xff0c;低代码在众人眼里已经不是什么陌生的概念。 对标于传统的纯代码开发&#xff0c;低代码是一种快速开发软件&#xff08;应用程序&#xff09;的方法&#xff0c;平台通过对大量功能与场景做提前封装&#xff0c;使得用户可以在可视化…

Flink学习笔记(三):Flink四种执行图

文章目录 1、Graph 的概念2、Graph 的演变过程2.1、StreamGraph (数据流图)2.2、JobGraph (作业图)2.3、ExecutionGraph (执行图)2.4、Physical Graph (物理图) 1、Graph 的概念 Flink 中的执行图可以分成四层&#xff1a;StreamGraph -> JobGraph -> ExecutionGraph -&g…

2023年下半年软考机考考试时间批次安排

中国计算机技术职业资格网发布了关于2023年下半年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试批次安排的通告&#xff0c;2023年下半年软考机考考试时间批次安排详见正文。 原文如下&#xff1a; 按照《2023年下半年计算机技术与软件专业技术资格&#xff…

2023年中国酒类新零售行业发展概况分析:线上线下渠道趋向深度融合[图]

近年来&#xff0c;我国新零售业态不断发展&#xff0c;线上便捷性和个性化推荐的优势逐步在放大&#xff0c;线下渠道智慧化水平持续提升&#xff0c;线上线下渠道趋向深度融合。2022年&#xff0c;我国酒类新零售市场规模约为1516亿元&#xff0c;预计2025年酒类新零售市场规…

STM32的hex文件格式的分析

前言 最近研究Bootloader&#xff0c;通过串口实现STM32程序的更新。需要学习了解STM32的Hex文件格式。在这进行一下总结。 HEX文件格式 我们通过文本形式打开hex文件&#xff0c;可以看到&#xff1a; 这一行就是一条指令数据&#xff0c;这里对数据帧格式进行说明&#xff…

c++_learning-模板与泛型编程

模板与泛型编程 模板概念、函数模板定义、调用&#xff1a;各种函数&#xff1a;替换失败不是一个错误SFINAE&#xff08;substitution failure is not an error&#xff09;&#xff1a;由来&#xff1a;特性&#xff1a; *c11引入的类模板enable_if&#xff0c;体现了SFINAE的…

Hive安装配置 - 内嵌模式

文章目录 一、Hive运行模式二、安装配置内嵌模式Hive&#xff08;一&#xff09;下载hive安装包&#xff08;二&#xff09;上传hive安装包&#xff08;三&#xff09;解压缩hive安装包&#xff08;四&#xff09;配置hive环境变量&#xff08;五&#xff09;关联Hadoop&#x…

电容元件符号与工作原理:电子电路中的电荷储存利器 | 百能云芯

电容是电子电路中常见的元件之一&#xff0c;它具有储存电荷的能力。在电路图中&#xff0c;电容有一个特定的元件符号&#xff0c;用于表示其存在和连接方式。接下来&#xff0c;云芯带您深入了解电容的元件符号以及它的工作原理。 电容的元件符号通常由两个平行的线段组成&am…

基于CNN实现谣言检测 - python 深度学习 机器学习 计算机竞赛

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

【第24例】华为 IPD 体系 | RMT 需求管理团队

目录 简介 内容 相关内容推荐(CSDN学院) 作者简介 简介 需求管理团队RMT是英文Requirement Management Team首字母的简称。 细分的话还包括: PL-RMT(产品线需求管理团队,Product Lin

使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

【神印王座】伊莱克斯正式登场,皓晨通过永恒试炼,喜提两外挂,采儿丧失四感

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 神印王座动画更新&#xff0c;龙皓晨在雅婷与皓月的帮助下&#xff0c;两次探索悲啸洞穴后成功闯入永恒之塔。在第78集预告中&#xff0c;伊莱克斯闪亮登场&#xff0c;皓晨通过永恒试炼成为新一代死灵圣法师&…

纯函数 和 函数柯里化 ( 函数式编程 )05

加油&#xff0c;今天周二啦&#xff01;&#x1f60d; 文章目录 一、js 的纯函数二、JavaScript 柯里化三、柯里化作用四、将多个普通的函数&#xff0c;自动转成柯里化函数五、理解组合函数 一、js 的纯函数 函数式编程中有一个非常重要的概念叫纯函数&#xff0c;JavaScript…

C++设计模式_08_Factory Method工厂方法模式

文章目录 1. “对象创建模式”模式1.1 典型模式 2. 动机&#xff08;Motivation&#xff09;3. 代码演示Factory Method工厂方法模式3.1 常规方法3.2 面向接口的编程3.2.1 FileSplitter1.cpp3.2.2 MainForm1.cpp 3.3 Factory Method工厂方法3.3.1 ISplitterFactory.cpp3.3.2 Ma…

冰河公开了常逛的23大学习网站,赶快收藏

大家好&#xff0c;我是冰河~~ 最近有小伙伴问我&#xff1a;冰河&#xff0c;你有啥好的学习资源或者网站没&#xff1f;分享一下可以吗&#xff1f;这不&#xff0c;我连夜给大家整理了一波&#xff0c;走起~~ 赶快收藏&#xff0c;悄悄努力&#xff0c;然后惊艳所有人&…

睿趣科技:现在开抖音小店到底要多少钱

随着短视频平台的兴起&#xff0c;抖音小店成为了越来越多创业者的选择。那么&#xff0c;现在开抖音小店到底要多少钱呢?这个问题涉及到以下几个方面的费用。 首先&#xff0c;我们需要了解的是&#xff0c;开设抖音小店本身是免费的。你只需要在抖音APP上申请开店&#xff0…

迁移conda环境后,非root用户执行pip命令和jupyter命令报错/bad interpreter: Permission denied

移动conda环境&#xff0c;在移动的环境执行pip和jupyter 报错-bash: /data/home/用户名/anaconda3/envs/llm/bin/pip: /root/anaconda3/envs/llm/bin/python: bad interpreter: Permission denied 报错信息 一、原因 原因是当前的这个data/home/用户名/anaconda3/envs/环境名…