PT约束问题,求解
本人使用的是CSMC 0.35um的工艺,DC综合阶段与STA约束如下:各位大神帮忙看看设置是否合理
DC综合时的约束:(自顶向下)
reset_design
#clock constraint
create_clock -period 100 -waveform {0 50} [get_ports clk_in]
create_generated_clock -divide_by 64 -source clk_in [get_pins uut_filter/M2/clk_64]
// uut_filter/M2/clk_64为clk_in进行分频所得到的时钟
set_case_analysis 1 [get_pins uut_clk_pol/POL]
//默认情况下,POL为1
set_clock_transition 1 [get_ports clk_in]
set_clock_uncertainty -hold 1 clk_in
set_clock_latency -max 1 [get_clocks clk_in]
set_dont_touch_network [get_clocks *]
set_ideal_network rst
#I/O delay constraint
set_input_delay -max 20 -clock clk_in [remove_from_collection [all_inputs] [get_ports clk_in]]
set_input_delay -min 1 -clock clk_in [remove_from_collection [all_inputs] [get_ports clk_in]]
set_output_delay -max 20 -clock clk_in [all_outputs]
set_output_delay -min 1 -clock clk_in [all_outputs]
//这些值我是根据前级芯片的输出延时来加的
#environmental attributes
set_driving_cell -lib_cell buffd1 -pin Z -library IC035os142_max [remove_from_collection [all_inputs] [get_ports clk_in]]
set_load 1 [all_outputs]
//输出直接手动接数字PAD,其电容很小
set_operating_conditions -min BEST_-40 -max WORST
set_wire_load_mode enclosed
set auto_wire_load_selection true
#Timing_design rule
set_input_transition -max 3 [all_inputs]
set_max_capacitance 10 [all_outputs]
set_max_fanout 15 [current_design]
#Area constraint
set_max_area 0
STA脚本:
set_operating_conditions -analysis_type on_chip_variation -max_library IC035os142_max -max WORST -min_library IC035os142_min_-40 -min BEST_-40
read_parasitics
NO_PAD/128chip.spef.max
PR之后做STA约束:
create_clock -period 100 -waveform {0 50} [get_ports clk_in]
create_generated_clock -divide_by 64 -source clk_in [get_pins uut_filter/M2/clk_64]
set_case_analysis 1 [get_pins uut_clk_pol/POL]
set_propagated_clock [all_clocks]
//陈春章老师那本书上说,PR之后由这句话代替了transition、uncertainty、latency,所以在PT时没有设相关约束。后面发现还需要考虑jitter+margin,可是这个值如何确定?
set_input_delay -max 20 -clock clk_in [remove_from_collection [all_inputs] [get_ports clk_in]]
set_input_delay -min 1 -clock clk_in [remove_from_collection [all_inputs] [get_ports clk_in]]
set_output_delay -max 20 -clock clk_in [all_outputs]
set_output_delay -min 1 -clock clk_in [all_outputs]
set_driving_cell -lib_cell buffd1 -pin Z -library IC035os142_max [remove_from_collection [all_inputs] [get_ports clk_in]]
set_load 1 [all_outputs]
目前芯片测试出现问题:正常情况下,芯片通讯时序不稳定,采值错误;把电压升高10%,依旧不行;只有降频时序正确,且采值稳定。有大神说是setup的问题,可是做STA时,setup至少有65ns的余量;在后仿时将频率提高1倍,时序依旧正确,为何流片结果出现这类问题。是否有大神遇见过此类问题,求解疑
[b]提取寄生参数所用命令文件如下:不知是否设置有问题
* TechReport
BLOCK: chip
MILKYWAY_DATABASE: mw_lib/0618ADC
HIERARCHICAL_SEPARATOR: /
BUS_BIT: []
TCAD_GRD_FILE: TLU/CSMC6S035DPTM_M3524_tran_min.nxtgrd
MAPPING_FILE: StarRCXT/parasitics/ADC.mapping
EXTRACTION: RC
TARGET_ANALYSIS: NONE
COUPLE_TO_GROUND: NO
COUPLING_MULTIPLIER: 1
NETLIST_FILE: StarRCXT/parasitics/0718ADC/chip.spef.min
NETLIST_FORMAT: SPEF
COUPLING_ABS_THRESHOLD: 3e-15
COUPLING_REL_THRESHOLD: 0.03
COUPLING_THRESHOLD_OPERATION: AND
COUPLING_REPORT_NUMBER: 1000
uncertainty 没设肯定不行的
这个有考虑,但是具体设多少怎么确定?如果这个有问题,降频有用吗?
post STA的set_propagated_clock [all_clocks]只是替代了transition、latency,但是uncertainty还是要留的,这是给设计留裕量的,跟DC里的设置一致就好了。另外,你的uncertainty只设了hold,没有setup。
STA如果用OCV的话,还建议约束加上set_timing_derate,这两者组合起来时序就比较严格了。
上面是较为安全做法,你现在没这样约束并不意味着一定会错,因为只要最后做出来的时序安全并满足要求就行。你可以重新设约束再跑STA,看看PR后的实际时序在setup/hold上有多大裕量,就知道是否有风险了。
后仿频率提高一倍依然正确?你得确认SDF是否反标成功了,要不然这仿真结果就是假象。
芯片降频可以正常工作,从这现象看的确像setup问题,但是提高电压错误依旧又有点矛盾了,因为升压也是能弥补setup的。顺便说一句,试一试降低电压,看看是否是hold问题。
正常工作电压3.3V,现在提高至3.6V,时序依旧不稳定;将频率升高1倍,后仿结果是正确的,sdf文件反标成功,因为和前仿做了对比,确实有一定的延时;setup余量最低65ns,hold余量为0,你说的那个减免系数的值是如何确定的?
你是0.35工艺,时钟也只有10M,derate设置0.95/1.05就够用了,还有setup/hold的uncertainty都是要设置的,你说现在hold裕量为0其实很有隐患的,hold有问题降频都是解决不了的,你现在的错误表现我觉得不能排除hold嫌疑,所以建议你降低电压试一下
减少/增加5%够不够啊?你这个值是怎么得到的?setup/hold的uncertainty设置的值多少合适?降低电压可以确定hold问题是不是因为降低电压使管子工作在ss状态,使data_path上的延时增加,从而减小hold violations ?
按你的工艺和频率,想要保守一点的话uncertanity各1ns应该足够,但是过于保守就是过约束,缺点是增大了面积,所以说这个需要自己的多次项目经验值的。
按照你目前的STA报告,是说关键路劲的setup都还有65ns裕量吗?setup裕量是很大的,如果这个值确定,那么稍微降压并不会导致setup问题;如果降压能正常工作,基本可以确定是hold问题了。
还有你下面这个设置:
set_operating_conditions -analysis_type on_chip_variation -max_library IC035os142_max -max WORST -min_library IC035os142_min_-40 -min BEST_-40
read_parasitics
NO_PAD/128chip.spef.max
PR完成后的PT分析,至少也需要分析两个case吧,使用OCV,跑两次PT,分别读入max db和min db,以及对应的max/min spef,得到slow和fast下的timing报告。你这里只分析了slow,没有fast,越发加大了hold问题嫌疑。
我是跑了两次PT的,读入min.spef也跑通了,这里没有写出来。还有一个问题,在PT中报告analysis_coverage,结果如图:
这个分析覆盖率好低啊,怎么解决这个问题
这个不清楚,我之前都没有关心这个报告。还有你对clock的那些设置,应该是all_clocks,不能只约束clk_in吧,你这里还有generate clock呢
这个问题已找到,可是为何后仿没问题呢?
漏掉约束并不意味着功能仿真一定会出错,这两者本身不是相互的充分必要条件。
后仿不是带延时的仿真吗?应该是时序仿真才对啊
如果有hold呢?降频也不管用的!
后仿时的sdf覆盖率哪?
看你的clock设计,很可能生成的sdf也不全,有些path
反标的timing也可能缺少。
这个覆盖率怎么看呢?
看sdf反标时的信息,或者有个sdf 反标生成的log ,好像名字是sdf_annontation
你是在VCS里跑的后仿吗?我是在Modelsim中跑的后仿
modelsim没用过,看仿真的log中,搜索sdf看看有没有信息
是否可能是接口时序出了问题?
?正常工作频率下接口时序是有问题,降频接口时序正常。这是我的问题呢,所以在找原因
传输线上加上拉电阻,将传输线弄短些,怀疑你们的驱动不够,延时太长
现在测试发现:不降频,不降压,clk接函数发生器,接口时序正常,但是接晶振就不正常了。不降频,降压,clk无论接函数发生器还是晶振,接口时序都正常。
这说明晶振产生的时钟导致设计hold出现问题,可是不知道是什么原因引起的?问:晶振产生的时钟,如果占空比不一致,是否会导致我hold问题?
这么看来,会不会是芯片内部的PLL工作异常?无法锁定在固定的频率上。
明确一点,降频能解决的,就肯定不是hold问题!hold出问题,无法通过降频解决!
如果你设计的芯片内部使用了正负沿, 占空比会有影响
现在不降频就可以解决了呢,降低电压使管子工作在max.lib环境,会加大data_path上的延时,从而为hold留出余量,故降低压降,解决时序问题可以知道是hold问题。我的setup余量与65ns,不可能是setup问题
如果降频后,问题存在,但是降压后,问题消失,则有可能是hold问题。如果降频后,问题消失,则肯定不是hold问题。hold出问题,与工作频率无关。
数字电路分析的setup和hold,都是基于有个正确的时钟源。如果时钟源不稳定,导致采样出错。这样的情况,时序分析软件是分析不出来的。
根据你说的,换成函数发生器后,问题解决。我更倾向于是芯片内部的时钟源不稳定造成的,而不是hold。仅供参考。
时钟源不稳定,是否可以理解为存在抖动?PR之后我并没有设置uncertainty余量,而我的hold余量为0,所以才会出现这个问题
有正负沿设计,占空比是有可能影响hold的