当前位置: 首页 > news >正文

数字IC后端设计实现常见后端问题解析

今天给大家分享下咱们社区IC后端训练营学员提问的数字IC后端实现常见问题。

数字IC后端培训教程之数字IC后端项目典型问题解析

Q1: 摆放pin的一些问题,教程中有如下命令:editPin -pin mcu_top_data_0 -layer M3 -assign ($x $y) -pinWidth 0.10 -pinDepth 0.5 -global_location -fixOverlap 1 -fixedPin 1 -edge 5 -snap TRACK,我有如下问题:

a)对T28工艺,可放pin的layer层有哪些?

理论上能用于绕线的层都可以做为摆放pin的层。比如我们训练营项目有M1-M10。但由于高层最小线宽比较宽,因为我们尽量使用低层metal来摆放pin,比如M1-M6(M1和M2往往是rail metal,也不怎么用,怕有pg short)。

b)为啥把mcu_top_data_0放到M3 layer?

这里仅仅是示例,并没有严格限制。block level出pin用哪一层是灵活的,只要确保和top 连接得起来,没有drc即可。

c)如下六种典型pin该放哪层?VDD、VSS、Clock、Data、reset、set

没有严格限制。

c)pinWidth 可用范围?为何选0.10?跟所在层metal宽度一样?

pin width最小可以从0.05到metal的max width。但一般我们选择的是0.05和0.10两个档位。太宽反而在连接的时候容易有drc,而且也浪费更多的绕线资源。

d)pinDepth可用范围?为何选0.50

这个也是灵活的,一般选择0.5-0.7。metal有最小面积的约束条件,即pin width* pin depth要大于规则面积,否则会有drc。因此只要没有metal的min area drc即可。

e) 对于top design,io pad 也是分层放置的吗?

对于top level来说,io pad是一颗cell,需要手工摆放或者通过脚本来摆放。它是一颗cell,类似macro或IP,因此没有层的概念。

拓展:如果要求子模块的io port双层出pin,我们应该如何实现?clock port应该摆放在什么样的位置比较好?

数字IC后端经典笔试题IC秋招笔试题之时序报告解析

Q2:我自己分步长tree还有问题,比如common path仍然很短。能帮忙看看原因吗?

分步长出的tree:

所用本:/home/ic090/Desktop/mywork/scripts/456_cts_tree_test.tcl
我合并了04、05、06三个脚本并在里头加入了自己的修改
修改以aron为关键字可以搜到:

log: /home/ic090/Desktop/mywork/work/456_cts_test.log2
design: /home/ic090/Desktop/mywork/save/postCTS2.enc.dat

在这里插入图片描述
数字IC设计实现之分段长clock tree典型案例(clock tree synthesis)

看起来是guide buffer被删掉了。建议提供下端口号和密码做进一步分析。

innovus将pin设为ignore pin的命令是啥?

set_ccopt_property sink_type -pin $pin_name ignore

Q3: dont touch 是用来干什么的,和dont use有什么区别?

dont touch就是让工具不去优化所设置的net或者cell,而dont use则是告诉工具不去使用指定的lib cell类型。

place 阶段工具会有一步自动删除buffer tree,这样做的原因是什么?

在这里插入图片描述

因为设计上可能会有一些工具认为是冗余的buffer tree,所以工具一般在做之前会把这类buffer先删掉再做它的优化。目的是为了让数据更干净,优化效果会更好。如果设计上有一些buffer是不希望被工具优化的,可以通过设置dont touch来实现。

Q4: useful skew是在哪一步修timing用的啊?使用的时候怎么去设置?下图中说的向前后级路径借余量,是怎么借的,能举个例子解释一下吗?

在cts阶段使用,如果用的是innovus,那么ccopt自动会启动useful skew优化引擎来进行优化。

useful skew就是调整capture path或者launch path上的delay值,来实现先前或者向后借时序,比如后一级的timing path上面有5ns的余量,而前一级的timing path上面有5ns的违例,那么我们就可以做长一级timing path上面的capture path(相当于后一级timing path的launch path也做长了),那么后一级timing path上的余量就可以被前一级timing path给借走了,这样就可以使timing满足要求。

在这里插入图片描述

数字IC后端项目典型问题之后端实战项目问题记录(2025.04.24)

Q5: 数据流是不是只规定了stdcell的摆放并没有规定macro? 如下图所示module的分布是依照数据流摆放的,这些module位置的摆放工具是如何确定的?是通过脚本来摆的还是根据netlist定义好的?如何让同一module里的stacell集中摆放,不出现分散的情况?

macro也是需要根据数据流的走向来摆放的,可以看下下面这份文档,只不过macro是我们手动摆放的。

想要把某个module放置在一起,可以通过module constraint,比如添加region来实现。

https://alidocs.dingtalk.com/api/doc/transit?spaceId=5094368790&dentryId=45246066555&corpId=dingcd9df953ab4a15574ac5d6980864d335https://alidocs.dingtalk.com/api/doc/transit?spaceId=5094368790&dentryId=45246061469&corpId=dingcd9df953ab4a15574ac5d6980864d335

在这里插入图片描述

Q6: clock gate cell是用来干什么?

可以看下这篇推文。就是用来做时钟门控用。在时钟不用的时候可以把时钟关掉来节省时钟上的功耗。这个是面试经常会被问到的,需要引起重视。

https://alidocs.dingtalk.com/api/doc/transit?spaceId=5094368790&dentryId=45246111093&corpId=dingcd9df953ab4a15574ac5d6980864d335

下面(1)中route之后timing变差是因为place阶段设置的过于乐观导致的吗?下面(2)说的不太理解,是让工具在那个阶段看到violation,能举个例子解释一下吗?

另外涉及到clock uncertainty的设置,Foundary只会提供一个PT signoff的参考值。PR阶段的clock uncertainty值的取值取决于每个阶段的timing和PT看到timing的一致性。

(1)比如place阶段只有20ps violation,跑到ROUTE后pt看到有100ps violation,说明PR阶段留的margin不够,需要进一步让工具做时序优化。

(2)那想要让工具做优化就得让工具看到violation,那方法就是加大clock uncertainty(当然还有其他方法)。总之目的是让工具做最好的优化。所以clock uncertainty需要大家不断的去尝试修改。

route之后timing变差是因为place阶段设置的过于乐观导致的,那我们要让place阶段的timing更加悲观点,就是需要加大place阶段的clock uncertainty,让工具加大优化的力度。

在这里插入图片描述

Q7 : 什么是timing driven? congestion driven? SI driven ?

Timing driven是根据时序驱动来放置std cell或者绕线,工具会将有逻辑关系的cell放的近一些来满足timing。congestion driven是根据阻塞驱动来摆放std cell,这个时候工具不会将cell摆放的特别密,避免congestion过大而导致后续绕线绕不出去的问题。

可能初学者会觉得place阶段还没绕线,如何做congestion优化呢?那是因为place过程tool会通过global route来估算design中的绕线情况,从而根据估算的congestion状况来进行placement的优化。实际情况工具会在这两方面中间做一个trade off。

SI driven就是让工具在绕线的时候考虑串扰的影响,避免长距离并行绕线,避免SI的产生。

Q8: routeopt后max_transition的violation只有12ps,pt跑完sta后有30ps,跑完dmsa后,几乎没有了violation,但后面回到pr做完eco后会增加到三百多(如下图),不太清楚哪出问题了。

报告中第一个点u_ddata_bank2/CLK的max transition一看就是marco之间channel没有预留好导致插hold buffer被丢的比较远导致的。可以看下之前这个案例分享。

其他的点,比如Net net_PTECO_HOLD_NET583,它接了三个pin,分别是图中D[19],PTECO_HOLD_BUF13/I和PTECO_HOLD_BUF583/Z。有经验的人一看就是hold buffer被legalize太远导致的。建议把NET583选中就能一目了然。也可以选中那三个pin看飞线也可以的。

如果还有实践的问题,欢迎联系我们进行远程协助解决。

https://alidocs.dingtalk.com/api/doc/transit?spaceId=5094368790&dentryId=45246088387&corpId=dingcd9df953ab4a15574ac5d6980864d335

Q9: 请问有没有脚本可以把ICC2的时序报告分各个path group分别报出WNS和 TNS等信息?

report_qor可以实现
https://alidocs.dingtalk.com/api/doc/transit?spaceId=5094368790&dentryId=45246106289&corpId=dingcd9df953ab4a15574ac5d6980864d335

Q10: 《两个工具highlight timing path的方法》 用里面提到的方法在innovus里面高亮了timing path。但是只能高亮DATA line的部分。lunch clock和capture clock都不行。请问有什么办法把clock开始的完成路径高亮出来么?

用这个proc就可以报。下面的这篇文章介绍过这种方法,建议好好看下。

source hilite.tcl (这个脚本是一个proc,就是一个子程序)

hilitePath -report_timing_args $path -launch_clock_path
https://alidocs.dingtalk.com/api/doc/transit?spaceId=5094368790&dentryId=45246111074&corpId=dingcd9df953ab4a15574ac5d6980864d335

既然io相关的时序违例目前都不用管,是不是可以改一下sdc缓和一下,每次都报出来一大堆,看着很不方便。

如果In2Reg的group有很大的setup violation,我们可以通过slackAdjustment来调整slack。通过这个方法可以避免工具优化这部分假path而没有优化到真正需要优化的path。

setPathGroupOptions reg2out -slackAdjustment 0.2 -effortLevel low

setPathGroupOptions in2reg -slackAdjustment 0.2 -effortLevel low

比如原来reg2out的wns有-0.3ns violation,通过这个命令设置后工具会把-0.3ns+0.2ns 即-0.1ns作为这个group的WNS来做优化。其实就是做一个加法操作。

如果希望工具看到的WNS更大,那我们可以设置一个负值的slackAdjustment即可。

这个专题之前已经分享过了。

Q11: 想问一下这个读入顺序,正常不是先修drv吗?这里 是先修setup吗 这里是否应将所有的corner进行合并去重后,在吃进去?如果这样按单独corner直接插入是否会造成反复插入或者冗余的现象

这里并没有涉及到corner的概念。这个步骤是把pt的eco脚本转化成innvous能认的脚本(因为两家工具命令是完全不一样的)。转化后再把脚本直接读入innvous database。所以这里思路很清晰,把脚本分成hold,setup和transition fixing脚本。
dmsa出脚本时在fix_eco_drc或者fix_eco_timing时会涉及setup magin hold margin,这中margin设置的原则是什么?

这些值一般是经验值,可以直接参考。这里是告诉工具在修hold时要注意看setup margin,而且需要确保有30ps的setup slack才能去修这个hold 。因为我们知道修hold是要插hold buffer的,插多了是会把setup margin吃掉的甚至出现setup变差很多的情况。

http://www.lryc.cn/news/626543.html

相关文章:

  • 面试官视角分析与提问点
  • SpringBoot3 Ruoyi芋道管理后台vben5.0
  • 【Express零基础入门】 | 构建简易后端服务的核心知识
  • 【Java后端】Spring Boot 全局异常处理最佳实践
  • ssl代理
  • SED项目复现学习实录
  • Milvus 可观测性最佳实践
  • Linux高效备份:rsync + inotify实时同步
  • Clonezilla live 再生龙还原系统各个版本的不同
  • Jupyter Notebook 的终极进化:VS Code vs PyCharm,数据科学的IDE王者之争
  • 27.语言模型
  • Visual Studio 2010 简体中文旗舰版 安装全过程详解(附安装包下载)
  • 草稿链(CoD):提示词技术的新王者
  • 个人使用AI开发的《PlSqlRewrite4GaussDB(PLSQL自动转换工具)1.0.1 BETA》发布
  • 【考研408数据结构-09】 图论进阶:最短路径与最小生成树
  • 【Obsidian插件】HiNote
  • iOS开发之UICollectionView为什么需要配合UICollectionViewFlowLayout使用
  • 数据结构-有序二叉树
  • 【机器学习深度学习】Ollama、vLLM、LMDeploy对比:选择适合你的 LLM 推理框架
  • HTML应用指南:利用POST请求获取全国刘文祥麻辣烫门店位置信息
  • 学习threejs,打造宇宙星云背景
  • 数据结构 二叉树 二叉树链式结构的实现
  • 大规模IP轮换对网站的影响(服务器压力、风控)
  • 测试环境搭建和部署(在Linux环境下搭建jdk+Tomcat+mysql环境和项目包的部署)
  • 【39】OpenCV C++实战篇——直线拟合、直线测距、平行线段测距;(边缘检测,剔除噪点,轮廓检测,渐进概率霍夫直线)
  • 本地文件上传到gitee仓库的详细步骤
  • Wireshark捕获电脑与路由器通信数据,绘制波形观察
  • C语言第十章内存函数
  • python numpy.random的基础教程(附opencv 图片转数组、数组转图片)
  • Dog Tricks