设计对象
![](https://i-blog.csdnimg.cn/blog_migrate/20d61f84b542f3d358886c2ab2c1333c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ba7bc0c0ee7f9284480a532b775d4242.png)
design:只要设计下面包含子模块或者逻辑门,就可以称为design;
Reference:参考名;
instance:针对reference的类化名;
此处为什么INV不是design呢?因为INV已经是一个最小单位了-反相器,它下面没有子模块/逻辑门了;
![](https://i-blog.csdnimg.cn/blog_migrate/56b5378b505ccb323858ebde1935b89f.png)
在DC中,不同的object对象(pin/port/cell/net ...)可以有相同的名字,那么工具要怎么区分它们呢?
![](https://i-blog.csdnimg.cn/blog_migrate/17d8fe890a4bb46300cd85f7ea21057b.png)
前面说过,虽然名称是一样的,但collection会对每种类型的对象打上不同的标签,通过标签来区分;get_命令可以获取具有相同标签的对象;
”*/?”为通配符,其中"*"表示可以匹配0个或者多个字符;”?”可以匹配1个字符;
如果get命令没有找到相匹配的对象,那么就返回空列表;
![](https://i-blog.csdnimg.cn/blog_migrate/5e089d28440424da6f304b1a34aa8d9e.png)
练习:
get_ports C*:返回port C和port CLK;
get_instance U1:返回U1;
![](https://i-blog.csdnimg.cn/blog_migrate/b29702172ef699f4d012570c99c48574.png)
![](https://i-blog.csdnimg.cn/blog_migrate/111a0a9eebfdd8fef51d4138cfd097e1.png)
如图;
![](https://i-blog.csdnimg.cn/blog_migrate/9fedebcaebd37884a194d282132a5d8a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1db6d2917516140a2bb7edef82f59311.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e2c212577b698878c230f88b14b4c12c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0ee1ff52c6ae2ac66f0915da73ba3abc.png)
列出一些常用与object相关的命令;
如果不知道某个object具有哪些属性,可以用list命令来查看对象有哪些属性;
![](https://i-blog.csdnimg.cn/blog_migrate/82a6e4495aca61f2f992e720de8ac381.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e63c574a871a2789183eb5ec45381db3.png)
关于一些更加具体的相关描述,可以去查看DC用户手册;
当然,一些object是可以互换的,比如:一个design有两个模块A & B,A的输出用做B的输入,那么就可以认为A的pins就是B的ports ;
时序约束前提与路径分类
![](https://i-blog.csdnimg.cn/blog_migrate/0a283d71ef0f263c97d882136c8af3e9.png)
时序约束路径分类及时序分析的前提如上图;
![](https://i-blog.csdnimg.cn/blog_migrate/76e4e8d86947f56aa24c9199b77bced4.png)
默认分析时序约束的环境:输入信号随上升沿到来;输出信号随上升沿被捕获;
四种timing path约束路径
![](https://i-blog.csdnimg.cn/blog_migrate/7fa91521bdee398ccbb3fac7ab5a52e7.png)
DC工具会把design分为多个timing path时序路径,每条路径都只包含一个起点和一个终点;
起点可以是:①时序器件的CLK pin;②除了CLk port的其他input port;
终点可以是:①时序器件的除了CLK pin的任何input pin;②除了CLk port的其他output port(如D);
上图列出的四条timing path刚好可以对应四种标准的路径;
FF1--FF2约束的建立
![](https://i-blog.csdnimg.cn/blog_migrate/87310966fe7dc3316867f76620decfb7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0789a18650502af6e35dd6d1813791f5.png)
根据前面第六课的知识,对于FF1-FF2之间的建立时序约束,必须要满足:Tcmb<T-Tck-Tsetup-Tskew(此处考虑的是理想情况,没有包含Tskew);所以,此处必须要先确定周期T=2 ns;Tsetup=0.2 ns;那么Tcmb=Tx<1.8-Tck;
![](https://i-blog.csdnimg.cn/blog_migrate/e578e7c923964f9c5eccc64eb634f221.png)
DC中确定时钟周期后,默认是50%占空比,在0ns时为上升沿;
![](https://i-blog.csdnimg.cn/blog_migrate/16c92c207a946655bf2df50b01d349d5.png)
DC默认是不会在时钟网络上加入buffer的,无论时钟连了多少个负载;
DC默认时钟网络是理想型的,拥有无穷的驱动能力,没有跳变转换时间,没有偏差,没有延时(insertion or latency:指从时钟input到FF之间的延时);
在综合阶段,我们需要对偏差、延时及转变时间等建模评估,从而增加时钟行为的精确度,更好的meeting PR阶段做完CTS时钟树后的时钟行为;
时钟树行为建模
![](https://i-blog.csdnimg.cn/blog_migrate/070cd29142496e1abe40a0de5c18fd95.png)
CTS时钟树是在PR完成后基于cell的真实物理位置进行布置的,而在综合阶段,我们如何建模呢?
![](https://i-blog.csdnimg.cn/blog_migrate/941e0694d73e133c1a30bfce11dba240.png)
对某个时钟setup(maximun delay)进行建模,其中包括几个方面:
①uncertainty建模:包含skew、jitter(两个时钟周期之间的差,称抖动)、margin(留给uncertainly的余量)三部分;uncertainty一般根据经验值来评估;
②Latency or Insert delay建模:包含Source latency & Network latency;
③Transaction Time建模;
uncertainty建模(margin部分)
![](https://i-blog.csdnimg.cn/blog_migrate/35c74a700931783c38a50e702278a7c9.png)
如上案例,这里的uncertainly取得是0.14;那么Tcmb<T-Tck-Tsetup-0.14;
Latency/Insert delay建模
![](https://i-blog.csdnimg.cn/blog_migrate/b050f0362e6382eb98107c9ad55ab336.png)
这里把Latency又分为两个部分:Source latency+Network latency;其中,Source latency是从时钟原点(发出点)到时钟接入点的延时;Network latency是从时钟接入点到触发器时钟接入点的延时,由于从时钟接入点到每个触发器的距离不一样,此处的latency取得是平均值;
Source latency+Network latency的值就是我们查看时序报告内的clock network delay值;
Transaction Time建模
![](https://i-blog.csdnimg.cn/blog_migrate/41bae3ef27d1a3814f3d61ee7c78450c.png)
针对的是时钟信号的转变时间模型;
Pre/Post CTS对比
![](https://i-blog.csdnimg.cn/blog_migrate/45bd6797bf7f5bde1846c743ead05f0b.png)
简单对比了一下综合阶段和CTS完成后的时钟行为建模区别,
①在CTS完成后,工具已经可以精确计算出Network latency延时了,所以Post CTS不用对该项建模了;
②uncertainty在综合阶段包含skew/jitter/margin,在CTS后只含有jitter/margin两项了,skew工具可以根据具体path自己算出来;
③CTS后Transaction Time也可以由工具根据具体路径上的buffer及连线情况自己算出来;
④CTS后还需要设置一个set_propagated_clock,让时钟约束传播下去;
Input/Output delay约束的建立
input delay约束的建立
![](https://i-blog.csdnimg.cn/blog_migrate/7148d96d0cc2c7bee9abe639b46e1f20.png)
input delay:指从前一级触发器的时钟到后级触发器input ports的延时,包含了前级触发器的Tck和信号从前级触发器Q端到后级input ports的internal delay;(输入信号在前级触发器信号到达后需要多长时间到达后级的input ports上)
由上图可见,input delay=Tck(Tco)+Tm;
![](https://i-blog.csdnimg.cn/blog_migrate/3fa109676f3611d6f4277e149b0538d0.png)
(http://www.360doc.com/content/21/0527/14/9523589_979230051.shtml)
![](https://i-blog.csdnimg.cn/blog_migrate/65651f1400a875dd09fbdf5ddc26e0de.png)
这里的Tco=Tck,Trace delay即为前面说的Internal delay;
(https://blog.csdn.net/qq_39507748/article/details/114746186)
![](https://i-blog.csdnimg.cn/blog_migrate/7f784d5ef0acecc2869108f1f6f7dcce.png)
此处已知input delay,求output delay中的internal delay(即Tmax)是多少;
![](https://i-blog.csdnimg.cn/blog_migrate/60aa6ecaecddaeedea414c5ee255b225.png)
如上面的解释,此处我们知道了output delay,所以input delay:Tinput_delay+Tmax<T-Tsetup-Tuncert=2.5-0.1-0.3=2.1,故Tinput_delay<2.1-Tmax=2.1-1.5=0.6ns;
output delay约束的建立
![](https://i-blog.csdnimg.cn/blog_migrate/56956e04634824981b5db759f411d1b0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/768dca375ea091a744003685f955134a.png)
(补充资料网站见input delay处)
output delay:指从前一级触发器的output ports到后级触发器Clk入口的延时,包含了internal delay和后级触发器的Tsu转变时间延时;(输出信号在后级触发器的时钟沿到来之前需要提前多久准备好)
![](https://i-blog.csdnimg.cn/blog_migrate/194cd45cbae348196871b74e9ed522eb.png)
可见,output delay=Tinternal+Tsu;
![](https://i-blog.csdnimg.cn/blog_migrate/0de288f98682f6e6038ea0f0109fb5cd.png)
T(output_delay)=Tinternal+Tsetup;故Toutput=T-Tinput-Tuncert=2-0.7-0.3=1ns;
绝对时间timing分析
![](https://i-blog.csdnimg.cn/blog_migrate/56befa4225994c9bf44a746e7287abfa.png)
时钟绝对时间Timing分析,说的是考虑了时钟信号的latency delay,所以时钟的起始时间不是0;上图的source latency+network latency=0.3+0.12=0.42ns;故前级触发器的绝对时钟捕获时间是0.42;后级触发器的绝对时钟捕获时间是:Tlatency delay+T-Tuncert=0.42+2-0.2=2.22;
这种带latency delay的timing分析称时钟绝对时间timing分析;像上述的例子前级和后级触发器的latency delay是一样的,那么对于简单timing分析时,可省略latency delay;
多个input/output ports timing 分析
![](https://i-blog.csdnimg.cn/blog_migrate/97c4abce018b7d47b68032e9563235e0.png)
对于多个input/output ports的情况,和单个的情况是一样的,在设置约束时,注意把除时钟ports外的所有的input/output ports都包含在内即可;
不同input/output delay 约束分析
![](https://i-blog.csdnimg.cn/blog_migrate/93e30c188f423428a6533795ca615412.png)
对于存在不同的input delay约束,我们可以先对所有的设置一个统一的输入约束,然后再对不同约束的ports进行一个补充约束;当然,也可以按相同约束的分类一起写;
Comb Path delay with CLK timing分析
![](https://i-blog.csdnimg.cn/blog_migrate/4cf084795cec8e49806fba7659f2fb90.png)
(路径中含有时钟)如上图,对于从input ports直接到output ports的路径,TF.max=T-Tinput delay-Toutput delay-Tuncert;
Comb Path delay without CLK timing分析
![](https://i-blog.csdnimg.cn/blog_migrate/4a516fca0a8aa914123bd189bb5cae0c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/806923bf2ce7c0e3f4c827e239150819.png)
(路径中没有时钟)对于Comb中不含时序逻辑电路,也就没有时钟经过的纯组合电路,我们需要设置一个虚拟时钟;
![](https://i-blog.csdnimg.cn/blog_migrate/6991095e47daabb73bcc8d9c2689feb2.png)
如上图,虚拟时钟的设置;
时钟预算
![](https://i-blog.csdnimg.cn/blog_migrate/b123df4d0ea00f3d6cbfb74a73500cff.png)
当我们不清楚某些部分的delay时,如input delay/output delay,那么我们可以设置一个时钟预算time budget;
![](https://i-blog.csdnimg.cn/blog_migrate/ca29137b70566548e768b6c6cfc9a9d0.png)
一般来说,我们会将时钟周期的60%设置为外部路径的延时,40%设置为内部路径的余量;这样做至少比没有任何时序约束要好;
![](https://i-blog.csdnimg.cn/blog_migrate/467f1ef9ef9cc22aa8230b486f17023f.png)
设想一下,如果所有的内部路径都设置为40%余量,那么当所有模块都遵守这个规定时,两个不同模块相连时,就是40%+40%=80%周期的总约束,那么肯定是可以满足需求的;
![](https://i-blog.csdnimg.cn/blog_migrate/2b373770961988d0a9d5ff395642e75e.png)
当我们在设置寄存器输出时,后面最好是寄存器直接输出,不接组合电路;这样input delay就变成了Tck,output delay就变成了T-Tck;我们假设最worse的情况,设置最大的Tck=input delay;假设output时,把Tck设置的最小,这样得到的output delay 就最大了;
时序约束总结
![](https://i-blog.csdnimg.cn/blog_migrate/7b304c0917d22342fadaa687b336795f.png)
总之,input/output delay通过人为的设定来约束,FF1-FF2的约束Tcmb根据时钟来约束;
效率提升方法
约束命令的不同执行
![](https://i-blog.csdnimg.cn/blog_migrate/e4299ce407e20ddb2cbea4ba0f20b452.png)
单条单条的敲命令可以帮助我们debug,但不适合效率的提升;
![](https://i-blog.csdnimg.cn/blog_migrate/de8e27f9b49499139d2843f400581366.png)
高效的方式:把所有的约束写进一个约束文件内,然后直接导入约束文件;
![](https://i-blog.csdnimg.cn/blog_migrate/aeb75914bf07fa1cf81cdd938a933e81.png)
更高效的方法:直接用批处理命令来运行约束文件,但前提是已经确认该约束文件是完整并正确的;
对约束的建议
![](https://i-blog.csdnimg.cn/blog_migrate/f8115fcfa5d6fe0b69f8ef0d8584b378.png)
建议①:再加载新的约束前,需要利用”reset_design“命令将以往的所有约束释放;
![](https://i-blog.csdnimg.cn/blog_migrate/13122998295db3eab3996432b72f4f3c.png)
建议②:要对你写的约束加入注释,同时注意注释的用法;
![](https://i-blog.csdnimg.cn/blog_migrate/dd460b36779164ec42ac6250ffdef346.png)
建议③:建议使用一些通用的简写字符,不要用一些自定义的缩写命令;
约束脚本语法检查
![](https://i-blog.csdnimg.cn/blog_migrate/6f3cd0ccab0ad55217b5a72fafadb6fa.png)
检查约束文件的语法:①直接在DC内部运行一次,没报错就是ok的;
②在linux环境中,可以用”dcprocheck”命令来检查脚本的语法问题,该命令是DC的内嵌命令,只要环境能运行DC软件,就可以运行该命令,无需任何用户配置;
check_timing约束检查
![](https://i-blog.csdnimg.cn/blog_migrate/9d857ec7814330e1ba52908cfa0b1674.png)
加载约束后,对约束进行check_timing检查,前面第11课提过,这的约束检查是检查约束自身的完整性,是否每条路径都设置了约束等;
保存每一步的文件报告
![](https://i-blog.csdnimg.cn/blog_migrate/865782838ef73761cf2182a0837fb88b.png)
建议把每一步的运行报告都保存下来,用redirect命令,后面想再往同一个文件里添加时,就再跟一个append参数;
man 及help命令的常用方法含义
![](https://i-blog.csdnimg.cn/blog_migrate/4b38bc78fb86dbcf930ac416d935c130.png)
常用时序约束命令
![](https://i-blog.csdnimg.cn/blog_migrate/a0e10b480d3972082806ccfa72cbb0ff.png)
![](https://i-blog.csdnimg.cn/blog_migrate/06b2957ab79159720225afac9a5d9bc7.png)
如上图;