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

这篇具有很好参考价值的文章主要介绍了好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是组合逻辑环路?

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

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops),FPGA设计与调试,fpga开发,Xilinx,IC,FPGA,altera,组合逻辑环,组合逻辑环路,原力计划

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

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops),FPGA设计与调试,fpga开发,Xilinx,IC,FPGA,altera,组合逻辑环,组合逻辑环路,原力计划

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

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

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops),FPGA设计与调试,fpga开发,Xilinx,IC,FPGA,altera,组合逻辑环,组合逻辑环路,原力计划

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

  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

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops),FPGA设计与调试,fpga开发,Xilinx,IC,FPGA,altera,组合逻辑环,组合逻辑环路,原力计划

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

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops),FPGA设计与调试,fpga开发,Xilinx,IC,FPGA,altera,组合逻辑环,组合逻辑环路,原力计划

        组合逻辑环路警告: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

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops),FPGA设计与调试,fpga开发,Xilinx,IC,FPGA,altera,组合逻辑环,组合逻辑环路,原力计划

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

如何处理组合逻辑环路?

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

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

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

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops),FPGA设计与调试,fpga开发,Xilinx,IC,FPGA,altera,组合逻辑环,组合逻辑环路,原力计划

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

set_property ALLOW_COMBINATORIAL_LOOPS TRUE[get_nets<myHier/myNet>]

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

        这条约束语句的是用来告诉EDA工具的:这条组合逻辑反馈环路是在我设计预期内的,你可以不用对其进行分析了,更不要发警告来烦我!文章来源地址https://www.toymoban.com/news/detail-713005.html


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

到了这里,关于好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】Verilog:组合逻辑电路应用 | 数码管 | 8421BCD编码 | 转换七段数码管段码

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:数码管的使用 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月03日
    浏览(47)
  • FPGA设计编程(一) 组合逻辑

    目录 【实验要求】   【实验软件工具】 【实验一】设计一个16位二进制全加器模块 1. 实验内容与原理说明 2. 实验模块程序代码和激励代码 3.仿真波形图 4.门级电路图 【实验二】用层次化设计方法,设计一个16位二进制全加器模块 1. 实验内容与原理说明 2. 实验模块程序代码

    2023年04月27日
    浏览(26)
  • [FPGA 学习记录] 简单组合逻辑——多路选择器

    封面来源:Multiplexer 在本小节中,我们将使用 Verilog 语言描述一个具有多路选择器功能的电路,目的是学会使用 Verilog 语言实现简单的组合逻辑 本小节的主要内容分为两个部分:一个部分是理论学习,在这一部分我们会对本小节涉及到的理论知识做一个讲解;另一个部分是实

    2024年02月03日
    浏览(34)
  • FPGA | 组合逻辑中的竞争与险象问题

    建立时间 (Setup Time):在时钟跳变前数据必须保持稳定的时间。 保持时间 (Hold Time):在时钟跳变后数据必须保持稳定的时间。 如果建立时间或保持时间不满足,数据将不能进入触发器。 当一个门的输入有两个或两个以上的信号发生改变时,由于这些信号是经过不同路径产生的

    2024年02月04日
    浏览(39)
  • 尽量避免删改List

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年02月03日
    浏览(42)
  • Go 重构:尽量避免使用 else、break 和 continue

    else 操作 例如,我们有简单的用户处理程序: 如果没有提供用户,则需要将收到的请求重定向到登录页面。If else 似乎是个不错的决定。但我们的主要任务是确保业务逻辑单元在任何输入情况下都能正常工作。因此,让我们使用提前返回来实现这一点。 逻辑是一样的,但是下

    2024年02月06日
    浏览(56)
  • 【FPGA】组合逻辑电路三种建模方式(Verilog HDL 门级建模、Verilog HDL 数据流建模、组合电路行为级建模)

    目录   Verilog HDL 门级建模 各种逻辑门的表示和使用 门级建模书写实例 Verilog HDL 数据流建模 数据流建模 数据流建模书写实例 组合电路行为级建模 always语句 条件语句 多路分支语句 循环语句 for while repeat forever 行为级建模示例   可以理解为对逻辑电路中各个门依次进行描述

    2024年04月13日
    浏览(47)
  • 【FPGA】Verilog:模块化组合逻辑电路设计 | 半加器 | 全加器 | 串行加法器 | 子模块 | 主模块

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:加法器   ​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月15日
    浏览(47)
  • 《More Effective C++》《基础议题——2、尽量使用C++类型的风格转换》

    类型转换是一般程序员所不能忍受的,但是在紧要关头,类型转换是必须的。C风格的类型转换太过简单,粗暴,不能进行精确的类型转换;为了弥补C转换上功能的不足,C++提供了四种常用的类型转换来应付复杂的转换需求。 static_cast用于在编译时执行类型转换,主要用于相

    2024年01月18日
    浏览(39)
  • 【FPGA】基本实验步骤演示 | Verilog编码 | 运行合成 | 设备/引脚分配 | 综合/实施 | 设备配置 | 以最简单的逻辑非为例

    写在前面: 本章的目的是让你理解与门、或门和非门的行为,并使用 Verilog 语言实现多输入与门、或门和非门。在生成输入信号之后,你需要通过模拟来验证这些门的操作,并使用 FPGA 来验证 Verilog 实现的电路的行为。 0x00 引入:与门、或门与非门 构成数字系统电路的最基

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包