Congestion意思为拥塞,一般是在后端PR阶段发现布局布线比较拥挤,可能会导致布线布不过去,出问题也无法做ECO。

Congestion也分为几种情况,我遇到的是Logic Congestion(更多关于后端Congetsion问题,查看文末参考文章),主要原因是RTL设计问题导致,这种问题的现象从后端看上去就是Cell数没多少,就是线密。

产生Congestion的主要原因
有限的面积下,电路面积过大。从一开始预估的面积与最后实际的面积有一定差距,导致该模块面积被限定的情况下,逻辑较多,绕线严重。

大位宽信号做选择逻辑。假如有一个信号定义为3万bit,然后它还需要送到几个模块去做选择器,从里面挑数,这样就是3万根线,连来连去,这样的设计必然有问题。这样惊人的设计最后怎么能用呢。只能说,工艺牛逼!

选择器太大。选择器的选择项多,设计复杂的情况下,难免会有选择器的选择项有大几十上百个的情况。

信号负载大。一个参数信号可能用到了很多地方,驱动数个像上面那样的大mux,这样的信号的负载会非常大。

组合逻辑路径长。组合逻辑路径长,时序比较紧的地方,工具会做一些优化增加绕线,这样的结果会加重后端拥塞。

以上问题会出现归根结底就是设计方案和方法的问题。

几个无效的尝试
怎么解决,假设一个前提,时间紧迫,如果对时序逻辑进行大的改动,需要调试的时间较长,严重时造成项目delay。在不改变时序的情况下,只对组合逻辑进行优化。

**模块划分重构,目的是想减少模块之间的耦合度,重新划分,把耦合度强的模块放到接近,模块的层级调整,比如三级模块变二级模块。**但是,从后端布线上看,其实看不出模块边界,关联度高的模块甚至会揉在一起的,工具自动按元器件关联较近的方式布局布线,甚至会把你一个模块分成距离很远的两部分。这样修改可以减少耦合度,有效果但不明显。

大mux拆分成小mux。**将单一的大mux拆分成多级小选择器,每一级之间用寄存器打断。但是,如果不用寄存器打断拆分,可能没啥用,因为工具也是这么做的。归纳可能会省去很多多余的分支。但在不改变时序的情况下做拆分基本无收益,因为只是在RTL级别上看的大mux写法的不同,实际上还是由众多小mux组成的。**

降低信号的负载,参数寄存器复制多份,送给不同的模块。数据通路的寄存器也可以进行复制,减少信号的负载。但是综合加max_fanout约束后,工具会自动插buffer和复制寄存器的操作,而且因为面积本身有限,时序的优化带来的收益还会被寄存器的增加所抵消。

总结一下,就是忙碌了半个月的硅农师傅,白忙活了。

有效的修改优化总结
**运算逻辑复用,节省面积给逻辑走线。**先选后比/加/乘/模块。

**乘法器模块的复用把打拍放在复用模块的输出,而不是传输到各个模块中才打拍,**节省寄存器开销,负载的问题,前面也说了,工具会自动插buffer和复制寄存器。

重定时(retiming)技术,改变寄存器的打拍位置,节省寄存器。

打断较复杂的组合逻辑,中间插入寄存器,时序变好,即使寄存器增多,面积(可能)反而会变小。

**大于1k的寄存器组使用,考虑用RAM替代,**但用RAM读取数据需要进行时序控制逻辑,并行度会降低。要求并行度高,可使用多个RAM。面积和速度永远是两个背道相驰的努力目标。所以要Trade Off(折中)

**后端喜欢,深度深,位宽小的RAM,**这样最后的bit/面积的值会更大。举例说明就是Depth128——Width16和,Depth16——Width128相比最后的面积大小,前者会比后者小很多。简单来说,后端喜欢细长的,不喜欢粗短的。

RAM也可以复用,前面计算用完空闲下来的RAM,可以复用起来。

交给后端同事吧(逃)。

转自:https://zhuanlan.zhihu.com/p/343811330

Verilog设计遇到了Congestion问题怎么办?相关推荐

  1. Verilog设计实例(8)按键防抖设计之软件防抖

    博文目录 写在前面 正文 背景介绍及回顾 单个按键 单按键的其他设计版本 多个按键 写在最后 参考资料 交个朋友 写在前面 个人微信公众号: FPGA LAB 个人博客首页 注:学习交流使用! 正文 ...

  2. Verilog设计实例(3)基于Verilog的单端口同步读写RAM设计

    文章目录 写在前面 正文 电路设计 行为仿真 交个朋友 写在前面 为什么要写单端口同步读写RAM呢? 没有那么多为什么?就是因为简单.基础,能清晰说明单端口RAM的原理,顺手给出设计,也能说明你的设计 ...

  3. Verilog设计实例(2)一步一步实现一个多功能通用计数器

    博文目录 写在前面 正文 普通的二进制计数器 电路设计 行为仿真 普通的格雷码计数器 电路设计 行为仿真 LFSR 电路设计 行为仿真 多功能计数器 电路设计 行为仿真 生成语句实现方式 电路设计 行 ...

  4. FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU

    FPGA学习之路--基于Verilog设计单总线8位ALU 定义 ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件, ...

  5. 堆栈verilog设计实现及仿真

    堆栈顶层模块设计代码如下: 使用verilog设计实现堆栈的写入和读出功能 工程及仿真如下: 代码设计如下: module stack(input wire clk, reset, push, pop ...

  6. (101)FPGA面试题-Verilog设计偶校验位

    1.1 FPGA面试题-Verilog设计偶校验位 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog设计偶校验位: 5)结束语. 1.1.2 ...

  7. (96)FPGA面试题-Verilog设计半加器

    1.1 FPGA面试题-Verilog设计半加器 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog设计半加器: 5)结束语. 1.1.2 本 ...

  8. (26)System Verilog设计自动饮料机

    (26)System Verilog设计自动饮料机 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog设计自动饮料机 1.自动饮料机基础知 ...

  9. (27)System Verilog设计UART接收

    (27)System Verilog设计UART接收 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog设计UART接收 1.UART接收 ...

  10. (28)System Verilog设计UART发送

    (28)System Verilog设计UART发送 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog设计UART发送 1.UART发送 ...

最新文章

  1. (西瓜书)#版本空间与样本空间
  2. hw叠加层开还是不开_HW叠加层是什么?
  3. 活动报名 | 6位技术女神关于智能技术的实践分享
  4. 【Flink】flink1.11报错No ExecutorFactory found to execute the application
  5. Spring8中lambda表达式的学习(Function接口、BiFunction接口、Consumer接口)
  6. python用小矩形标记数据点_Python – 在散点处绘制已知大小的矩形
  7. 网站被黑检测-网页挂马及暗链检测
  8. 8086汇编语言程序设计典型题目
  9. 前端静态页面——爱心捐赠网站
  10. 必要的系统组件未能正常运行,请修复Adobe Flash Player
  11. jQuery详细教程,基础内容罗列
  12. 三重积分的轮换对称性及极坐标形式确定上下限
  13. 投资理财-赚取平均收益
  14. Python爬虫之Spider类用法简单介绍
  15. 怎么快速学会Excel?每周学习5个实用小技巧
  16. python文本编辑器_python最好的ide和文本编辑器
  17. 无人机姿态表示方法及相互转换(欧拉角、方向余弦矩阵、四元数)
  18. 计算机学校教师培训方案,教师培训电脑多媒体实施方案
  19. Java缓存资料收集
  20. 解决Macos中Python Matplotlib库中文显示乱码问题

热门文章

  1. 数字化时代,如何做好用户体验与应用性能管理
  2. [渝粤教育] 西南科技大学 计算机文化基础复习资料
  3. 经典Bug永流传---每周一“虫”(九)
  4. 九大背包问题专题--背包问题求方案数
  5. 向往的生活之鸿蒙传承,《向往的生活5》播放量破6.43亿,张艺兴功劳大,《跑男》比不了...
  6. C++ Beep()演奏简谱的改进以及实现背景音乐
  7. OSPF 理论二 (赤诚善良 永远热爱)
  8. 大陆居民可以在香港汇丰银行开私人账户
  9. 燕山大学概率论复习资料
  10. Shiro学习01:使用Shiro实现身份管理和权限验证