Q1:请教一个问题,cts.sdc和func.sdc在innovus用如何切换?在flow哪一步切换输入cts.sdc?哪一步切换到func.sdc,具体如何操作?
这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的?针对时钟结构比较复杂的设计,我们一般会编写一个用来长clock tree的sdc,避免工具默认的skew group之间出现乱做clock balance的情况。
比如下图所示的Clock Gen设计,这里面包含无毛刺时钟切换电路,分频电路(包含整数分频,小数分频电路),低速scan测试电路,高速时钟测试电路等。
数字SoC芯片复杂时钟结构设计时钟树综合典型案例(最复杂的时钟案例也不过如此!)
具体使用分段长clock tree技术的流程如下:
1)创建使用分段长clock tree 对应的constraint mode
create_constraint_mode -sdc_files /home_new/top_data/scripts/cts.tcl -name cts
2)创建做时钟树综合的analysis view(可以使用多个view做clock tree)
create_analysis_view -name view_cmax_cts -constraint_mode {cts} -delay_corner {corner_cmax}
set_analysis_view -setup {view_cmax_cts} -hold {view_cmax_cts}
3)设置长clock tree使用的corner或view
set_analysis_view -setup {view_cmax} -hold {view_cmax}
4)设置特殊sink type定义和insertion delay约束
#source …/input/floating.tcl
foreach pin_name $floating_pin_0 { set_ccopt_property sink_type -pin $pin_name ignore### set_ccopt_property insertion_delay 0.1 -pin $pin_name}
Q2:请问星主,从功耗角度来看,clock net上的总cap如果比较大有什么优化方法呢?
核心方法就是确保clock tree长度最短,确保高频时钟clock net总线长最短!
比如我们可以控制ICG的位置和ICG带的fanout reg位置。这里可以是手工摆放ICG和它对应的寄存器,还可以使用clock gating aware以及clock merge等技术来实现clock tree network的低功耗指标。
复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例
Q3: 我想问一下模拟给了一个lef里头有pin的位置,boundary位置,innovus有没有lappend lef之后输个命令就直接把这些floorplan做好的操作,我现在是根据lef中的boundary位置信息,在innovus中输入命令,请问有没有更简单的方法?
这个问题在数模混合芯片中是肯定会涉及到的一个实现要点,特别是当芯片的顶层是模拟,数字设计是子模块的时候。如下图所示为某个以模拟为主的芯片,其中数字模块的出pin分成五大块。其实这个数字模块的切分和摆放pin是不是就是我们数字后端hierarchical flow中所讲的block partition和pin assignment。只不过我们PR工具做partition后是写出子模块block的floorplan def,而模拟不太会写这个文件,而是提供通用的GDS或LEF文件。
PS:如果模拟版图能提供数字模块的def文件,那后端做实现时可以直接defIn这个文件即可加载当前数字模块的形状和io port信息。
那有了模拟设计提供的GDS文件后,我们还是不能直接提供给PR工具来使用。
如果模拟那边提供的是GDS,我们可以通过GDS转LEF的golden脚本来生成对应的LEF文件。
那是不是有lef后,我们就可以开始做子模块block的后端实现了呢?
显然不可以。如果这个子模块block是我们数字顶层的一个子模块,那么我们直接读入它的LEF就可以实现调用,注意是调用。
而我们今天这个案例是要去做这个数字模块的后端实现,所以需要有这个数字模块的boundary和io pin信息。而这个信息的呈现形式不可能是LEF,因为PR工具initial boundary不支持读入设计本身的LEF文件。
所以,我们还需要进一步把LEF文件转换成Milkyway数据格式,最后再通过Milkyway database来输出对应的floorplan def或io file。
Q4: 星主你好,我用pt修完时序导出eco脚本,在innovus中导入时报错,请问是什么原因导致的?
1)报错信息如下: ecoChangeCell -inst U3775 -cell NOR2XB_X1M_A7TH_C50Ignoring all MSV checks during this manual ECO operation.
**ERROR: (IMPOPT-628): No equivalent cell found in the library for the substitution. Use “setEcoMode -LEQCheck false” to allow the swapping of cells if the two cells are of different functionality.
Type ‘man IMPOPT-628’ for more detail.
- innovus中U3775的cell是NOR2B_ΧOP5M_A7TH_C50,两个cell差别如下图。
- 尝试关闭LEQCheck检查后替换,又报pin names不匹配。
**ERROR: (IMPOPT-340): Cannot determine how to connect NAND2XB_X3M_A7TR_C50. There is a mismatch in pin names between the cells being swapped. Use ecoChangeCell -pinMap to specify pin mapping when swapping cells with different pin names。
咱们社区钉钉知识库目前支持自动化回复EDA工具使用过程中遇到的问题。比如这个案例对应的错误代码,我们可以直接拿来问“AI助理”。AI助理会在10s内回答你的问题,而且会使用中文来回答。
由于这个星友问题是非常典型的项目问题,小编今天特地拎出来编写了一份专用教程。具体可以通过关键词搜索或访问钉钉上的知识星球目录查看。
比如我们问时钟树综合包含的步骤,看看AI助理是如何回答的。
Q5: 星主,tessent里面的tck和ssn clock同时经过一个MUX,需要case analysis让一路pass吗,如果需要的话是让tck过还是让ssn clock过呢?tck频率更低。
这个其实就是典型OCC电路的长clock tree策略问题。小编已经使用三个不同颜色来标出三条clock tree的长tree情况。
1)高速时钟fast clock直接穿过Mux一路长到所有sink点(精细化的做法还需要在mux的输出端添加一个guide buffer并创建时钟)
2)slock clock穿过下方第一个mux长到第二个Mux的I1 Pin即可
3)ijtag_tck时钟长到Mux的I1 Pin即可
Q6: 关于TOP IO Ring的设计问题。主要考查IO Cell类型的选型,ESD和Noise相关方案。
每个IO Domain的组成部分和ESD结构图如下图所示。