为了方便大家尽快找到需要的话题,经icfb版主建议,编辑这个数字后端的FAQ。
如果您是初学者,建议先搜索相关的资料,读读其他人的帖子,一些基本概念在那里都已经讨论过了。
如果您已经有2年以上的实战经验,下面这些雕虫小技就不太值得您去浪费时间了。
先说说作为一个有经验的后端(暫不包括DFT工程师和layout工程师)工程师,需要掌握哪些知识4个级别:1)知道一些基本概念,2)简单地掌握这门技术,3)熟练4)精通半导体工艺--2RTL coding -- 2综合-- 2时序约束-- 3APR -- 3DFT -- 2DRC/LVS -- 3仿真-- 2形式验证-- 2以下是FAQ分类:2楼:时序约束,STA3楼:综合DC/RC4楼:APR (floorplan,place,CTS,route)5楼:验证(LEC,DRC,LVS等)6楼:DFT7楼:低功耗8楼:面试9楼:名词解释时序约束,STA(1) clockQ1.1 什么是同步时钟?时钟频率是整倍数,并且相互之间的相位是固定而且相差可预知的,才可以称得上是同步时钟。
其他的都算异步时钟。
比如,5M,10M是同步2M,3M一般算异步一个时钟,输出到另一个芯片中,转一圈后,以同样的频率返回到自己的芯片,因为无法确定时钟在另一个芯片里面的latency,所以输出的时钟与输入的时钟算异步一个时钟进到2个PLL,就算那2个PLL的输出频率相同,一般也算是异步时钟,除非你de-skewQ1.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 AQ1.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_pathQ1.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 pathQ1.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 如何设置uncertaintyclock uncertainty分为setup和hold,preCTS和postCTS几种不同的情况一般的处理原则是:preCTS,setup:uncertainty = PLL jitter + 预估的clock skewpreCTS,hold:uncertainty = 预估的clock skewpostCTS,set_propagate_clock [all_clocks]postCTS,setup:uncertainty = PLL jitterpostCTS,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_transitiondc综合时的clock transition应该参考什么设定?set_drive ,set_loadQ2.2 哪些端口不需要约束?静态信号可以set_false_path,比如reset,test_mode,function_mode_select不能真的什么约束都不加Q2.3 什么样的reset信号可以set_false_path?如果在工作时,reset信号有效时,时钟信号不翻转,就可以set_false_path如果reset信号动作时,时钟也有动作的话,就不能set_false_pathQ2.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,就可以把所有信号卡在一个范围之内如果没有输出时钟的话,用set_output_delay -reference_pinQ2.6 如何计算input和output delay?如果是block的input和output delay,可以预先分配,比如输出端,输入端各1/3,中间的连接1/3block的端口最好都flop-in,flop-out如果是chip IO,要度其他芯片的IO时序和电路板上面的延迟,比较麻烦set_input_delay的时间设置(3)DRVDRV有时也加DRC,与物理检测的DRC不是一个概念DRV包括,set_max_transition 与工艺相关,65nm的话,在0.6ns左右set_max_fanout 与工艺相关,一般在12~20之间set_max_capacitanceset_max_powerset_max_area(4)false path,multicycle pathQ4.1 什么情况下需要set_false_path?异步时钟之间,到meta-stability 的第一个FF路径,静态信号Q4.2 何时会用到multicycle_path?太长的path,不会每个周期都变的信号注意:在RTL中,前端一定要多周期工作一次的功能一般set_multicycle_path -setup <n周期>要同时写set_multicycle_path -hold <n-1周期>(5)wire load modelwire load model是一种简单地根据fanout来估算wire delay的方法,在综合时,一般根据设计的大小选择对应的WLM有时也会用zero wire load model,这时的clock period要相应减小15~25%,或者clock uncertainty增加15~25%set_wire_load_model 两种模式top和enclosed到底有什么区别?更加准确的计算wire delay的方法是DC topo和RC physical,他们在综合时会粗略地做个place,然后根据距离来计算延迟(6)clock gatingQ6.1 如何加clock gating?局部的clock gating在综合时,会自动加进去。
加clock gating后,不但会减小功耗,还会改善时序,因为本来到D端的逻辑,一部分被移到CK端了,简化了D端的逻辑整个block的clock gating,一般直接在RTL里面加,因为DC没有那么聪明Q6.2 需要对clock gating加什么特别的约束吗?如果使用标准库里面的ICG单元,不需要附加任何特别的约束,前后端的工具都认得它如果用latch+and自己搭的clock gating,你要对那个and单元set_disable_clock_gating_check,还要告诉后端,一定把latch和and摆在一起一般只在没有动态切换时钟时,才可以用一个and/or做clock gating,这时也要set_disable_clock_gating_checkclock gating cell约束某个domain的clk通过gating关断重启后,对这个domain做复位有没有必要?(7)case_analysisset_case_analysis可以强制某个node为0/1这个0/1会沿着纯逻辑组合单元向前传送,如果没有特别设定的话,会停在时序单元上注意,只是是向前传,不会向左右2边和向后传举例:如果设在输出端上,那么所有fanin端都会被强制为0/1如果只设在某个输入端上,与之相连的输出端和其他输入端都不受影响(8)ideal net/networkideal_net只作用于这条netideal_network会把这个属性传送下去clock net自动带有ideal net属性其他net,何时需要设定ideal net?见Q2.4(1)综合的注意事项Q1.1 需要fix hold吗?不需要,hold交由后端去做就好了。