好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops)

news2024/11/28 16:38:00

什么是组合逻辑环路?

        组合逻辑环路(Combinational Loops):指组合逻辑的输出信号不经过任何时序逻辑电路(FF等),而直接反馈到输入节点,从而构成的电路环路。

        此外,如果直接将寄存器的输出端通过组合逻辑反馈到该寄存器的异步端口(异步复位或异步置位),也会形成组合逻辑环路。

为什么要避免组合逻辑环路? 

        在FPGA设计中,绝大多数的应用场景都不需要使用组合逻辑环路,我暂时能想到的例外只有随机数发生器(评论区可以补充一下)。

        在实践中,避免使用组合逻辑环路主要是因为它的特性所导致的危害

  1. 组合逻辑环路违反了同步设计原则,容易振荡,从而导致整个设计不稳定和不可靠。
  2. 组合逻辑环路的行为功能取决于该环路上的延迟(逻辑延迟和布线延迟),一旦延迟发生变化,整个设计的行为功能将变得无法预测
  3. 组合逻辑环路的振荡将导致EDA软件做无穷无尽的计算。为了完成这种计算,EDA软件将会切割环路。不同的EDA软件的切割方式不尽相同,这可能会与设计者的设计目的相违背,从而导致逻辑功能错误
  4. 组合逻辑环路无法进行静态时序分析(STA),可能会出现时序违例,或者导致STA过程时间过长。

什么情况会导致组合逻辑环路?

        情况1:组合逻辑的输出信号仅经过组合逻辑电路后又反馈到了输入节点。比如下面的代码:

module test(
	input 	in,
	output  out	
);

wire temp;

assign out = temp;
assign temp = ~ (temp & in);

endmodule

        这样的设计在Vivado中不会报错,但会报严重警告(Critical warning)。

        组合逻辑环路警告:1个LUT单元形成了组合循环环路。这可能会造成竞争条件。时序分析可能会不准确。推荐的解决方案是修改设计以去除组合逻辑环路。如果组合逻辑环路是已知的预期设计,则可以通过确认条件并在循环中的任何一个网络上设置以下XDC约束来绕过此DRC:“set_property ALLOW_COMBINATORIAL_LOOPS TRUE[get_nets<myHier/myNet>]”。

        情况2:寄存器的输出端通过组合逻辑直接反馈到该寄存器的异步端口(异步复位或异步置位)。 比如下面的代码:

module test(
	input 		in,
	input		clk,
	output  reg	out	
);

wire rst_n;

always@(posedge clk or negedge rst_n)begin
	if(~rst_n)
		out <= 1'b0;
	else
		out <= in;
end	

assign rst_n = ~ out;

endmodule

        这种情况所导致的组合逻辑环路在实践中还是比较少出现的,因为一般情况下,寄存器的异步端口都是直接由模块外部连接的信号所驱动。

如何处理组合逻辑环路?

        最重要的一点:一定要坚决避免组合逻辑环路!现在的EDA工具基本上都可以把组合逻辑环路识别出来,并报错或者报警告。写完RTL代码后请一定要记得看EDA工具的报告的错误和警告信息Message

        组合逻辑环路的避免首先应该通过良好的编码习惯来避免。上述的两种示例代码就是典型的错误,请不要在设计中使用类似的代码。

        如果出现了组合逻辑环路且当前设计修改困难,那么请修改你的RTL代码--通过添加寄存器的方式来切断反馈回路。就像这样:

        如果组合逻辑环路的出现是符合预期设计目的的(比如随机数发生器),想将其保留该如何操作? 只要在XDC约束文件中添加这一句即可:

set_property ALLOW_COMBINATORIAL_LOOPS TRUE[get_nets<myHier/myNet>]

        <myHier/myNet> 表示反馈回路上的一个节点,一般EDA工具都会指出这个节点,设计者只要复制替换就好了。

        这条约束语句的是用来告诉EDA工具的:这条组合逻辑反馈环路是在我设计预期内的,你可以不用对其进行分析了,更不要发警告来烦我!


  • 📣您有任何问题,都可以在评论区和我交流📃!
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

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

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

相关文章

云计算的大模型之争,亚马逊云科技落后了?

文丨智能相对论 作者丨沈浪 “OpenAI使用了Azure的智能云服务”——在过去的半年&#xff0c;这几乎成为了微软智能云最好的广告词。 正所谓“水涨船高”&#xff0c;凭借OpenAI旗下的ChatGPT在全球范围内爆发&#xff0c;微软趁势拉了一波自家的云计算业务。2023年二季度&a…

SSL证书加密是什么?加密原理和过程是怎样的?

随着互联网的普及和发展&#xff0c;人们的日常生活与网络密切交织在一起。然而&#xff0c;由于网络通信的开放性&#xff0c;信息在传输过程中很容易被窃取、篡改或伪造&#xff0c;因此保护用户的隐私和数据安全显得尤为重要。SSL证书加密就是一种用于保护网络通信安全的技术…

代码随想录算法训练营第13天|239. 滑动窗口最大值 347. 前 K 个高频元素

239. 滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-…

多模态之ViLBERT:双流网络,各自为王

通篇读完这个论文&#xff0c;需要解决如下问题&#xff1a; ViLBERT架构是什么样子的&#xff1f;ViLBERT预训练任务是什么&#xff1f;ViLBERT实现细节有哪些&#xff1f; 我之前写了两个多模态基础的文章&#xff0c;没看过的同学可以先看看这两个文章&#xff1a; 分别是…

工程(十二)Ubuntu20.04LSD_SLAM运行

LSD_SLAM适配于ubuntu20.04修改过程的参考连接如下 Ubuntu20.04配置并运行LSD_SLAM&#xff0c;实测可行_nice-wyh的博客-CSDN博客 【已解决】/lib/x86_64-linux-gnu/libapr-1.so.0: undefined reference to uuid_generateUUID_1.0_Mr.Winter的博客-CSDN博客 博主将修改好的…

Linux进程的优先级

Linux进程的优先级 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解Linux中进程的优先级&#xff0…

用sqlyog远程连接LINUX系统的MYSQL出现错解决方法

文章目录 一、错误显示二、解决方法 一、错误显示 使用sqlyog连接linux数据库显示如下错误&#xff0c;这应该是linux mysql数据库并没有支持远程软件连接数据库 二、解决方法 1、打开终端&#xff08;Xshell / SecureCRT / 其他&#xff09; 2、以 root 权限登录 mysql -…

一文搞定新程序员所有下单入口

“请问《新程序员》”该走哪里下单呢&#xff1f; 在日常的办公中&#xff0c;遇到不少用户提出这样的疑问。 目前《新程序员》可以中两个地方下单&#xff0c;一个是 CSDN 商城&#xff0c;另一个是微信小程序。 在 CSDN 公众号推文中&#xff0c;我们会中文章中重点放微信…

10.(vue3.x+vite)组件间通信方式之props与$emit

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 父组件代码 <template><div><div>{{message }}</div><Child

react-app-env.d.ts是什么?

react-app-env.d.ts这个文件是使用CRA脚手架生成react项目时自动生成的&#xff0c;在平时的开发过程中看到这个文件就会感觉很疑惑&#xff0c;出于好奇心&#xff0c;在网上查找资料&#xff0c;得出下文 前置知识 这个是一个类型声明文件 它的内容很短&#xff0c;就一行…

使用Java AOP实现面向切面编程

简介 面向切面编程&#xff08;AOP&#xff09;是一种编程思想&#xff0c;它将程序中的关注点分离&#xff0c;使得开发人员可以专注于核心业务逻辑而不必过多关注横切关注点。Java中的AOP可以通过使用AspectJ等框架来实现&#xff0c;本文将介绍如何使用Java AOP实现切面编程…

DevChat:编程不再孤单,这里有你的小伙伴和导师

DevChat&#xff1a;编程不再孤单 前言定义注册前置使用实测优点 主页传送门&#xff1a;&#x1f4c0; 传送 前言 在当今这个信息爆炸的时代&#xff0c;随着AI技术的日益发展&#xff0c;它与我们的生活的联系已经越来越密切&#xff0c;尤其是对我们程序员来说更是如此。 利…

【性能测试】数据库索引问题定位/分析+ 架构优化+ SQL优化+ 代码优化(详全)

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

UE5——源码阅读——101——渲染——高清截图

获取当前World和时间 世界存在 并准备进行更改的时候 视口是否使用立体渲染 捕获调试画布 设置RenderingTarget 设置主画布&#xff0c;按比例缩放到渲染目标上 拿到引擎的Flag,覆盖函数 为视口设置FSceneViewFamily 每英寸内像素的点数 当前视口是否支持HDR 设置焦点…

Writing an OS in Rust : Allocator Designs 分配器设计与实现

原文地址 为了保证概念的严谨性&#xff0c;翻译时保留了英文原文。 This post explains how to implement heap allocators from scratch. It presents and discusses different allocator designs, including bump allocation, linked list allocation, and fixed-size blo…

JAVA深化篇_34—— 全网最全JAVA多线程总结思维【不看保准后悔,可供下载】

全网最全JAVA多线程总结思维导图奉上&#xff1a;&#xff08;下载后为超高清图&#xff09; 文章上方提供PDF版本&#xff0c;有需要的小伙伴可以自取呦&#xff01;感谢小伙伴支持&#xff01;

浅谈能耗系统在马来西亚连锁餐饮业的应用

1.背景信息 Background 针对连锁餐饮业能耗高且能源管理不合理的问题&#xff0c;利用计算机网络技术、通讯技术、计量控制技术等信息化技术&#xff0c;实现能源资源分类分项计量和能源资源运行监管功能&#xff0c;清晰描述各分店总的用能现状&#xff1b;实时监测各供电回路…

python_寻找N字型下跌

目录 写在前面&#xff1a; 思路拆解&#xff1a; 代码&#xff1a; 验证&#xff1a; 写在前面&#xff1a; 1 由于日线骗线多&#xff0c;本文寻找N字型下跌形态在周线级别操作 2 N字型下跌形态&#xff0c;技术辅助寻找的点&#xff1a; 1&#xff09;左连阴 连阳 …

【加载自定义控制器 Objective-C语言】

一、接下来要做的操作,就比较关键了 1.前面,我们在从UI基础,然后到UI进阶,第一天,然后到目前为止, 所有的应用程序,新建的项目,启动以后,加载的控制器,是不是都是Main.storyboard里面带箭头儿的那个控制器, 然后呢,你也可以通过新建一个storyboard,然后呢,给它…

JavaScript_DOM概述

1、DOM 概述 2、节点 7种节点的类型&#xff1a; 3、节点树 4、Node.nodeType属性 不同节点的nodetype属性值和对应的常量如下&#xff1a;