DC经典入门问题.docx
《DC经典入门问题.docx》由会员分享,可在线阅读,更多相关《DC经典入门问题.docx(20页珍藏版)》请在冰豆网上搜索。
![DC经典入门问题.docx](https://file1.bdocx.com/fileroot1/2023-6/20/cec72ec1-fa10-486c-bfea-94c9b87c33e8/cec72ec1-fa10-486c-bfea-94c9b87c33e81.gif)
DC经典入门问题
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在综合中,ungroup命令可以去除系统的层次,有利于减小面积。
我比照了在使用ungroup-all-flatten命令前后的Totalcellarea。
在使用该命令之前Totalcellarea是102396,使用之后49663,减小了一半左右。
时序部分也没有变差。
那是不是综合脚本一般都要使用ungroup呢?
请指教,谢谢。
ungroup-all当然是能到达最大的优化力度啊,整体timing最好,
但是有时候会导致功能的变化,仿真没法过,比方某个hierboundary没了,
因此只是有限度的ungroup,比方-level3,
全部ungroup打散后,没有boundary,一般功能是不会影响的,LEC来保证。
但是function层次就没有了,比方对网表做一些verification,如STA时一些重要的点可能找不到了,如果还要debug的话几乎做不下去。
后端fix后某些点发现需要做functionECO,那么很可能也没法做了。
另外ungroup也分具体情况也不是所有情况下就一定明显减小面积,我们一般是有选择地对个别一些联系紧密的module会ungroup,不过目的是为了打掉boundary得到更好的timing不是面积。
纯属个人理解
LEC是logicalequivalentcheck,主要比较RTL和NETLIST,NETLIST和NETLIST的逻辑功能一致性。
通常来说,synthesis以后,会把RTL和综合得到的netlist比较,以保证综合没有造成逻辑的错误。
PR以后,也会做同样的check。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果你仿真都能通过,当然flat的网表也行啊,就是后面的debug和升级没法做,LEC和formality一样的,是cadence的形式验证工具,
最近在做Lowpower的flow,使用UPF文件描述多电压域设计。
在做综合的时候,把隔离单元的LEVELSHIFTER单元的库还有0.9v和1.08v的标准单元库都设置在target_library中,这个时候的operating_condition应该怎么设置呢?
不同电压域是不是要设置不同的operating_condition?
但是默认UPF模式的DC_SHELL又不支持set_poerating_condition中-object_list选项的设置,有哪位大侠跑通过用UPF的flow能不能帮助指导一下?
我觉得可能是环境没有搭好,但是又不知道从哪下手~非常感谢!
!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请问DC综合后做STA时,需不需要把DC产生的SDF读入到PT中,读入和不读入对于PT,有什么区别,哪一种比较准确呢?
谢谢
主要看你的SDF有没有延时信息,延时信息来自于哪里的,严格的说反标SDF是有用的,主要是看你的SDF的来源是否靠谱了。
如果仅仅是dc出来的,那么是没有延时的,反标进去也就没有意义了.
你所说的延时应该是PR之后的真正的版图延迟吗,DC后的延迟是有的,不过是基于线载模型预估的而已。
是不是说没有真正的版图延迟就不用反标SDF到PT中,让PT基于线载模型进行计算分析,同样是基于线载模型分析,PT要比DC中的DesignTime分析时序更为精确?
工程上我们一般不会用DC出来的sdf,PT分析所采用的也都是PR工具所提供的延迟信息,当然如果0.5u以上pr的结果和前端差异也就不会太大,所以设计迭代一般一遍也就OK。
但0.18u不会这样理想,物理设计上的信息显得至关重要,所以PR的SOCENC也会基于连续收敛的时序引擎。
还会有一种硅虚拟原型的设计方法,sdf的反标,PT分析,一般工程中也不会只signoff时才会做,在重要节点都会做。
前提是你承认PT的结果是signoff的而用PT进行工程signoff个人理解,不知道全面不全面
在做STA时,一般可是直接使用STARRC抽出的SPEF进行时序分析,使用PTreporttiming。
有时候,为了得到更准确点的timing信息,需要用SDF反标到PT中,再reporttiming。
当然反标是需要时间的
解决了。
DC后的PT不需要反标DC产生的SDF,DC后没有真实的布线,是基于线载模型。
此时PT单独分析的时序和DC中的DesignTime分析的结果是一致的。
有哪位大侠能详细讲一下set_max_transition的作用吗?
在STA中有个很重要,要FIXSLEW方面的VIOLATION。
这个set_max_transition就是设定SLEW上的constrain。
设置波形从10%到90%所需要的时间
对延迟和功耗都有影响
厂家提供的库中,cell延迟的值一般是通过二维非线性查找表来得到,
表的两个index分为inputtransition,loadcapacitance,如果index得值在表内,
延迟值不需要计算,如果不在表内,则需要通过内插或外插来计算,这相应的带来了误
差,内插的误差和外插相比小得多,如果外插计算时的index超出查找表的范围过大,
计算出的数值也就没有意义,所以库中一般都有defaultmax_transitin,
保证再此范围内计算的精度。
至于transition的计算用10%_90%还是20%-80%,看库中的定义好了,
设置最大的渡越时间,就是信号逻辑的转换时间。
max_transition属性通常用于输入引脚。
max_transition属性定义任何转换时间大于负载引脚max_transition指定值的连线不能连到该引脚。
针对初学者的提问,在eetop论坛里整理发表了一个FAQ,在这里做一个备份
如果您已经有2年以上的实战经验,下面这些雕虫小技就不太值得您去浪费时间了。
先说说作为一个有经验的后端〔暫不包括DFT工程师和layout工程师〕工程师,需要掌握哪些知识
4个级别:
1〕知道一些基本概念,
2〕简单地掌握这门技术,
3〕熟练
4〕精通
半导体工艺--2
RTLcoding--2
综合--2
时序约束--3
APR--3
DFT--2
DRC/LVS--3
仿真--2
形式验证--2
以下是FAQ分类:
2楼:
时序约束,STA
3楼:
综合DC/RC
4楼:
APR〔floorplan,place,CTS,route〕
5楼:
验证〔LEC,DRC,LVS等〕
6楼:
DFT
7楼:
低功耗
8楼:
面试
9楼:
名词解释
希望我有时间完成所有的总结。
下面进入正题
《时序约束,STA》
(1)clock
Q1.1什么是同步时钟?
时钟频率是整倍数,并且相互之间的相位是固定而且相差可预知的,才可以称得上是同步时钟。
其他的都算异步时钟。
比方,
5M,10M是同步
2M,3M一般算异步
一个时钟,输出到另一个芯片中,转一圈后,以同样的频率返回到自己的芯片,因为无法确定时钟在另一个芯片里面的latency,所以输出的时钟与输入的时钟算异步
一个时钟进到2个PLL,就算那2个PLL的输出频率相同,一般也算是异步时钟,除非你de-skew
Q1.2如何处理同步时钟?
设计要求严格的公司,就算是同步时钟,数据在同步时钟间传送时,依然要用meta-stabilityFF,可以set_false_path
如果放松要求,不用meta-stabilityFF,则同步时钟之间是realpath,做CTS时,同步时钟要clocktreebalance。
注意不同频率的同步时钟的最小时间间隔被用来检查setup
如果上升下降沿混用的话,setup的时间间隔就只有半个时钟周期了
Q1.3如何处理异步时钟?
很简单,set_false_path
注意要fromAtoB,同时要fromBtoA
Q1.4如何定义时钟?
create_clock如果指定某个pin/port,就是实时钟,如果没有指定pin和port,就是虚拟时钟
巧妙利用waveform选项可以做出不同波形的时钟
被定义成时钟的net,在综合时,自动带有idealnetwork和dont_touch的属性。
但是当它被用作data计算延迟时,idealnet的属性会自动消失
时钟会自动穿过逻辑单元,停在时序单元的时钟端,所以用FF产生的分频时钟要再用create_generated_clock定义一次
Q1.5如何处理多项选择一时钟?
在实际应用当中,如果这几个时钟不会同时出现的话,则在定义时钟时,只选择最快频率的就可以了
如果是多个时钟同时出现,可以用set_case_analysis选一个,
也可以放它们全都过去,但是在MUX后面把它们之间set_false_path
Q1.6巧妙定义时钟
直接在分频FF的Q端定义generatedclock时,有时会把分频FF的时序打掉,解决方法是在分频FF的Q端加一个时钟buf,从那个buf的输出端定义generatedclock,从而保证分频FF自身的时序完整
如果从sourceclock到generatedclock之间有多条路径,你希望PT用指定的一条路径来计算时序的话,可以用set_case_analysis,set_disbale_timing或者一级一级地定义generatedclock来引导PT到达你的要求
分频器时序约束问题
时序分析中同一时钟的不同路径问题
请教如下要求的clock在pt中应该怎么create
怎样设set_case或者别的,才能让pt选择同一条clockpath
Q1.7什么时候需要设置latency?
latency分为sourcelatency和networklatency两种。
sourcelatency是源时钟自带的,networklatency就是CTS后的clocktreeinsertiondelay。
在综合时,一般不需要latency,
除非,
已知不同clock带有不同的sourcelatency,并且它们之间有时序要求
预知不同clock会有不同的clocktreeinsertiondelay,不想平衡它们,但是要满足他们之间的时序要求
做完CTS后,要把networklatency去掉
请问set_clock_latency设太大会有什么不好
Q1.8如何设置uncertainty
clockuncertainty分为setup和hold,preCTS和postCTS几种不同的情况
一般的处理原则是:
preCTS,setup:
uncertainty=PLLjitter+预估的clockskew
preCTS,hold:
uncertainty=预估的clockskew
postCTS,set_propagate_clock[all_clocks]
postCTS,setup:
uncertainty=PLLjitter
postCTS,hold:
uncertainty=0
有时fundry要求holduncertainty保留一定的量,这时就把那个保留量加到上面的公式中
sdc文件中对clk的uncertainty、transition、latency的设置
〔2〕IO端口的约束
Q2.1如何加IO端口的约束?
最普通的方法是
对输入端,set_input_delay,set_driving_cell〔也有用set_input_transition的,但是不多见〕
对输出端,set_output_delay,set_load
对时钟端,set_clock_transition
dc综合时的clocktransition应该参考什么设定?
set_drive,set_load
Q2.2哪些端口不需要约束?
静态信号可以set_false_path,比方reset,test_mode,function_mode_select
不能真的什么约束都不加
Q2.3什么样的reset信号可以set_false_path?
如果在工作时,reset信号有效时,时钟信号不翻转,就可以set_false_path
如果reset信号动作时,时钟也有动作的话,就不能set_false_path
Q2.4像reset那样的highfanout信号需要设定为idealnet吗?
如果是falsepath的话,可以设为idealnet
一般不需要设为idealnet,让DC加入buffertree后,有利于估算功耗和面积
Q2.5如果有一组输出信号,需要他们之间对齐,但是不太在乎有多大的延迟,这时应该如何约束?
如果有输出时钟的话,在那个输出时钟端口定义一个generated_clock,其它信号的output_delay都相对于这个generated_clock而定。
只要有max和min,就可以把所有信号卡在一个范围之内
如果没有输出时钟的话,用set_output_delay-reference_pin
Q2.6如何计算input和outputdelay?
如果是block的input和outputdelay,可以预先分配,比方输出端,输入端各1/3,中间的连接1/3
block的端口最好都flop-in,flop-out
如果是chipIO,要度其他芯片的IO时序和电路板上面的延迟,比较麻烦
set_input_delay的时间设置
〔3〕DRV
DRV有时也加DRC,与物理检测的DRC不是一个概念
DRV包括,
set_max_transition与工艺相关,65nm的话,在0.6ns左右
set_max_fanout与工艺相关,一般在12~20之间
set_max_capacitance
set_max_power
set_max_area
〔4〕falsepath,multicyclepath
Q4.1什么情况下需要set_false_path?
异步时钟之间,
到meta-stability的第一个FF路径,
静态信号
Q4.2何时会用到multicycle_path?
太长的path,
不会每个周期都变的信号
注意:
在RTL中,前端一定要多周期工作一次的功能
一般set_multicycle_path-setup
要同时写set_multicycle_path-hold
〔5〕wireloadmodel
wireloadmodel是一种简单地根据fanout来估算wiredelay的方法,在综合时,一般根据设计的大小选择对应的WLM
有时也会用zerowireloadmodel,这时的clockperiod要相应减小15~25%,或者clockuncertainty增加15~25%
set_wire_load_model两种模式top和enclosed到底有什么区别?
更加准确的计算wiredelay的方法是DCtopo和RCphysical,
他们在综合时会粗略地做个place,然后根据距离来计算延迟
〔6〕clockgating
Q6.1如何加clockgating?
局部的clockgating在综合时,会自动加进去。
加clockgating后,不但会减小功耗,还会改善时序,因为本来到D端的逻辑,一部分被移到CK端了,简化了D端的逻辑
整个block的clockgating,一般直接在RTL里面加,因为DC没有那么聪明
Q6.2需要对clockgating加什么特别的约束吗?
如果使用标准库里面的ICG单元,不需要附加任何特别的约束,前后端的工具都认得它
如果用latch+and自己搭的clockgating,你要对那个and单元set_disable_clock_gating_check,还要告诉后端,一定把latch和and摆在一起
一般只在没有动态切换时钟时,才可以用一个and/or做clockgating,这时也要set_disable_clock_gating_check
clockgatingcell约束
某个domain的clk通过gating关断重启后,对这个domain做复位有没有必要?
〔7〕case_analysis
set_case_analysis可以强制某个node为0/1
这个0/1会沿着纯逻辑组合单元向前传送,如果没有特别设定的话,会停在时序单元上
注意,只是是向前传,不会向左右2边和向后传
举例:
如果设在输出端上,那么所有fanin端都会被强制为0/1
如果只设在某个输入端上,与之相连的输出端和其他输入端都不受影响
〔8〕idealnet/network
综合脚本的样本现在到处都是,最好找一个,照猫画虎改改用
建议把时序约束脚本与综合脚本分开存放,这样时序约束可以单独使用。
〔1〕综合的注意事项
Q1.1需要fixhold吗?
不需要,hold交由后端去做就好了。
所以综合时,不需要读入min.lib,不用设wc_bc等复杂的选项
Q1.2综合出来的网表如何验证?
如RTL做形式验证
gate-sim〔网表仿真〕。
不要用延迟。
不需要从DC输出SDF,因为那个根本不准,而且它也无法保证没有hold违反
Q1.3如何让DC自动插入clockgating
在脚本中加入
setpower_cg_always_enable_registerstrue
set_clock_gating_style(指定ICG)
insert_clock_gating
replace_clock_gates
Q1.4综合时要检查哪些项目?
最最起码要做,
综合前,check_design,check_timing,保证所有的path都有约束〔含timingexception〕
综合后,report_timing,report_constraint,report_area,report_power,report_qor
Q1.5如何解决综合后setup的违法?
多综合几遍
检查约束是否合理
最后只好改RTL了
Q1.6如何判断约束是否合理?
什么是合理的约束还真不好说,但是下面是一些不合理的情况,遇到了一定得解决
2#楼里面所列约束项目不完整的
startpoint或endpoint的clockcycle特别大的,说明那是异步时钟
某个cell或net延迟很大的,可能是clocknet当作signal用了,设了dont_touch
Q1.7如何得到更好的网表?
对于DC,一般人们都喜欢把clockperiod调小一点〔10~25%〕,那样DC会给你个timing比较好的网表,但是代价的面积的增大和功耗的增加。
当然,你调clockuncertainty也有同样的效果
#*******************************************************************************************
#Author:
xxxxxxxxx
#Description:
Thisfileisjustonlyatempletforsynthesis,includingbasicsynthesisflow.
#Userscanmakeitasreferencedesign.
#*******************************************************************************************
remove_design-all
#****************************
#readdesigntoDCmemory,Assumingtherearefourmodules
#****************************
#orreadlikethis
setall_modules{modmod1\
mod2mod3\
}
foreach(current_module,all_modules)
{
setdesign_path{../}
}
#******************************/
#Set_dont_touchAttributeoncell,net,referenceordesign
#Set_dont_touch_networkAttributeonclock,pin,ports
#******************************/
set_dont_touch_networkfind(port,"CLK")
set_dont_touch[get_cells{xxxx/xxxx/aaa}]
set_dont_touch[get_nets{bbbb}]
set_dont_touch[get_designs{ssss}]
#******************************/
#createclockinfo
#******************************/
create_clock-nameclk-period2.56-waveform{01.28}[get_pins,{s_x/I_PMA/I_PMA7/RXBCLK}]
create_generated_clock-nameclk_125-sourceA_x/clk-edges{135}[get_pins{p_x/clk_125}]
set_clock_uncertainty-setup0.2clk
set_clock_uncertainty-hold0.02clk
set_clock_uncertainty-setup0.2clk_125
set_clock_uncertainty-hold0.02c