针对初学者的提问,在eetop论坛里整理发表了一个FAQ,在这里做一个备份
如果您已经有2年以上的实战经验,下面这些雕虫小技就不太值得您去浪费时间了。
先说说作为一个有经验的后端(暫不包括DFT工程师和layout工程师)工程师,需要掌握哪些知识
4个级别:
1)知道一些基本概念,
2)简单地掌握这门技术,
3)熟练
4)精通
半导体工艺--2
RTL coding -- 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-stability
FF,可以set_false_path
如果放松要求,不用meta-stability FF,则同步时钟之间是real
path,做CTS时,同步时钟要clock tree balance。
注意不同频率的同步时钟的最小时间间隔被用来检查setup
如果上升下降沿混用的话,setup的时间间隔就只有半个时钟周期了
Q1.3 如何处理异步时钟?
很简单,set_false_path
注意要from A to
B,同时要from B to A
Q1.4 如何定义时钟?
create_clock
如果指定某个pin/port,就是实时钟,如果没有指定pin和port,就是虚拟时钟
巧妙利用waveform选项可以做出不同波形的时钟
被定义成时钟的net,在综合时,自动带有ideal
network和dont_touch的属性。但是当它被用作data计算延迟时,ideal net的属性会自动消失
时钟会自动穿过逻辑单元,停在时序单元的时钟端,所以用FF产生的分频时钟要再用create_generated_clock定义一次
Q1.5 如何处理多选一时钟?
在实际应用当中,如果这几个时钟不会同时出现的话,则在定义时钟时,只选择最快频率的就可以了
如果是多个时钟同时出现,可以用set_case_analysis选一个,
也可以放它们全都过去,但是在MUX后面把它们之间set_false_path
Q1.6 巧妙定义时钟
直接在分频FF的Q端定义generated
clock时,有时会把分频FF的时序打掉,解决办法是在分频FF的Q端加一个时钟buf,从那个buf的输出端定义generated
clock,从而保证分频FF自身的时序完整
如果从source clock到generated
clock之间有多条路径,你希望PT用指定的一条路径来计算时序的话,可以用set_case_analysis,
set_disbale_timing 或者一级一级地定义generated clock来引导PT达到你的要求
分频器时序约束问题
时序分析中同一时钟的不同路径问题
请教如下要求的clock在pt中应该怎么create
怎样设set_case或者别的,才能让pt选择同一条clock path
Q1.7 什么时候需要设置latency?
latency分为source latency 和 network latency 两种。
source latency是源时钟自带的,network latency就是CTS后的clock tree insertion
delay。
在综合时,一般不需要latency,
除非,
已知不同clock带有不同的source latency,并且它们之间有时序要求
预知不同clock会有不同的clock tree insertion
delay,不想平衡它们,但是要满足他们之间的时序要求
做完CTS后,要把network latency去掉
请问set_clock_latency 设太大会有什么不好
Q1.8 如何设置uncertainty
clock
uncertainty分为setup和hold,preCTS和postCTS几种不同的情况
一般的处理原则是:
preCTS,setup: uncertainty = PLL jitter + 预估的clock
skew
preCTS,hold: uncertainty = 预估的clock skew
postCTS,set_propagate_clock [all_clocks]
postCTS,setup: uncertainty = PLL jitter
postCTS,hold: uncertainty = 0
有时fundry要求hold
uncertainty保留一定的量,这时就把那个保留量加到上面的公式中
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综合时的clock transition应该参考什么设定?
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那样的high
fanout信号需要设定为ideal net吗?
如果是false path的话,可以设为ideal net
一般不需要设为ideal net,让DC加入buffer
tree后,有利于估算功耗和面积
Q2.5
如果有一组输出信号,需要他们之间对齐,但是不太在乎有多大的延迟,这时应该如何约束?
如果有输出时钟的话,在那个输出时钟端口定义一个generated_clock,其它信号的output_delay都相对于这个generated_clock而定。只要有max和min,就可以把所有信号卡在一个范围之内