innovus中path group 的策略和应用(上)

在所有的后端工具里边,有三个重要的引擎:auto-place,CTS,auto-route三个。这里边的auto-place是决断了整个设计时序的基点。由于,auto-place的动作是在设计的preCTS阶段,所以这里的设计时序就是广义上说的:数据路径(datapath)时序(timing )。当然,就算是到了CTS/route阶段后,也可以继续利用auto-place数据优化的功能,在数据库上做数据路径增量优化(optDesign -increment)。可以说,数据路径的优化手段,实际上是贯穿在整个后端流程上的。

这里结合过往的经验,以及invs特有的先进策略,一起来看看,数据路径优化里边的重要知识点:路径分组(path group)。看看这其中的奥妙和有趣的事情。ICer GO!

image-20240317144409907

众所周知,无论是综合工具(DC、genus或者precision等)抑或是APR工具(icc、icc2或者invs等),数据路径优化(data path optimization)一直是影响时序质量的重要因素。由于综合使用了ideal clock,可以说,data path的优化就是综合阶段的主要工作,这个和后续的APR工具的第一个主动作:auto-place,形成了前后连贯,相辅相成。尽管这两个引擎和所处工具的位置不同,但是目标是高度一致:优化数据路径的时序。这也是最近两年聚合型R2G工具大行其道的一个重要原因。

  • S家的Fusion Compiler: DCG + ICC2
  • C家的iSpatial: genus + innovus

无论什么工具,数据路径优化(data path optimization)一直是基于路径分组(path group)进行的,想要提高数据路径优化就需要了解路径分组(path group)的理论。

经典路径分组(path group)理论

在经典的数据路径优化理论(主要是基于S家,因为DC是综合界的长期主导),对于数据路径优化,DC采用了基于**时钟域(clock domain)**的方式进行处理:每一个时钟域都会被工具判定为一个路径分组(path group)

路径分组(path group)的基础知识

PS:虽然最新的DC也提供了基于违例(violation)和设计层次(hierarchy)的自动路径分组(path group)创建命令;create_auto_path_groups ,但是这个命令只是一个补充性的,并没有动摇S家传统的路径分组方式。

S家的这种分组方式对用户是很友好的,基本就是将SDC的create_clockcreate_generate_clock命令直接翻译成了group_path 命令,映射关系见下表:

SDC命令类group_path命令comment
create_clock PCLK1group_path -to $FF_under_PCLK1主clock
create_generte_clock -name gen_clk1_pclk1 -master PCLK1 -add -pin ......group_path -to $FF_under_gen_clk1_pclk1分频clock
create_generte_clock -name gen_clk2_pclk1 -master PCLK1 -add -pin ......group_path -to $FF_under_gen_clk2_pclk1分频clock
create_clock PCLK2group_path -to $FF_under_PCLK2主clock
create_generte_clock -name gen_clk1_pclk2 -master PCLK2 -add -pin ......group_path -to $FF_under_gen_clk1_pclk2分频clock
create_generte_clock -name gen_clk2_pclk2 -master PCLK2 -add -pin ......group_path -to $FF_under_gen_clk2_pclk2分频clock

这个简单的映射方法,有两个潜在的问题:

  • 如果有gen-clock的存在,按照时钟传播理论,那么主clock和gen-clock会同时送达同一个FF
  • 如果有多个主clock存在,跨时钟域路径(cross domain data path)处理方式

利用下图,来解释一下这两个问题:

image-20240317120114721

  • 基于SDC层叠(cascade clock)理论,所有的FF都是使用离它最近的clock或者gen-clock,所以上述的FF1~FF4都是使用了gen-clock,所以这些FF都只会被归为gen-clock的domain
  • 默认情形,SDC里边所有的clock都是做同步(synchronous)关系处理,除非用户单独指定,命令是:set_clock_groups -group $PCLK_1_GRP -group $PCLK_2_GRP [-physically_exclusive| -logically_exclusive| -asynchronous

所以,使用下面的SDC命令,DC/SDC 就可以明确每个FF所归属的时钟域和同步时序关系了:

create_clock/clock_generate_clock
set_clock_groups ......

基于路径分组的优化策略

前边说过,这种方式最大的优势就是方便,除过声明clock domain之间的同步、异步等关系,用户不用再做其他设定,工具就可以处理后续的事宜。

基于上,整个S家的R2G流程都是使用上述的path group 理论进行时序优化的。基本流程如下:

  • 基于path group进行WNS优化,同时兼顾TNS。(工具总是基于WNS来进行优化,这样才能有效的提高整体设计质量。相反只要TNS的重要新并非那么高了)
  • 默认的path group具有同样的优先级(weight),除非用户指定。对于具有优先级区别的路径分组,工具会在出现修复冲突的时候,使用优先级进行解冲突(conflict)

所以这里会衍生出一个新的问题,譬如下图:

image-20240317113442003

对于上述路径,FF2会在同一个clock domain下有两个路径,FF1->FF2和SRAM1->FF2,如果此时有下列情景:

  • FF1-> FF2 violation -1ns
  • SRAM1-> FF2 violation -0.5ns

基于WNS理论,由于-1ns的存在,这个时候工具就不会去做SRAM1->FF2的timing修复。但是用户可能更为关注的是SRAM1->FF2的violation,所以通常的做法就是使用group_path进行再次分组,譬如:

group_path -name GRP1 -from FF1 -to FF2
group_path -name GRP2 -from SRAM1 -to FF2

这样就会产生两个平行的组,工具都可以看到他们的TNS,所以大概率的结果会是下面的结果:

FF1 -> FF2SRAM1 -> FF2
分组前-1ns-0.5ns
分组后-1ns-0.3ns (可能好于分组前)

这个做法很常用,并且对S家的流程也很有好用,但是这里提高SRAM->FF2的代价是跳过了FF1->FF2优化,也就是说整个数据库的WNS(-1ns)并没有发生变化。

但是最近使用了invs后,对invs的分组理论进行了学习和理解,发现了一个新思路,很有趣。

invs 路径分组(path group)的新思路

C家的R2G流程,基本还是沿用了S家的时序分析基本理论,基于SDC是标准的时序约束交付数据,C家严格遵循,除过一些猫叫咪的名词差异(leading/tailing等),核心的理论是完全一样的。

PS:这里要给C家点赞,确实S家在前端和中端的统治地位不容撼动,打不过我就加入,这个也是顺应当下的商业策略的。

近似的,C家的时序路径的优化也是基于path group的WNS的,WNS优先级大于TNS。

传统路径分组(path group)的挑战

在读入SDC后,某些FF会继承一个或者多个clock domain的属性,这种比较常见,相应的描述可以参见S家的这个变量

image-20240317115458591

这个变量默认是true,也就是说无论是S家还是C家,对于这种一个FF上有多个clock的情形默认是可以直接支持的,这样也对RTL/SDC的设计提供了尽量大的宽容度,一个图例如下:

image-20240317115938585

譬如这里的FF1,就会有两个clock到达:gen_clk1_pclk1和gen_clk2_pclk1,按照传统S家的路径分组理论,FF1会被分别归入到gen_clk1_pclk1和gen_clk2_pclk1两个分组,按照默认方式,下面的path就有可能形成一个冲突(conflict)

	FF0 -> FF1  vs FF2-> FF1

image-20240317120522613

S家的工具默认的行为就是对每一个组进行修复,组合组之间不做一致性合并(merge),如果在FF0->FF1和径FF2->FF1的数据路径优化发生分歧(conflict),如果两个path’ group优先级恰巧又一样,S家的工具只能确保一个结果会好一点,这是因为:数据路径的修复在同一时间只能关注一个数据分组(path group)

这个情形在设计中非常常见,如果使用了传统分组,一个风险就是:**同样重要的时序很有可能不会同时被工具优化到最好。**所以,在借鉴了S家的分组方式,C家提出了自己的分组方式思想:基础路径分组(BPG:BasicPathGroup)

BasicPathGroup (BPG)的理论和特点

基于上述传统路径分组的优劣势,C家提出了一个新的思路:在传统路径分组的基础上,叠加一层新马甲(wrapper):BasicPathGroup (BPG)。通过BPG这个wrapper,可以较好的解决传统路径分组的短板。

这里看一下S家的时序分析理论,任何工具对时序质量的统计都是基于终点的(endpoint,EP),这个是所有STA工具评判时序质量的统计基础。但是由于时钟交叠(clock domain overlap)的情景,会导致在一个EP,产生多个report_timing的结果(multi path group per FF),同时也会让place_opt的引擎遇到类似的局面:一个单一FF,会同时出现多个path group的分组

与其继续深耕,不如化繁从简(PS:这个确实是C家长期坚持的一个策略:简单就是美好),使用BPG,破除传统的基于clock domain的路径分组(path group),让每个EP回归到原本应该就应该有的形态:独一性(unique)

使用BGP的方式,在上述情境下,FF1只会归为一个path group,这样就可以缓解传统路径分组的冲突(conflict)困扰。

默认invs流程,会使用BPG的方式进行分组,这里会有两类明确的组:

  • reg2reg: 沿触发时序逻辑到沿触发时序逻辑
  • reg2cgate:沿触发时序逻辑到电平触发的时序逻辑

除过上述两个组,其余所有未被覆盖的组都被工具称作default。所以,一个数据库,在invs里边的默认BGP的加持下会有这样的情形:

all = reg2reg + reg2cgate + default

当然,这里边并非说明:all 就等于设计里边的reg + cgate的数量总和,这是因为:如果你的设计里边有了IO 时序约束,那么大概率会有IN2REG或者REG2OUT的类型,这样:all >= reg_count + cgate_count

默认,在同为Effort High的路径分组下,invs给出了自己的权重配比:reg2reg > reg2cgtage > default

采用的BGP分组:invs工具无论在何种情形下, 每一个reg,cgate都只有唯一的最高优先级的主分组,这个会给基于TNS修复方式的place 引擎解放了手脚,大大提升了修复结果。

当然,如果用户自己明确知道数据库里边有IO的时序路径,并且需要关注,也可以使用下列命令进行配置,

createBasicPathGroups   -expanded

设计里边的组会有下面的加总公式:

all = default + reg2reg + reg2cgate + in2reg + reg2out + in2out

invs也会配置一个合理的默认优先级,具体如下:

reg2reg > reg2cgate  > default > [in2out | reg2out | in2reg]

C家这里的默认处理还是很合理的。这个也符合用户的常规需求。

使用BGP模式的时候,在optDesign的过程中,工具会根据系统情形,对 reg2reg、reg2cgate 等组进行逐个优化,基于每个BGP分组,对于所有隶属于High Effort path group的最差的TNS group进行优化: optDesign always work on worst(TNS_grp_1 … TNS_grp_n)'s group

每个组的WNS的EP进行优化的原则是:无论这个EP属于那个clock domain,invs只会去做到这个EP最差的路径优化

这个方式,在multi-clock per FF情形,或者复杂fanin的timing path的情形,是可以得到更好的优化结果,因为在同一时间的优化是绝对专注的,不会有其他的同优先级的path group的path出现。所以,在默认情况下,invs就会得到不差于传统path group分组方式的结果。
C家通过BGP的wrapper,巧妙的处理了复杂数据路径优化种的冲突问题,让工具可以更为专一的进行优化,而不是把精力浪费在了仲裁(arbiter)和path group反复迭代(iteration)上。

usefulSkew + BGP:时序修复的双杀

众所周知,invs里边有很强大的usefulSkew技能,此技能贯穿了auto-place,CTS和auto-route等阶段(PS:这里要注意,usefulSkew只是追加,不能替代原有的三大引擎)。

如果当使用BGP后,每个EP都有了独一的最高优先级的path group,这样invs在调节usefulSkew上的计算量(compute consume)会大幅降低。因为每一个path的skew调节,都需要工具去评估这个path原有的margin才能做出判断,如果一个EP分属于不同的组(但是是同优先级的组),每个组在这个EP的slack形态大概率不一致,工具需要数倍的计算时间和依赖考量(dependency),互相牵制,工具只能选择在那个修复瞬间的最优解,但是,随着path group被不断被轮询修复(repair iteration),上一次的usefule的修复方式,可能已经过时(out-of-date),这样数据就会形成相互牵制(lock),类似一个状态机(SM),但是它无法自收敛,最终随着data path optimization的圈数达到极限(iteration limit),数据的状态就有点中间态的意味,不太会达到一个好的收敛度。

拥有了BGP的usefulSkew,就像插上了翅膀的马达,由于依赖度的大幅度降低,可以专注clock skew的调优工作,这个时候才能把usefulSkew的性能彻底释放出来。

和所有的工具命令一样,BGP也不是完全丝滑,譬如:由于可读性和命令一致性的原因,针对BGP,invs也在report_timing的命令里边做了一些变通处理,这个后续会讲到。

未完待续 (To be continued ) …

【敲黑板划重点】

在这里插入图片描述
path group是data path optimization的数据分类基石,理解其中的理论可以有助于优化命令和设计流程。

参考资料

Synopsys Design Compiler® User Guide
Cadence Innovus User Guide

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HDFSDATANODE数据传输详解

本文主要阐述datanode中一个socket连接接收字节流的构成,帮助datanode的接收与处理数据。注意hadoop版本为3.1.1。 写在前面 Datanode本质上也是TCPServer,一般的TCPServer接到客户端请求以后会分配一个线程处理,对于Datanode而言&#xff…

npm、nodejs和vue之间关系和区别介绍

本文讲解npm、Node.js和Vue.js这三者之间的关系和区别,以及它们各自的特点。 首先,让我们来了解一下Node.js。 **Node.js** 是一个开源的服务器端运行环境,它允许开发者使用JavaScript来编写服务器端的代码。在传统的Web开发中&#…

[ROS 系列学习教程] rosbag Python API

ROS 系列学习教程(总目录) 本文目录 1. 构造函数与关闭文件2. 属性值3. 写bag文件内容4. 读bag文件内容5. 将bag文件缓存写入磁盘6. 重建 bag 文件索引7. 获取bag文件的压缩信息8. 获取bag文件的消息数量9. 获取bag文件记录的起止时间10. 获取话题信息与消息类型 rosbag 的 Pyt…

【Java探索之旅】运算符解密 位运算,移位运算

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java入门到精通 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、位运算符1.1 按位与 &1.2 按位或 |1.3 按位取反 ~1.4 按位异或^ 二、移位运…

快速排序算法,简洁,易懂

目录 代码实现(java): 一、首元素作为基准值 图: ​编辑 基本思路: 代码: 代码补充说明: 二、中间元素作为基准值 代码: 参考学习文章: 今天我们不刷力扣了,…

Java Web项目—餐饮管理系统Day07-套餐管理(二)

文章目录 1. 套餐的分页查询2. 更新套餐![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/209298cf3b4349c5a2fed56a3d33350e.png)第一步, 依据套餐id查询到套餐的基本信息以及关联菜品信息.第2步, 将请求数据进行保存(更新). 3. 批量的停售启售 这部分开发剩下的部分…

CSS Module

CSS Module的作用:将CSS样式作用域限制在特定的组件范围内,以避免全局样式污染和命名冲突。 Vue中如何实现样式模块…

SVN修改已提交版本的注释

目录 一、需求分析 二、问题分析 三、解决办法 一、需求分析 ​开发过程中,在SVN提交文件后,发现注释写的不完整或不够明确,想再修改之前的注释文字​。 使用环境: SVN服务器操作系统:Ubuntu 20.04.6 LTS SVN版本&…

物理隔离条件下,如何安全高效地进行内外网文件导入导出?

内外网文件导入导出通常指的是在内部网络(内网)和外部网络(外网)之间传输文件的过程。这在企业环境中尤其常见,因为内部网络通常包含敏感数据,而外部网络(如互联网)则允许更广泛的访…

计算机网络实验——学习记录

1. tun/tap模块:为Linux系统提供网络虚拟功能,tun位于网络OSI模型的三层(网络层),tap位于网络的二层(数据链路层)。 1.1 验证是否包含tun/tap模块:modinfo tun; 1.2 验…

8:00面试,8:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到9月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

echarts散点图自定义tooltip,鼠标放上去展示多行数据

先放效果图 如图,就是鼠标悬停在散点上(这里的散点我替换成了图片,具体做法参考这篇文章:echarts散点图的散点用自定义图片替代-CSDN博客)时,可以展示多行数据。之前查找资料的时候,很多用字符串…

封装哈希表

本文旨在讲解哈希表的封装,我们以哈希桶的结构来进行封装unorderedmap/set。要想实现封装哈希表,我们首先得先将哈希表的结构给搭建出来,然后再根据哈希桶的结构进一步封装unorderedmap/set! 下面我们先来实现哈希桶的结构&#x…

12_Linux内核结构

Linux内核结构 1.内核的主要组成部分 Linux 内核主要的 5 个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。在系统移植的时候,它们是内核的基本元素,这 5 个部分之间的关系,如图所示: 进程调度&#…

V-JEPA模型,非LLM另外的选择,AGI的未来:迈向Yann LeCun先进机器智能(AMI)愿景的下一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

小怂爱水洼DFS

分析: 非常明显的搜索问题,当时我在写的时候遇到了两个问题,就一直没过。 1.忘记判断临界条件,x,t不能越界的问题; 2.最后有两个案例一直不能过,就是因为我用的int型的接受结果范围太小了&#…

前端学习从0到1第一天:初见html

阅读须知: 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者 本人负责,作者不为此承担任何责任,如…

【C++中日期类的实现】

一路,一路,一路从泥泞到风景............................................................................................... 目录 前言 一、【什么是日期类】 二、【代码实现】 1.【Date.h】部分: 2.【Date.cpp】部分:…

关于ffmpeg height not divisible by 2的错误

在我们线上视频生产过程中,我们用ffmpeg对视频做了resize,讲原有的分辨率resize到1280p,使用了参数 -vf "scale1280:-1",作用是将原始视频宽度缩放成1280,-1是指高度等比例缩放。 之前一直运行的好好的&…

储能技术发展

一、政策背景 “十三五”是我国储能产业化发展的起点。自“十四五”之后,各类储能支持政策更是以极快的速度不断更新完善。 2023年1月17日,工业和信息化部等六部门发布了《关于推动能源电子产业发展的指导意见》,其中明确提出要在2025年实现…