Verilog设计遇到了Congestion问题怎么办?
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问题怎么办?相关推荐
- Verilog设计实例(8)按键防抖设计之软件防抖
博文目录 写在前面 正文 背景介绍及回顾 单个按键 单按键的其他设计版本 多个按键 写在最后 参考资料 交个朋友 写在前面 个人微信公众号: FPGA LAB 个人博客首页 注:学习交流使用! 正文 ...
- Verilog设计实例(3)基于Verilog的单端口同步读写RAM设计
文章目录 写在前面 正文 电路设计 行为仿真 交个朋友 写在前面 为什么要写单端口同步读写RAM呢? 没有那么多为什么?就是因为简单.基础,能清晰说明单端口RAM的原理,顺手给出设计,也能说明你的设计 ...
- Verilog设计实例(2)一步一步实现一个多功能通用计数器
博文目录 写在前面 正文 普通的二进制计数器 电路设计 行为仿真 普通的格雷码计数器 电路设计 行为仿真 LFSR 电路设计 行为仿真 多功能计数器 电路设计 行为仿真 生成语句实现方式 电路设计 行 ...
- FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU
FPGA学习之路--基于Verilog设计单总线8位ALU 定义 ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件, ...
- 堆栈verilog设计实现及仿真
堆栈顶层模块设计代码如下: 使用verilog设计实现堆栈的写入和读出功能 工程及仿真如下: 代码设计如下: module stack(input wire clk, reset, push, pop ...
- (101)FPGA面试题-Verilog设计偶校验位
1.1 FPGA面试题-Verilog设计偶校验位 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog设计偶校验位: 5)结束语. 1.1.2 ...
- (96)FPGA面试题-Verilog设计半加器
1.1 FPGA面试题-Verilog设计半加器 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog设计半加器: 5)结束语. 1.1.2 本 ...
- (26)System Verilog设计自动饮料机
(26)System Verilog设计自动饮料机 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog设计自动饮料机 1.自动饮料机基础知 ...
- (27)System Verilog设计UART接收
(27)System Verilog设计UART接收 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog设计UART接收 1.UART接收 ...
- (28)System Verilog设计UART发送
(28)System Verilog设计UART发送 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog设计UART发送 1.UART发送 ...
最新文章
- (西瓜书)#版本空间与样本空间
- hw叠加层开还是不开_HW叠加层是什么?
- 活动报名 | 6位技术女神关于智能技术的实践分享
- 【Flink】flink1.11报错No ExecutorFactory found to execute the application
- Spring8中lambda表达式的学习(Function接口、BiFunction接口、Consumer接口)
- python用小矩形标记数据点_Python – 在散点处绘制已知大小的矩形
- 网站被黑检测-网页挂马及暗链检测
- 8086汇编语言程序设计典型题目
- 前端静态页面——爱心捐赠网站
- 必要的系统组件未能正常运行,请修复Adobe Flash Player
- jQuery详细教程,基础内容罗列
- 三重积分的轮换对称性及极坐标形式确定上下限
- 投资理财-赚取平均收益
- Python爬虫之Spider类用法简单介绍
- 怎么快速学会Excel?每周学习5个实用小技巧
- python文本编辑器_python最好的ide和文本编辑器
- 无人机姿态表示方法及相互转换(欧拉角、方向余弦矩阵、四元数)
- 计算机学校教师培训方案,教师培训电脑多媒体实施方案
- Java缓存资料收集
- 解决Macos中Python Matplotlib库中文显示乱码问题
热门文章
- 数字化时代,如何做好用户体验与应用性能管理
- [渝粤教育] 西南科技大学 计算机文化基础复习资料
- 经典Bug永流传---每周一“虫”(九)
- 九大背包问题专题--背包问题求方案数
- 向往的生活之鸿蒙传承,《向往的生活5》播放量破6.43亿,张艺兴功劳大,《跑男》比不了...
- C++ Beep()演奏简谱的改进以及实现背景音乐
- OSPF 理论二 (赤诚善良 永远热爱)
- 大陆居民可以在香港汇丰银行开私人账户
- 燕山大学概率论复习资料
- Shiro学习01:使用Shiro实现身份管理和权限验证