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

news2025/3/13 2:37:09

什么是组合逻辑环路?

        组合逻辑环路(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

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

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

        如果组合逻辑环路的出现是符合我们的预期设计目的的(比如随机数发生器),想将其保留该如何操作? 

        这种情况只要在约束文件中添加这一句即可:

set_property ALLOW_COMBINATORIAL_LOOPS TRUE[get_nets<myHier/myNet>]

        <myHier/myNet> 表示反馈回路上的一个节点,一般EDA工具都会指出这个节点,我们只要复制替换就好了。这条约束语句的意思告诉EDA工具,这条组合逻辑反馈环路是在我的设计预期内的,你可以不用对其进行分析了,更不要发警告来烦我!


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

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

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

相关文章

【开源分享】基于Html开发的房贷计算器,模仿新浪财经

房贷计算器是一种房贷计算的在线计算Web应用&#xff0c;按用户选择的贷款类型、贷款金额、期限、利率可计算得出每月月供参考、支付利息、还款总额这些信息。本文模仿新浪财经开发的房贷计算器。 作品预览 https://fangdai.gitapp.cn 源码地址 https://github.com/geeeeeee…

Qt5.12.12构建64位QMYSQL数据库驱动“driver not loaded”

在调用QSqlDatabase::open()时,会报错:“driver not loaded” 原因实际上是mysql 的驱动 qsqlmysql.dll 没有成功加载。 所以本篇文章将详细介绍一下:Qt5.12.12如何构建64位QMYSQL数据库驱动。 执行 写在最前,以下出现的文件路径为我自己电脑安装的路径,可根据自己的路…

vim快捷指令

普通模式—>插入模式 i:插入到当前光标的前面&#xff08;insert&#xff09; a:插入到光标的后面&#xff08;append&#xff09; o:插入到下一行 I:插入到行首 A:插入到行尾 O&#xff1a;插入到前一行 H:行首 L:页的最后一行的行首 W:光标跳到下一个单词词首 b:上一个单…

广州华锐互动:VR模拟高楼层建筑应急逃生,提供身临其境的虚拟体验

随着城市化进程的不断加速&#xff0c;高层建筑越来越多地出现在我们的生活中。然而&#xff0c;高层建筑的安全问题也日益凸显。一旦发生火灾、地震等突发事件&#xff0c;如何迅速、安全地逃离高楼成为了人们关注的焦点。近年来&#xff0c;虚拟现实&#xff08;VR&#xff0…

JUC并发编程——ForkJoin与异步回调

ForkJoin &#xff08;分支合并&#xff09; 什么是ForkJoin ForkJoin在JDK1.7出现 &#xff0c;并行执行任务&#xff0c;在大数据量下&#xff0c;能够提高效率 讯飞星火提供的说法&#xff1a; Forkjoin是一种并行计算的算法&#xff0c;用于将一个大任务分解为多个小任务…

【PSO-RFR预测】基于粒子群算法优化随机森林回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MinIO (三) 使用Webhook实时同步文件

前言 使用MinIO的过程中&#xff0c;我们这里遇到个需求&#xff0c;系统需要预览3D文件&#xff0c;前端操作&#xff0c;用浏览3D文件的工具打开3D文件的目录即可实现在线预览功能&#xff0c;这个时候问题来了&#xff0c;MinIO上传文件后进行了编译&#xff0c;如下图 这个…

ardupilot开发 --- 外设适配器、拓展外设、AP_Periph、DroneCAN 、UAVCAN 篇

什么是外设适配器&#xff0c;为什么要拓展外设&#xff1f; 飞控的外设接口有限&#xff0c;如串口只有8个&#xff0c;I^2C只有一个&#xff0c;CAN口只有一个&#xff0c;这些接口数量如果不能满足预期的传感器数量&#xff0c;那么就需要对这些接口进行拓展&#xff0c;外…

ELK日志分析系统的详细介绍与部署

文章目录 1. ELK的概述1.1 简介1.2 使用ELK的理由1.3 ELK的主要组件1.3.1 Elasticsearch1.3.2 Kibana1.3.3 Logstash1.3.3.1 简介1.3.3.2 Logstash常用相关命令选项 1.3.3.3 Logstash 的输入和输出流1.3.4 Logstash的相关配置文件 1.3.4 Filebeat1.3.4.1 简介1.3.4.2 filebeat …

【vue2高德地图api】01-创建应用,获取key值

系列文章目录 【vue2高德地图api】视频效果&#xff08;手机端&#xff09;先看这里 文章目录 系列文章目录前言创建key&#xff08;2个&#xff09;1.1进入控制台1.2进入应用1.3 创建应用1.4输入名称和类型2.1 添加key2.2 选择对应信息2.3 创建js key和服务端 key 总结 前言 …

数仓建设(一)

想了想&#xff0c;我们的数仓的建设是基于大数据平台进行的&#xff0c;中间也经历了比较曲折的过程。 每个行业都有自身的业务区别&#xff0c;不过很多还是比较相通的。 本文将全面讲解数仓建设规范&#xff0c;从数据模型规范&#xff0c;到数仓公共规范&#xff0c;数仓各…

vue3实现el-card的body的样式穿透

:deep(.el-card .el-card__body){padding-top:20px!important; }改el-card的body 将内容的padding变成上下左右都是20px el-card默认是上面为15px,其他左右下都是20px 详解源码vue3的样式穿透scope-CSDN博客

Linux系统中配置系统设置

在Linux系统中配置系统设置->网络设置代理的详细教程如下&#xff1a; 首先&#xff0c;确保您已经安装了NetworkManager和nmtui。在终端中输入以下命令&#xff1a; sudo apt-get update sudo apt-get install network-manager nmtui 打开系统设置。在桌面上点击“设置”…

多媒体应用设计师 第8章 多媒体应用的新技术

1.信息可视化技术 1.1.信息可视化的定义 信息可视化:将广泛存在的非具体数据以能满足人机交互的方式表达出使信息接收员可以方便的分析数据&#xff0c;找出数据规律&#xff0c;完成对信息的处理。信息可视化的两大基础:认知心理学和图像设计。 可视化方式分为:一维&#xf…

unigui添加ssl(https)访问的方法

首先到腾讯云或者阿里云去申请免费的证书&#xff0c;前提是在该服务商那有申请过域名&#xff0c;怎么找出这个界面&#xff1f;网页顶部一般都有个搜索框&#xff0c;输入【证书】或者【SSL】就能看到了&#xff0c;然后点击申请免费证书&#xff0c;把解析信息填入自己的域名…

新版本外国人永久居留身份证EST-100身份证阅读器接口更新

以下是新版本外国人永久居留身份证读取C#代码&#xff1a; //身份证信息 *******************************************************************************************************private void button4_Click(object sender, EventArgs e) { if (FormIsOpenReader.IsOpenR…

C语言-程序环境和预处理(2)--带副作用的宏参数,宏与函数的对比,#undef,条件编译,文件包含

前言 上一篇文章–《C语言-程序环境和预处理&#xff08;1&#xff09;》讲述了程序的翻译环境和执行环境&#xff0c;编译、连接&#xff0c;预定义符号&#xff0c;#define&#xff0c;#符号和##符号的相关知识。 链接: 《C语言-程序环境和预处理&#xff08;1&#xff09;》…

【Linux】详解Linux中的Makefile文件

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

idea无法通过vpn连接到数据库

本人之前遇到情况当打开vpn时&#xff0c;使用工具navicat可以连接到数据库&#xff0c;但是IDEA连接不到。这就很奇怪了&#xff0c;于是在网上大量搜寻解决方案&#xff0c;终于找到&#xff1a; 连接异常&#xff1a; 因为是Springboot项目&#xff0c;可以在启动类的配置…

SLAM从入门到精通(dwa速度规划算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 要说搜路算法&#xff0c;这个大家都比较好理解。毕竟从一个地点走到另外一个地点&#xff0c;这个都是直觉上可以感受到的事情。但是这条道路上机…