热度 2|
ECO optional timing
作者:贾柱良
最近在做一个SOC的芯片,在这过程遇到一个奇怪的问题是eco单元在nanoRoute没法布线,而且是百思不知其解.事情是这样的,这个soc项目后期了,p2r 之后的网表给电路人员去仿真,发现有点问题需要修改,起初前端工程师的想法是:修改RTL代码,从新综合网表然后在P2R,这样整个设计从新跑一次,别的不说这肯定工作量比较巨大,后来我跟前端电路工程师了解电路修改的方案,总的修改的不是特别的多,我提出了自己的建议,思路是这样的,首先修改RTL代码,然后根据RTL代码与之前的P2R的netlist网表用formality做形式化验证,通过逻辑锥比较不匹配的点,直接修改逻辑功能netlist,只要形式化验证通过,就可以确保逻辑功能正确,这样可以节省大量的时间.每想到这哥们采纳了我的建议,这哥们的水平还真不是一般的,没隔一天就把网表修改好了,并交到后端组来了.
修改的内容大致如下:
XXX/XXX/U12 dffs (.CLK(fe_clk1), .D(ic_1), .Q(out1), .S(rst1))
修改成XXX/XXX/U12 dffr (.CLK(fe_clk1), .D(sio_1), .Q(out1), .R(rest1))
大概ECO有7个这样类似的单元要修改,其中有两种方法可以修改下面分别介绍这两种方法.
方法1:在encounter中手工修改
detachTerm XXX/XXX/U12 CLK fe_clk1(断开fe_clk1 与 CLK pin)
detachTerm XXX/XXX/U12 D ic_1 (断开ic_1与 D pin)
detachTerm XXX/XXX/U12 Q out1 (断开out1 与 Q pin)
detachTerm XXX/XXX/U12 S rst1 (断开rst1与 S pin)
deleteInst XXX/XXX/U12 删除这个dffs
下面是添加dffr单元
addInst -inst XXX/XXX/U12 -cell dffr -loc 1000 1000 (在坐标1000 1000原来dffs单元的位置添加dffr目的是减少部分连线的net的长度,有利于时序收敛)
attachTerm XXX/XXX/U12 CLK fe_clk1
attachTerm XXX/XXX/U12 D sio_1
attachTerm XXX/XXX/U12 Q out1
attachTerm XXX/XXX/U12 R rest1
这样整个dffr的单元就连接起来了.
setNanoRouteMode -routeWithEco
globalDetailRoute
如果做时序setuup 和hold分析,如果能通过就可以sign off
方法二:
(a)restore 原来保存的enc文件然后保存floorplan 和 def这两个文件
(b) import Design 在verilog中指定更新的ECO 的netlist网表
(c)是用ecoPlace做eco布局单元
(e)ecoRoute布线
如果做时序setuup 和hold分析,如果能通过就可以sign off
我使用的是第一中方法,比较直观而且时序比较好控制,第二种比较省事,而且适合大批量修改,缺点不容易精确的控制单元的摆放位置不利于时序收殓.下面说说我之后使用ecoRoute布线但是发现ECO单元没法没有布线,试过很多种方法都没有解决,后来又浏览designBrower的逻辑网表觉得这单元很可疑,使用selectInst去查找该instance在encounter中没有找到该单元,原来是该instance没有摆放,目前处于unplace状态,再通过checkPlace 命令果然该instance是unplace,之后使用了ecoPlace从新ECO布局 再使用ecoRoute之后去查看所有的eco单元,好拉所有的eco单元的pin都连线啦.再用verifyConnect去检查,在也没有发现unconnnet pin和open net.原来encounter有这样一种功能如果有单元是unplace状态,那么eco之后的单元就没法布线.
经验总结在设计过程中多使用checkDesign checkPlace verifyConnect verifyGeometry命令查看设计否有异常.