文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点。点击进去后出现任何损失与社区无关。
在分享今天的技术主题之前,告诉大家一个好消息。年底了,很多小伙伴们又开始着手换工作了,因此,应各位邀请小编准备开始尝试IC 前后端招聘相关的业务服务。简单来说就是,各位如果想换个更好的工作,可以私信(微信号:ic-backend2018),小编会帮你出谋划策,避坑,做好职业规划甚至提供技术指导。最重要的是这项服务还是免费的,对的,你没有看错,完全不收费。目前仅面向吾爱 IC 社区 VIP 会员(知识星球用户)。
如果你相信认可小编,可以让小编来为你做好 IC 的职业生涯规划,早日实现年薪百万的目标。

好了,下面进入今天的主题。
前阵子分享如何在 innovus 中分析 clock tree latency 的合理性专题后,相信很多小伙伴应该都已经 get 到这种技能了,应该能独立分析一个相对简单时钟结构 block 的 clock tree latency,以及快速知道你 design 的 tree 应该长多长。
手把手教你如何在 Innovus 中分析 clock tree 质量
我们知道衡量时钟树的两大指标是clock tree latency和clock skew。那今天小编将继续教你如何分析 clock skew 的合理性。掌握好这两大技术指标后,你的技术水平可以甩别人好几条街。
Clock Skew 定义
Clock Skew 是指 max clock latency 和 min clock latency 的差值(Clock Tree Synthesis 后)。而 Clock Skew 又可分为Global skew和Local skew两大类。
Global skew 是泛指 design 中任意两个寄存器 latency 之差的最大值。
Local skew 是指 design 中两个相关寄存器 latency 之差的最大值。因此,在数字后端设计实现中,我们更多的是关注 local skew。因为 local skew 会直接影响到我们的时序(setup 和 hold)。
下图所示 FF1 和 FF2 的 Local skew 为 3 个 buffer 的 delay,即 150ps(本文假定一个 buffer delay 为 50ps)。FF3 和 FF4 直接的 Local skew 为 100ps。那么 Global skew 是不是 200ps 呢?

[思考题] 什么时候 global clock skew 会小于 local clock skew?

如何查看 Clock Skew
掌握了 Clock Skew 概念后,那在实际做项目过程中,我们该如何知道 clock skew 是多少呢?主要可以有下面几种方式:
从 log 中可以知道每个 stage 做完后的 skew 到底是多少,以及有多少比例是符合预期的 target skew。图中的ratio 为何那么低,各位猜猜是什么原因呢?

report_clock_tree
report_ccopt_clock_tree
有的时候你可能是通过报某条 path 来看 clock skew,但是需要注意的是这里的 clock skew 会偏大些,主要是因为它考虑了 derate,而 log 中和 clock tree report 中报出来的 clock skew 均不包含 derate。
所以,当有人问题 report_timing 和 report_clock_timing 有何区别的时候,可别再模拟两可了哦,大胆告诉他正确答案。
Clock Skew 多大是合理的?
知道了 clock skew 大小后,你如何知道它是否合理呢?比如当前 clock skew 是 120ps,你觉得合理吗,是否可以接着往下跑 flow 吗?clock skew 需要做到多小,取决于你的设计需求,没有统一的答案。比如 ddr 实现可能要求 skew 在 20ps 内,而普通模块则可以更宽松,一般 100ps 以内均属于正常范畴。
知道 clock skew 大小后,不要仅仅停留在这个值上面,它本身没有太多价值的信息,而是要通过分析得知当前 clock skew 值是何原因导致的?可否有进一步减少的空间?
Clock Skew 太大怎么办?
如果发现 clock skew 太大,我们可以通过分析找出偏大的原因,然后才能对症下药,解决问题。今天小编分享几种常见的原因。这几种情况基本上可以覆盖项目中的 90% 的情景,所以要认真看做好笔记哦。大家在做项目的过程中,可以通过逐一排查,一定可以找到 clock skew 偏大的原因。
不论是 C 家还是 S 家的工具,在长 tree 之前都会设置 target skew 值。这个值是告诉工具你的 clock skew 期望值是多少。一般情况下,建议设置 50-80ps 之间即可。如果你不小心将 target clock skew 设置成 250ps,那么工具最终做出来的可能就会在 250ps 左右。这个就有点像 flow 中对 max transition 的约束一样。
这种情况也比较常见,主要原因是 constraint 不完备导致的。一个典型的情况是当你看 hold violation 时发现有 500ps violation,乍一看就是 clock skew 严重不 balance 导致的。仔细分析后发现原来 capture clock path 上有一堆的 data。这种情况小编称之为 data 和 clock 互穿或交叉。解决方法要么是disable timing arc,要么就是设置 clock sense。
这种场景乍一看是不是有点晕,没关系,多看多实践,不懂来小编知识星球多提问多交流,久而久之就自然懂了!
时钟树上一般是由 Clock buffer,clock inverter,icg,mux 和一些 AND/OR 等组成的。所以需要检查 flow 中用于长 tree 的 inverter 种类,检查可用的 icg 驱动强度有哪几档,以及检查时钟分频电路上用的 AND/OR 的选型。
这种情况相当常见,典型的案例是 memory 内部有 clock tree。这段内部的 clock tree 是体现在它的 lib 中,表现为 min_clock_path 和 max_clock_path。

从 lib 中可以看到这颗 memory 内部就存在至少 100ps 的 skew。所以当遇到这种情况,如果不做特殊处理,长好 tree 后 clock skew 可能高达 300ps。如果你去硬修 hold violation,一方面可能是 hold buffer 会插爆,另外一方面是浪费 leakage 和面积。
所以,你可以打开你 memory 的 lib 看看是否有 interal 的 clock tree 定义。那么怎么解决呢?很简单,将这类 marco 的 clk设置一个 floating pin 为 0 的值,让工具不要管内部的那段 clock skew 即可。

当一个 pin 既有 sequential arc 又有 combinational arc 时,library compiler 会产生一个内部的 checkpin,用于区分这两种 arc。以下图为例,U5 的 lib 中会有一个 interal 的 checkpin。默认情况下,工具长 Tree 时会把 U5/CK,U5/checkpin 和 U52/U53 的 CK 都当成 sink 来做 balance,从而导致比较大的 clock skew。
当遇到这种情况,可以通过下面的命令告诉工具将这个点 exclude 掉来解决 clock skew 偏大的问题。
set_clock_tree_exceptions -non_stop_pin U5/CKcheckpin1
所以,如果你的设计中是带有子模块的,当出现子模块的 checkpin 时,可以检查下抽 ETM 的环境,大部分情况是 ETM 抽取存在问题。

如果 clock tree 上某个 high fanout net 被设置成dont touch 或者 ideal network,那么工具就无法解这个 fanout,从而会导致这个分支 delay 特别大。
好了,今天的内容分享就到这里。另外,因为公众号更改推送规则,小编分享的每篇干货不一定能及时推送给各位。为了避免错过精彩内容,请关注星标公众号,点击 “在看”,点赞并分享到朋友圈,让推送算法知道你是社区的老铁,这样就不会错过任何精彩内容了。
如果你想和小编有更进一步的沟通交流的机会,欢迎加入小编知识星球,让我们一起学习成长,共同进步。相信在这里能让你成就一个更完美的自己。
小编知识星球简介(如果你渴望进步,期望高薪,喜欢交流,欢迎加入 ****):
在这里,目前已经规划并正着手做的事情:
ICC/ICC2 lab 的编写
基于 ARM CPU 的后端实现流程
利用 ICC 中 CCD(Concurrent Clock Data)实现高性能模块的设计实现
基于 ARM 四核 CPU 数字后端 Hierarchical Flow 实现教程
时钟树结构分析
低功耗设计实现
定期将项目中碰到的问题以案例的形式做技术分享
基于 90nm 项目案例实现教程(ICC 和 Innovus 配套教程)
数字 IC 行业百科全书
吾爱 IC 社区知识星球星主为公众号” 吾爱 IC 社区” 号主,从事数字 ic 后端设计实现工作近八年,拥有55nm,40nm,28nm,22nm,14nm等先进工艺节点成功流片经验,成功tapeout 过三十多颗芯片。
这里是一个数字 IC 设计实现高度垂直细分领域的知识社群,是数字 IC 设计实现领域中最大,最高端的知识交流和分享的社区,这里聚集了无数数字 ic 前端设计,后端实现,模拟 layout 工程师们。
在这里大家可以多建立连接,多交流,多拓展人脉圈,甚至可以组织线下活动。在这里你可以就数字 ic 后端设计实现领域的相关问题进行提问,也可以就职业发展规划问题进行咨询,也可以把困扰你的问题拿出来一起讨论交流。对于提问的问题尽量做到有问必答,如遇到不懂的,也会通过查阅资料或者请教专家来解答问题。在这里鼓励大家积极发表主题,提问,从而促进整个知识社群的良性循环。每个月小编会针对活跃用户进行打赏。
最重要的是在这里,能够借助这个知识社群,短期内实现年薪百万的梦想!不管你信不信,反正已经进来的朋友肯定是相信的!相遇是一种缘分,相识更是一种难能可贵的情分!如若有缘你我一定会相遇相识!知识星球二维码如下,可以扫描或者长按识别二维码进入。目前已经有 750位星球成员,感谢这750童鞋的支持!欢迎各位渴望进步,期望高薪的铁杆粉丝加入!终极目标是打造实现本知识星球全员年薪百万的宏伟目标。

欢迎关注 “吾爱 IC 社区”
微信号:ic-backend2018

我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复