文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点。点击进去后出现任何损失与社区无关。
最近陆续收到不少小伙伴们的私信,提到初学者应该如何快速学习掌握dbGet的用法。对于习惯了S家的命令后,乍一看dbGet是不是觉得脑袋瓜都要炸了?的确是这样的,小编第一个项目刚用innovus的时候也有这种感觉。第一次用小编想要去get到一颗buffer都不会,好尴尬。这么丢脸的事情怎么要说出来呢。
其实刚开始不会,一点都不丢脸。如果一直持续不会下去,那才是真的丢脸。很多小伙伴经常私信,抱怨某些专题很难,学不会。每当看到这些信息,小编都会劝他们并抛出一句话。这句话是“世上无难事,只怕有心人”。
即便再难学的东西,看一遍不会,继续看第二遍,第二遍看不懂继续看第三遍,一直这样重复下去,小编不相信有搞不定的问题。在这个过程中可能大脑时不时会告诉自己这个太难了,太枯燥了,搞不定等等信息。所以只要你不被大脑发出的这些干扰信息所影响,你就一定能够成功(这个方法小编不轻易告诉别人的哦)。
所有成功的背后都意味着无数的汗水,没有人能够随随便便就优秀的,所有优秀的背后一定是蓄谋已久的。
吾爱IC社区已经为你们提供了让你足够优秀的基础条件,包括各种培训资料,各种技术干货,各类技术问答,EDA环境,甚至都提供了各种项目案例。所以只要你用心,假以时日想不牛都困难。
下面为innovus floorplanning的test case教学案例,需要的小伙伴们可以前往小编知识星球下载。
OK,今天小编将分享数字IC后端实现Innovus dbGet常用的命令。好好理解掌握每个命令的用法后,你也能够熟练应用了。Let’s Go!
列出设计中所有unplace的instance
dbGet [dbGet -p top.insts.pStatus unplaced].name
列出设计中所有place的instance
dbGet [dbGet -p top.insts.pStatus placed].name
列出设计中所有fix的instance
dbGet [dbGet -p top.insts.pStatus fixed].name
select_obj [dbGet top.insts.pstatus fixed -p]
那么,ICC/ICC2中如何get到所有fixed cell呢?
get_cells -hierarchical -filter "is_fixed == true"
列出block io端口terminal所用的layer
dbGet top.terms.pins.allShapes.layer.name
列出设计中的non default rules (NDR)
dbGet head.rules.name
report_routing_rules (ICC)
列出某条net的route rule
dbGet [dbGet -p top.nets.name netName].rule.name
有的时候我们对某些net设置一个special net rule后,想查看是否设成功了,可以通过这个命令来实现。对于很多net的情况,可以foreach循环来实现。
获得某个/选中instance的pStatus信息
dbGet [dbGetInstByName instName].pStatus
dbGet selected.pstatus
instance的pStatus有unplace,placed,fixed,cover,softfixed四种属性。在Innovus中如果cell有fix属性,那么这颗cell的边框会比较粗。典型的cell,比如有tapcell,endcap和寄存器等cell。
避免特定multibit寄存器被拆分(debanking)
dbSet [dbGetInstByName ].dontSplitMultibit 1
避免特定multibit寄存器被合并(banking)
dbSet [dbGetInstByName ].dontMergeMultibit 1
吾爱IC社区之前推送过低功耗设计实现中一些方法,其中有个专题就是讨论如何在DC综合和APR阶段利用Multibit Reg来做低功耗实现。Multibit reg通常有2bit,4bit,8bit等情况。具体使用哪种需要前期做好PPA评估再定方案。
选中出设计中的所有hard blockage
select_obj [dbGet top.fplan.pBlkgs.type hard -p]
获得方形routing blockage的坐标
dbGet top.fplan.rBlkgs.shapes.rect
获得多边形routing blockage的坐标
dbGet top.fplan.rBlkgs.shapes.poly
列出设计中用到的所有cell类型
dbGet -u top.insts.cell.name
获得 block/memory的placement halos大小 (block包括memory)
dbGet [dbGet -p2 top.insts.cell.subClass block*].pHaloTop
dbGet [dbGet -p2 top.insts.cell.subClass block*].pHaloBot
dbGet [dbGet -p2 top.insts.cell.subClass block*].pHaloLeft
dbGet [dbGet -p2 top.insts.cell.subClass block*].pHaloRight
获得 block routing halos大小和最低最高层
dbGet [dbGet -p2 top.insts.cell.subClass block*].rHaloSideSize
dbGet [dbGet -p2 top.insts.cell.subClass block*].rHaloBotLayer.name
dbGet [dbGet -p2 top.insts.cell.subClass block*].rHaloTopLayer.name
确认所有的1’b0和1‘b1都练到tie cell,而非直接连接到VSS和VDD
dbGet top.insts.instTerms.isTieHi 1
dbGet top.insts.instTerms.isTieLo 1
如果都有tie cell,那么命令执行后应该返回0X0。如果返回值是其他值,那么可以继续使用下面的命令找出需要加tie cell的instTerms。
dbGet [dbGet -p top.insts.instTerms.isTieHi 1].name
dbGet [dbGet -p top.insts.instTerms.isTieLo 1].name
get所有连接到tie cell的instTerm名字
dbGet [dbGet -p [dbGet -p2 top.insts.cell.subClass coreTieLo].instTerms.net.allTerms.isInput 1].name
更改net的route属性(比如从 FIXED 到ROUTED)
dbSet [dbGet -p top.nets.name netName].wires.status route
获得设计的状态
dbGet top.statusIoPlaced
dbGet top.statusPlaced
dbGet top.statusClockSynthesized
dbGet top.statusRouted
dbGet top.statusRCExtracted
dbGet top.statusPowerAnalyzed
列出某条net所用到的layer
dbGet [dbGet -p top.nets.name netName].wires.layer.name
fix某条net的shape
dbSet [dbGet -p top.nets.name netName].wires.status fixed
选中某条net的shielding net
dbSelectObj [dbget [dbget -p [dbGet -p top.nets.name $net].shieldNets.name GND].sWires.shieldNet.name $net -p2]
在PR实现中对于高速时钟信号,通常都需要加shielding来消除crosstalk。有的时候即便加了shielding net,pt中依然发现有若干ps的crosstalk,那么此时可以通过选中victim net的shielding vss net来进一步分析。
CRPR能补偿crosstalk吗?
get到特定cell name (ref name)的所有instance
dbGet [dbGet -p2 top.insts.cell.name cellName].name
get library中特定cell name的size
dbGet [dbGetCellByName cellName].size
列出设计中所有clock net
dbGet [dbGet -p top.nets.isClock 1].name
Note: 执行这句命令前,需要先做timeDesign。
如何在Innovus中做好Clock Tree Synthesis?
将包含特定关键词clk的所有instance选中,设置成fix属性
dbSet [dbGet –p top.insts.name *clk*].pStatus fixed
select_obj [dbGet [dbGet top.insts.name *clk* -p].name]
获得特定route_type的最高层和最低层
dbGet [dbGet -p head.routeTypes.name routeTypeName].topPreferredLayer.num
dbGet [dbGet -p head.routeTypes.name routeTypeName].bottomPreferredLayer.num
get database units
dbGet head.dbUnits
get the manufacturing grid
dbGet head.mfgGrid
获得所有的physical only cell,比如filler cell, endcap cell和tapcell等
dbGet [dbGet -p top.insts.isPhysOnly 1].name
获得 Dont Touch instances:
dbGet [dbGet -p top.insts.dontTouch true].name
获得database中所有Dont Use cells
dbGet [dbGet -p head.libCells.dontUse 1].name
获得JTag elements
dbGet [dbGet -p top.insts.isJtagElem 1].name
获得所有 spare instances
dbGet [dbGet -p top.insts.isSpareGate 1].name
get 特定instance的pg pin
dbGet [dbGet top.insts.name $instName -p ].pgInstTerms.name
get特定instance的pg连接关系
proc getInstPGConnect {c} {
set inst [dbget -p top.insts.name $c]
puts “PG connection of instance $c:”
foreach PGT [dbget $inst.pgCellTerms.name] {
puts “\tPin : $PGT --> Net: [dbget [dbPGTermNet [dbGetPGTermByName $inst $PGT]].name]” }
}
Example:
getInstPGConnect u_mmu_vir_top/mult_x_12/U821
PG connection of instance u_mmu_vir_top/mult_x_12/U821:
Pin : VSS --> Net: VSS
Pin : VDD --> Net: VDD_cpu
Pin : VBP --> Net: VDD
Pin : VBN --> Net: VSS
选中包含特定module name的所有memory或hierarchy module
selectInst [dbGet [dbGet top.Inst.subClass block -p2].name ]
get到某个module中的所有sequential cell
selectModule
dbGet [dbGet selected.insts.cell.isSequential 1 -p2].name
get到指定net driver的instance name和cell name
set netName netName
set inst [dbGet [dbGet -p [dbGet -p top.nets.name $netName].allTerms.isOutput 1].inst]
Puts "Net: $netName, driving inst name: [dbGet $inst.name], driving cell name: [dbGet $inst.cell.name]"
列出cell某个pin的所有layer
dbGet [dbGet -p selected.cell.terms.name pinName].pins.allShapes.layer.extName
get到die area/选中boxes的polygon和面积
dbShape -output polygon [dbGet top.fPlan.boxes]
dbShape -output polygon [dbGet selected.boxes]
dbShape -output area [dbGet selected.boxes]
get top level term pin坐标和layer number
lindex [dbGet [dbGet top.hinst.hinstTerms.term.name - p].pins.allShapes.shapes.rect] 0
dbGet [dbGet top.hinst.hinstTerms.term.name -p].pins.allShapes.layer.num
get到cell的max cap信息
set cellPtrList [dbGet -p head.allCells.name *BUF*]
foreach cellPtr $cellPtrList {puts "[dbGet $cellPtr.name] [dbFTermMaxCap [dbGet -p $cellPtr.terms.name termName] 1]"}
找出包含特定属性的所有instance
set inst_ptrs [dbGet -p top.insts.props {.name == "myProp" && .value == "xyzzy"]
Puts "Instances with property myProp and value xyzzy: [dbGet $inst_ptrs.name]"
找出设计中非clock ports
dbGet [dbGet -p [dbGet -p2 top.terms.net.isClock 0].isInput 1].name
get到设计中tech site相关信息
dbGet head.sites.name
dbGet head.sites.size
dbIsTechSiteVDDOnBottom [dbGet head.sites.name -p]
得到physical only类型的cell (well tap, tie hi/lo, filler, endcap/decap)
dbGet [dbGet -p head.libCells.subClass ].name
dbGet [dbGet -p head.libCells.subClass coreWellTap].name
dbGet [dbGet -p head.libCells.subClass coreTieHigh].name
打印出设计中所有module名字
foreach module_name [dbGet top.hInst.treeHInsts.cell.name] {
Puts "$module_name"
}
Get 到设计中所有leaf cells
foreach leaf_name [dbGet -u top.insts.cell.name] {
Puts "$leaf_name"
}
给选中instance设置dont touch属性
select_obj [dbGet top.insts.name LS* -p]
foreach term [dbGet selected.instTerms.net.term –e] {
set_dont_touch [dbGet $term.net.name] true
}
Skip routes hierarchical hard macro nets
proc skiproutesOnHmsNets {hmInstPattern} {
deselectAll
selectInst *$hmInstPattern*
dbset selected.hinst.hnets.net.skipRouting 1
deselectAll
}
针对某些不想让工具绕线的net,可以通过设置skipRoute选项来实现。不过值得注意的是,这个操作存在一定风险。如果后续要对这些net进行eco,那么这条net可能会是open net。
不过即便出现open,我们也有办法解决。通过将这些net的skipRoute属性改成0,然后再单独绕这些net。这样的解法也是非常完美的。
删掉macro身上的信号走线
foreach c [dbGet [dbGet -p2 top.insts.cell.baseClass block].name] {
set j [dbGet -p top.insts.name $c ]
dbSelectObj [dbQuery -area [dbGet $j.box ] -objType regular]
puts "Deleting object at [dbGet $j.box ] within Block [dbget $j.name]"
editDelete -selected -type Signal -use SIGNAL
}
get到设计中非power的via数量
llength [dbGet [dbGet -p top.nets.isPwrOrGnd 0].vias]
get设计中memory的latency值
set mem_pin [dbget [dbget top.insts.cell.name *RAM* -p2].instTerms.name *CLK]
foreach i $mem_pin {
puts "$i [get_property [get_pins $i] actual_latency_late_rise_max]"
}
得到设计中所有直接将reset连接到VSS的flop数量,instance name和ell name
setPreference CmdLogMode 1
# output file name:
set ofile "flop_with_tied_rst.rpt"
set ecofp [ open $ofile w ]
set cnt [llength [dbGet [dbGet [dbGet top.nets.name $VSS_name -p].instTerms.cellTerm.name $RSTport -p2 ].inst.name ]]
set insts [dbGet [dbGet [dbGet top.nets.name $VSS_name -p].instTerms.cellTerm.name $RSTport -p2 ].inst ]
set cnt2 [llength $insts]
puts $ecofp "Total: $cnt $cnt2"
#foreach inst_ptr [dbGet [dbGet [dbGet top.nets.name $VSS_name -p].instTerms.cellTerm.name $RSTport -p2 ].inst ]
foreach inst_ptr $insts {
set inst_name [dbGet $inst_ptr.name]
set cell_ptr [dbInstCell $inst_ptr]
set cell_name [dbGet $cell_ptr.name]
set rst_port [dbGet $inst_ptr.instTerms.cellTerm.name $RSTport -p2]
set net [dbGet $rst_port.net.name]
puts $ecofp "$inst_name $cell_name "
}
close $ecofp
}
好了,今天的内容分享就到这里。如果你比较有心,我相信你会想着整理一份S家对应命令汇总,那就赶紧去做吧!如果小编的分享对你有所帮助,帮忙点击“在看”并转发给你的朋友,算是对小编的一点帮助。
小编知识星球简介(如果你渴望进步,期望高薪,喜欢交流,欢迎加入):
在这里,目前已经规划并正着手做的事情:
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后端设计实现领域的相关问题进行提问,也可以就职业发展规划问题进行咨询,也可以把困扰你的问题拿出来一起讨论交流。对于提问的问题尽量做到有问必答,如遇到不懂的,也会通过查阅资料或者请教专家来解答问题。在这里鼓励大家积极发表主题,提问,从而促进整个知识社群的良性循环。每个月小编会针对活跃用户进行打赏。
最重要的是在这里,能够借助这个知识社群,短期内实现年薪百万的梦想!不管你信不信,反正已经进来的朋友肯定是相信的!相遇是一种缘分,相识更是一种难能可贵的情分!如若有缘你我一定会相遇相识!知识星球二维码如下,可以扫描或者长按识别二维码进入。目前已经有680位星球成员,感谢这680童鞋的支持!欢迎各位渴望进步,期望高薪的铁杆粉丝加入!终极目标是打造实现本知识星球全员年薪百万的宏伟目标。