编译过程是指设计经过三个阶段的优化,最终形成门级网表的过程,在这一节里,我们主要就编译的策略,它包含如下几方面的内容——
- 中断编译的方法
- 从报告中检查时序,调整策略
- 修正保持时间违反(Hold time violations)
交流学习,获取源码等,联系qq 3270516346
8.1 中断编译的方法
在 DC-Tcl 的界面下,当我们键入 compile 命令时,DC 就开始了编译,也就是优化的过 程。优化是在设计规则的条件下,运用不同的算法,综合最终出满足时序和面积的电路。优 化首先是时序驱动(timing-driven)的一个过程,其次再是面积。如果找到了一个满足时序和 面积等约束的电路,编译将会停止;如果通过种种编译仍不能满足时序,编译也会停止下来;另 外,我们也可以人为的中断编译。
人为中断编译的方法是键入 Ctrl-C ,经过一段时间的等待后(有可能时间会很长),优 化过程暂停,并弹出如下菜单——
这里有四个选项,设计者可以根据情况作出选择。
DC 在编译的过程中,会自动打印出一个报表,报告编译的总时间,设计的面积,关键 路径的时序违反和总共时序违反情况,我们可以根据需要更改打印的列项目——
8.2 分析报告,调整策略
一般情况下,我们先作一个默认的编译,这样一般可以取得既快又准确的结果,然后在 编译完成后使用一些报告时序的命令,并分析它们的输出结果,使用的命令主要有——
- ** report_constraint –all_violators**
报告电路中所有没有满足的约束条件,包括设计规则、建立时间、保持时间以及面 积。通常这应该是最先执行的命令。 - ** report_timing –delay max**
报告基于建立时间检查的关键路径,每一个路径组的关键路径都被报告出来。 - ** report_timing –delay min**
报告基于保持时间检查的关键路径,每一个路径组的关键路径都被报告出来。
从这些报告中,我们可以看到电路中是否有违反的约束,如果有,那么它是什么类型, 还有电路中的最大负裕量(worst negative slack)是多少,等等。下面我们就几个常见的约束违 反情况,谈谈纠正它的综合策略——
- 较大的时序违反
请看下面这个例子——
从 report_constraint –all 这个命令的报告可以看出,需要到达的时间是 1.20ns ,而实际到 达为 2.84ns ,违反了 1.64ns 。之所以判断它是一个较大时序违反的情况,并不是因为 1.64 这个绝对值很大,而是相比较需要时间而言,1.64 是一个较大的值。一般而言,如果电路中 的最大负裕量(简称 WNS)所占时钟周期的 15%以上的话,可以认为电路存在较大的时序违 反。
确认存在较大时序违反之后,下一步就是找出原因,消除违反情况。可供参考的步骤有 下面几种——
-
检查约束条件,看是否有疏漏或错误
-
检查模块划分,看组合逻辑是否穿过多个模块
-
重新编译优化后的网表
-
修改 RTL 代码
下面详细讨论后面的三种情况——
- 重新编译(Re-Compile)
当重新读入映射后的网表进行重新编译时, DC 会自动将门级的网表重新返回到 GTECH 的结 构,相当于逻辑级。然后分别进行逻辑级和门级的 优化,但是同时也可以进行 DesignWare 的替换。
如果设计者仅仅将映射后的网表拿来再做一 次 compile ,编译后的结果并不会不一定会比原来的好,无非把以前做过的优化再跑一遍 因此,重新编译之前会改变一些参数,如——改变设计约 束、改变 set_structure 和 set_flatten 参数以及改变编译的 map_effort 。 - 改变 map_effort 重新编译
对设计进行编译的时候,有三种编译级别可以选择,它们分别时低级、中级和高级。
不同的级别编译要求的编译时间和编译结果都各不相同,compile –map_effort low 编译时间最短,但是结果不一定好,它一般用于设计预估(Design Exploration)① ,不用在 重新编译环节。
compile –map_effort medium 是 DC 默认的编译级别,大多能在一定的时间内得到较 为满意的结果。这也是我们推荐的初始编译级别。
compile –map_effort high 编译的过程中会使用前面的级别中没有的算法,因此它所 要求的时间是最多的,结果也是相对最好的。这种级别一般用在重新编译的阶段。 - 修改 RTL 代码
修改源代码所能取得的效果是最直接的,同时也是代价最高的。修改代码后,DC 会从最上层的结构级开始优化,前面也讨论过,越上层次的优化方法越多。所以通常这 样得到的结果也越满意。但是,修改代码也不一定放之四海皆准的方法,因此并不是所 有的设计我们都能获得源代码,同时也不是可以随便修改的。
较小的时序违反
请看下面这个例子——
从上图看出,相比较 1.20 的允许路径延时,0. 10 的负最大裕量(WNS)是比较小的(小 于 15%) ,而且已经认定了约束和模块划分都是正确的,那么应该怎样修复这个错误呢?
这里主要讲一下 Incremental Mapping——
这个开关告诉DC ,在重新编译的时候不需要把网表返
回到GTECH 结构,因此也不需要作逻辑级优化,速度也较
一般的编译更省时间。这里 DC 所要作的是进行门级单元的
替换,即在不违反设计规则的情况下用延时小的单元替换延
时较大的单元。另外,如果读入的是 db 格式的网表,在这
个阶段也可以进行DesignWare 的替换。
这里多加了一个-map high 的开关,-map high 开关前面已经提到过,它是让 DC 使用更多的优化算法优化电路,与上面的优化不同,这里需
要把层次提高到结构级,如下图所示。
需要注意的一点是:这里所指的优化仅仅优化电路中的关键路径(critical path) , 就是说,如果电路中的一个路径组中有多条路径违反,优化后也不可能全部满足时序。
如果要同时优化多条路径,需要使用另外一个命令——set_critical_range
这个命令设置的 critical_range 是以 WNS 的值为基准的,优化的是和这个值的绝对 值差设置值的那些路径。因此,如果设置值为 0 ,那么就仅仅优化一条关键路径。
例如,假设电路中的 WNS 为-3.4ns ,如果设置了
那么,当前设计中的所有负裕量的绝对值大于 1.4 的路径都将被优化掉。
设计规则违反
有些时候的时序违反是由于设计规则违反引起的,比如说一个单元的扇出(fanout)过大,导致它的 transition time 的时间迅速增加。对于这种情况,我们可以通过
两个命令审查连线的连接和负载情况。
要修正设计规则的错误,可以使用一个编译的开关
如下面这个例子,为了满足最大电容的规则,在 A 端口的内部加上了一个 buffer ,用于 缓冲N 路径对A 的负载。
8.3 修正保持时间违反
一个时序电路要想正常工作,除了必须满足建立时间要求之外,也需要满足保持时间要 求。
保持时间的概念和设置
为了满足建立时间,X 路径的延时加上 FF3 的建立时间必须小 LK 一个周期的时间。这样做可以保证从 FF2 触发的数据能在一个周期后被 FF3 捕捉 到。
同样,触发器还有一个保持时间,它是指在时钟边沿过后的一段时间触发器输入必须稳 定,否则就会出现数据异常。为了满足这个条件,就必须要使得触发器在一个时钟边沿触发 数据后必须等待一段保持时间才能接收新的数据。上图中假设 FF3 的保持时间为 0.5ns ,可 见,在图示的上升沿,FF2 触发新的数据,FF3 捕捉了 FF2 在前一个周期触发的数据,如果 X 路径延时足够小,那么有可能在 0.5ns 之内 FF2 触发的新数据也到达了 FF3 的输入端,这 样就引起了保持时间违反。
从上面的分析不难看出, 保持时间容易出现在组合路径延时较小的路径中。下面我们分 析时钟偏移(Clock Skew)对保持时间的影响。
假设 CLK 到达 FF3 比 FF2 晚 0.5ns ,那么从上图可以看出,FF2 的新数据到达 FF3 的 可能性会比没有 Skew 增加。它现在的保持时间要求也从 05ns 提高到 1.0ns。
除了时钟偏移之外,工作条件也会对保持时间产生一定的影响。工作条件的变化直接影响到的是各个单元(时序和组合)的延时。前面讨论过, 最差情况(Worst case)下组合电路的延 时最大,所以检查建立时间时用的都是最差情况。相反的,在最佳情况(Best case)情况下, 组合电路的延时会变小,产生保持时间违反的可能性也增加了。
虽然保持时间检查和建立时间检查是同样重要的,但是我们在实际综合的过程中却不是 把它们同时考虑,而是更多的把保持时间的检查放到布局后。这是因为——
- 时钟偏移必须要到布局完成后才能得到准确值
- 修正保持时间的通常做法是插入buffer,而这可能会增加建立时间违反的可能性, 并且增大了组合电路的面积
- 保持时间检查用的一般都是电路工作的最佳条件,而在这个条件下,连线延时往往 是被忽略的,连线延时也是必须在布局后才准确
如果确定要同时作建立和保持时间检查,那么在施加电路约束的时候要加入相应的开关,比如——
以及设置各自的工艺库——
下面详细谈一下设置保持时间的输入/输出延时——
上面描述的是基于保持时间的输入延时,需要设置外围输入电路最快到达被综合模 块输入端口的时间,假设CLK 周期 10ns ,FF2 的保持时间为 1ns ,输入最小延时 0.3ns, 那么可以写成——
可以推断出,此时N 路径必须满足的最小延时为 1ns-0.3ns=0.7ns。
- set_output_delay -min
图中所示,FF4 是输出电路外围的一个触发器,它的保持时间是 0.5ns ,T 路径的最 小延时是 0.3ns ,那么得到FF3 所在电路的输出最小延时(set_output_delay –min)就要比较 小心,它的计算公式不是 0.5-0.3=0.2ns ,而是 0.3-0.5=-0.2ns 。这一点需要引起大家的注 意,此时留给S 路径的最小延时为 0.2ns。
设置最小输出延时的命令如下——
修正保持时间违反
默认情况下,DC 不修正保持时间的违反。如果确定要作修正,需要先设置一个变量再 作检查——
加上 only_design_rule 的开关后,编译过程中仅仅更换单元大小,并增加 buffer ,以便 修正设计规则违反和保持时间违反。
下面是一个设置保持时间约束和修正保持时间违反的脚本——