INVS 对时钟二分频器(reg-clkgen)的理解和处理

在时钟树的设计中,有很多方式处理分频时钟,常见的无外乎两种模式:

  • 时钟二分频器(reg-clkgen)
  • 门控时钟

二者在功能上略有不同,比较的大差异是前者可以简单的实现50%占空比,后者却对功耗友好同时降低了实现难度。这里结合INVS在CTS的手法,一起了解一下INVS对二者的处理差异。闲言少叙,ICer GO!

在这里插入图片描述

就后端工具而言,CTS是其三大引擎之一,在当下设计的高工艺、高性能的背景下,CTS的重要性越来越凸显,之前项目一键通的CTS方式,已经越来越不能满足日益提升的QoR诉求了。

INVS ccopt 系统简介

INVS在useful skew显然具备强大的优势,其中的ccopt flow,拥有灵活,高效和用户友好等多种特性,其独特的思维方式,给用户在CTS阶段提供了更多的选择和漂亮的QoR数据。

从SDC到ccopt系统转化,让INVS采用一种类似数字孪生(digital twins)的方式,将SDC里边的相关命令,一一映射到ccopt系统中,主要来自于下列三个主命令:

  • create_ccopt_clock_tree <=> create_clock
  • create_ccopt_generated_clock_tree <=> create_gernerated_clock
  • set_ccopt_property <==> other CTS setup

通过这种转义/隔离,巧妙的将ccopt构建成一个CTS warpper,将CTS的实现和SDC进行隔断。这样做的好处有以下几点:

  • SDC里边的配置和设定,可以在ccopt系统里边进行修正和调整,而无需读入CTS专用的SDC
  • CTS的配置通过导出可读文件进行抽取,继承和维护:create_ccopt_clock_tree_spec
  • ccopt_design开始之前,可以灵活使用set_ccopt_property 命令干预ccopt的实现方式,而不用担心对原生的SDC产生影响。

用户可以在CTS阶段,放心大胆的使用ccopt系统。鉴于INVS是全局useful skew策略,即使在CTS之后,用户任然可以使用ccopt命令对CTS结构进行微调(modify),这样在后续的useful skew流程中,INVS仍然会使用ccopt引擎对相关的数据进行调整。

时钟传播的单调性

CTS的实现中,无论是ICC/ICC2还是INVS,都会强调;unate(单调性)

  • unaet:单调传播:譬如:正向单调性的buffer,反向单调性的inveter

  • none-unate:非单调传播:XOR,MUX,FF

具体解释详见博主老文;门控时钟检查(clock gating check)的理解和设计应用(上)

由于每一个sink(sequential leaf)的时钟都是单沿触发(正沿或负沿),CTS阶段的重要目标就是计算每一个sink的latency,从而对用户的max_skew进行收敛,所以这个传播的单调性(unate)对CTS的影响就很明显:

image-20240503160306114

可以看到,在FF1的传播路径上,CLK时钟是正单调性,这样计算CLK-> FF1’CK的路径的时候CTS工具会只会看正沿。但是到了CLK->FF2’CK的路径上,由于XOR的none-unate特性,CTS工具计算latency的时候需要同时关注正相关和负相关的两种情况,在late和early的两种corner的影响下,这个计算量会成倍的增加,同时也会对实际的clock tree做了悲观化。因为实际情况下:XOR的enable大概率是一个半静态信号,这个会间接提高CTS的难度。由于设计的不明确性,可以用过约束来归类这种问题。

时钟二分频器(reg-clkgen)和CG

从上述时钟CTS实现的角度来看,基于寄存器的时钟二分频器(reg-clkgen)是典型的none-unate器件,而通常的CG则是一个典型的unate器件。所以,从时钟树构建的上看,CG是一个被推荐的时钟网络结构,但时钟二分频器(reg-clkgen)不是的。

由于CG的结构类似下列:

image-20240503163614279

通常CG的尾部是一个or或者一个and,在std-lib中,这两类门很常见,通常会有很多种驱动类型,这种正是CTS需要的风格:功能单一,驱动多样,这个对于构建CTS会非常友好。

反观寄存器,相较or/and,不会有这么多的选择类型,加之延迟较大,这个也会间接影响clock latency的质量

时钟二分频器的CTS实现

对于传统的组合逻辑,CTS实现无非面临两种选择:

  • 单调性传播:AND,OR,CG, BUF, INV
  • 非单调性传播:MUX、 XOR 。、

这样的传播的简单之处在于:由于是组合逻辑,时钟可以一路传播,不会被阻挡。但是对于采用寄存器实现的时钟二分频器(reg-clkgen),由于FF在CTS的传统理解下是属于一个sink器件,时钟的传播会自动在sink器件截止,所以任何穿越FF的时钟都需要用户单独定义。

# root clock
create_clock -name CLK [get_port CLK] -period 1 -waveform {0 0.5}
# generated clock
create_generated_clock -name gen_clk1 -source [get_port CLK] -divided_by 2 -master_clock [get_clock CLK]  [get_pin FF1/Q]

image-20240503173533846

对于上述拓扑结构,CTS的难点不在于divided信号,而在于gen_clk1_enable。

众所周知,从CLK向下看,FF1/FF_A/FF_B同属于CLK domain,但是由于FF1的特殊性,会导致FF1‘D上的时序会成为一个gen_clk1时钟路径上的检查点,这个有点像clock gating检查,但又不全是。

对于传统的CG检查,INVS有自己独到大处理方式。对于这类检查,INVS提供了一个有趣的配置选项:

image-20240503174148569

这个extract_clock_generator_skew_groups的选项是说:

如果配置为true(default value),那么ccopt在创建clock_tree_spec的时候,除过正常的基于clock的-auto_sink模式进行skew_group创建,还会基于ff_clkgen结构的分频时钟(时钟二分频器)再独立创建一个使用 _clock_gen打头的新的skew_group,这个SG会包括这个ff_clkgen的所有fanin以及它自己,和原始的SG相比,这个SG拥有更高的优先级。

create_ccopt_skew_group -name CLK_SG -source clk -auto_sinks
create_ccopt_skew_group -name _clock_gen_CLK_FF1_SG -source clk -sinks {FF_A FF_B FF1} -rank 1

这种处理方式需要用户格外注意,如果用户拥有类似下列更为复杂的拓扑结果,INVS默认的处理方法可能并不适用于你的设计:

image-20240503181443638

由于这里会有下列的timing path

  • FF_A/FF_B -> FF1
  • FF_A/FF_B/FF1 -> FF3/FF4

从CTS角度而言,上述FF需要统一做平,如果使用了默认的INVS处理方式,可能会产生意想不到的结果。如果不想使用默认SG的处理方式,请将这个变量设定为false。

个人理解**:从INVS而言,上述拓扑结构应该是不是一个典型的设计:既然已经是ff_genclk的enable信号了,那么就应该是一个类似半静态信号,这个不应该是一个关键路径,反言之,这个半静态信号,更应该专注于gen_clk1的生成,而非其他用途。同样FF1既然是一个gen_clk的定义点,那就不应该出现clk2data的情形。一个比较合理的设计应该类似下图:**

image-20240503181520101

但是,在当今百家争鸣的年代,已经很少看到有人可以静下心来仔仔细细的研究coding style了,这个时候还想TO,那么灵活运用后端工具进行补刀,可能是一种适应当下情景的变通方式吧。

【敲黑板划重点】

image-20240503184222477

灵活使用ccopt,而不是简单的一路回车,可能会去的意想不到的收获

参考资料

Cadence Innovus User Guide

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

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

相关文章

找不到msvcp120D.dll无法继续执行代码的7个有效解决方法分享

在探讨msvcp120D.dll之前&#xff0c;首先需要明确的是&#xff0c;这个特定的动态链接库&#xff08;DLL&#xff09;文件属于Microsoft Visual C 2013的调试版本&#xff08;标记为"D"&#xff0c;代表Debug&#xff09;。这意味着它主要用于开发环境中的调试目的&…

【Linux】进程的隔离和控制:namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程&#xff0c;同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

腾讯云IM即时通信引入(React Web端组件式)

开发环境要求 React ≥ v18.0 &#xff08;17.x 版本不支持&#xff09; TypeScript node&#xff08;12.13.0 ≤ node 版本 ≤ 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0&#xff09; npm&#xff08;版本请与 node 版本匹配&#xff09; chat-uikit-react 集成 …

链表(基于C语言单向链表)

链表的实现的思想 链表表示一种是基于链接结构的线性表&#xff0c;链表实现的思想如下&#xff1a; 1、将表中的元素分别储存在一批独立的储存块里面。 2、表结构中的结点都能找到与之相关的下一个结点。 3、在前一个结点里用链表的方式显示的记录与下个结点之间的关联。 链…

STM32标准库编译流程

导入库函数 在ST官方固件库中找到STM32F10x_StdPeriph_Lib_V3.5.0.zip文件&#xff0c;解压&#xff0c;打开Libraries,接着打开STM32F10x_StdPeriph_Driver文件夹&#xff0c;继续点击src&#xff0c;看到库函数源文件&#xff1a; 将其复制到keil建立的工程的文件中&#xf…

SNR: Signal to Noise Ratio

https://www.xx.com/watch?vmyrZ_R6xIZA Fang, Y., Armin, A., Meredith, P. et al. Accurate characterization of next-generation thin-film photodetectors. Nature Photon 13, 1–4 (2019). https://doi.org/10.1038/s41566-018-0288-z Wang, F., Zhang, T., Xie, R. e…

抖音直播植物大战僵尸杂交版v1.2安装包—可用于抖音直播

植物大战僵尸杂交版是由玩家自制的一款改版游戏。在这个版本中&#xff0c;各种类型的植物都被融合成了全新的形态。比如&#xff0c;向日葵和阳光菇可以产出更多的阳光&#xff0c;坚果墙和火炬树桩合体成为能抗能辅的超级植物等等。这些融合植物种类繁多&#xff0c;各具特色…

从不平凡Image文件夹,自定义读取img和label,构造dataset

问题描述 torchvision.datasets.ImageFolder 假定&#xff1a;子文件名子文件夹的图像的标签 但在KDEF文件夹中&#xff0c;子文件夹下有所有的类&#xff0c;不宜用ImageFolder读取path来得到dataset My 实现&#xff1a; # how to build dataset? from torch.utils import …

AI-数学-高中-47导数与几何意义

原作者视频&#xff1a;【导数】【考点精华】7导数与几何意义考点解析&#xff08;基础&#xff09;_哔哩哔哩_bilibili 该点处切点的斜率 该点处导函数的值 示例1&#xff1a; 导数问题解决最常用方法&#xff1a;参数分离&#xff0c;在左边函数有解的值域范围内。 示例2&…

Netty 网络编程深入学习【一】:ByteBuffer 源码解析

ByteBuffer源码阅读 ByteBuffer是一个用于处理字节数据的缓冲区类。它是Java NIO 包的一部分&#xff0c;提供了一种高效的方式来处理原始字节数据。 ByteBuffer 可以用来读取、写入、修改和操作字节数据&#xff0c;它是一种直接操作字节的方式&#xff0c;比起传统的 InputSt…

基于Spring Boot的在线BLOG网设计与实现

基于Spring Boot的在线BLOG网设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页管理界面&#xff0c;用户经过登录前台首页查看通…

【UnityRPG游戏制作】Unity_RPG项目_玩家逻辑相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

HSDB使用教程

HSDB&#xff1a;Hostspot Debugger&#xff0c;JVM内置的工具&#xff0c;用于深入分析JVM运行时的内部状态 启动HSDB java -cp D:/tools/jdk-1.8/lib/sa-jdi.jar sun.jvm.hotspot.HSDB 获取进程id jps 连接到指定进程 查找类 通过查询查找对象 输入查询语句 select d from …

100/篇论文修改?提高营收从拒绝客户开始

进入4月份以来新进询盘客户可谓惨淡&#xff0c;为了完成业绩突破我接了一个并不擅长的订单&#xff0c;最终失败赔钱收场&#xff0c;痛定思痛我决定拒掉不可靠的项目&#xff1a; 不熟悉的领域 超出团队承载范围的 低价绝对低价的项目 今天收到客户询盘我非常的开心&#…

【Java EE】多线程(二)Thread 类与常用方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

直播素材安卓情侣飞行棋v2.22 仿dofm 支持自定义模式—可用直播素材

一个情侣间增进友谊的小游戏非常好玩&#xff0c;适合男孩女孩之间增进感情&#xff01;快和你暗恋的女孩一块玩吧&#xff0c;极速升温 永久免费&#xff01;解锁激活码内容全部畅玩&#xff01;全网最强超级给力&#xff01;真人说书音频 网盘自动获取 链接&#xff1a;http…

重要综述!全文翻译!宫鹏教授、陈镜明教授、梁顺林教授等《Nature Climate Change》!

2013年&#xff0c;由宫鹏教授、陈镜明教授和梁顺林教授等联合发表了一篇《Nature Climate Change》综述文章&#xff0c;其主题是卫星遥感在全球变化中的作用研究。&#xff08;已被引510次&#xff0c;来源谷歌学术&#xff09;。 卫星遥感方式对于气象问题、大气、陆地和海洋…

【机器学习】集成方法---Boosting之AdaBoost

一、Boosting的介绍 1.1 集成学习的概念 1.1.1集成学习的定义 集成学习是一种通过组合多个学习器来完成学习任务的机器学习方法。它通过将多个单一模型&#xff08;也称为“基学习器”或“弱学习器”&#xff09;的输出结果进行集成&#xff0c;以获得比单一模型更好的泛化性…

【中断】【ARM64】学习总结

optee中的异常向量表解读–中断处理解读 https://mp.weixin.qq.com/s/gBsy4YDYTHGRsy2zcVr6Vg