DC学习(综合与优化)
1、综合策略
(1)top-down:层次化结构,只对顶层设计进行全面约束,针对个别模块有特殊约束;比如管理模块(clock模块,reset模块等)的综合不会与工作模块(顶层模块)放在一起综合的
(2)bottom-up:对底层的各个模块定为current_design,进行综合,加上dont touch属性;若各层之间有group logic(如与门),还需要对group logic约束;这种风格的综合约束复杂且多
2、三个阶段的优化
第一阶段的结构级的优化(Architectural-Level Optimization)
第二阶段的逻辑级优化(Logic-Level Optimization)
最后阶段的门级优化(Gate-Level Optimization)
(1)结构级优化(architectural-level)
包括:设计结构的优化,数据通路的优化,共享共同的子表达式,资源共享,重新排序运算符号
例如:加法器有普通加法器,超前进位加法器,DC会根据应用场合挑选出合适的加法器
(2)逻辑级优化(logic-level)
一个逻辑表达式可以是与非格式,也可以是或非格式,DC会选择合适的逻辑表达式来描述逻辑功能
(3)门级优化(Gate-level)
得到网表后的优化,局部优化。网表文件生成后,静态时序分析时,DC工具对路径进行分析,对关键路径进行优化,逻辑级优化与门级优化可以迭代使用(若路径延时过大,不满足设计规则,DC会resynthesis,一直到路径延迟满足要求)。
常见的算术优化方法:
逻辑复制(logic duplication):
对关键路径部分的负载放在其他路径上,减少关键路径延时,以面积换速度
DC综合之后,我们查看详细的报告,如果没有违规,设计既能满足时间和面积的要求又不违犯设计规则,那么综合完成。可以把门级网表和设计约束等交给后端(backend)工具做布局(placement )、时钟树综合(clock tree synthesis)和布线(route)等工作,产生GDSII文件。如果设计不能满足时间和面积的要求或违犯设计规则等,就要分析问题所在,判断问题的大小,然后采取适当的措施解决问题。问题往往是时序的问题,发生时序违规时可以采取相应的措施,如下图所示:
(1)当违规得比较严重时,也就是时序的违规(timing violation)在时钟周期的25%以上时,就需要重新修改RTL代码了
(2)时序违规在25%以下,有下面的时序优化方法:
- 使用compile_ultra命令(在拓扑模式下运行)
compile_ultra跟compile一样,是进行编译的命令。compile_ultra命令适用于时序要求比较严格,高性能的设计。使用该命令可以得到更好的延迟质量( delay QoR ),特别适用于高性能的算术电路优化。该命令非常容易使用,它自动设置所有所需的选项和变量。
compile_ultra命令支持DFT流程,此外compile_ultra命令非常简单易用,它的开关选项有:
-scan :做可测试(DFT)编辑;(扫描链是在寄存器前加入选择器,在DFT时可能会有影响,如果想加入scan扫描链,在综合的时候必须评估扫描链寄存器的影响,即加入-scan命令)
-no_autoungroup :关掉自动取消划分特性;( compile默认不打散,compile_ultra会自动将模块打散,打散后只能看到top层和具体实现;)
-no_boundary_optimization :不作边界优化;(在编辑时,Design Compiler会对传输常数,没有连接的引脚和补码信息进行优化,也就是说边界优化会把边界引脚一些固定的电平,固定的逻辑进行优化。但是在formility(形式验证),需要告诉formility电路结构发生了改变。这个改变存放在DC的生成文件里)
-no_uniquify : 加速含多次例化模块的设计的运行时间
-area_high_effort_script : 面积优化
-timinq_high_effort_script : 时序优化
-timing关键路径上时序的优化,但如果时序余量较大,不适宜使用该命令,否则会使时序优化的优先级大于DRC(DRC,时序优化,面积优化)
-Behavior Retiming(简称BRT技术)(对门级网表的时序进行优化,也可以对寄存器的面积进行优化。BRT通过对门级网表进行管道传递(pipeline)(或者称之为流水线),使设计的传输量(throughput)更快)
对于寄存器的的优化,举例如下,对于下面的电路,既包含有组合逻辑电路又包含有寄存器:
后级的寄存器与寄存器之间的时序路径延迟为10. 2 ns,而时钟周期为10 ns,因此,这条路径时序违规。但是前级的寄存器与寄存器之间的时序路径延迟为7. 5 ns,有时间的冗余。使用optimize_registers命令,可以将后级的部分组合逻辑移到前级,使所有的寄存器与寄存器之间的时序路径延迟都小于时钟周期,满足寄存器建立时间的要求。
-retime与optimize_registers区别:-retime针对一般逻辑,optimize_reggisters针对pipeline结构进行优化;两者可以同时使用(当有一个路径不满足,而相邻的路径满足要求时,DC会进行路径间的逻辑迁移,以同时满足两条路径的要求,这也叫adaptive retiming)
retime主要通过moving,spliting,merging来进行优化,如下图
对于纯组合逻辑的流水线(管道)优化,举例如下,对于纯组合逻辑电路进行优化如下所示:
左边电路,是一个纯组合电路,它的路径延迟为23. 0 ns。对这个电路进行管道传递优化后,得到右边所示的电路。显然,电路的传输量(throughput)加快了。需要注意的是,在使用这个命令时,需要在RTL设计中把寄存器预置好,否则DC不知道这些寄存器是怎么来的。
路径分组group_path
DC为了便于分析电路的时间,时序路径又被分组。路径按照控制它们终点的时钟进行分组。如果路径不被时钟控制,这些路径被归类于默认(Default)的路径组。我们可以用report_path_group命令来报告当前设计中的路径分组情况。执行report_timing命令时,DC做4个步骤:
- 把设计分解成单独的时间组
- 每条路径计算两次延迟,一次起点为上升沿,另一次起点为下降沿
- 在每个路径组里找出关键路径(critical path),即延迟最大的路径
- 显示每个时间组的时间报告
如果DC不进行专门的分组,只有默认(Default)的路径组,DC只对默认组的关键路径进行优化,当它不能为关键路径找到一个更好的优化解决方案时,综合过程就停止。DC不会对次关键路径(Sub-critical paths)作进一步的优化。
对于下面的电路,假设加设计约束后,所有的路径属于同样的时钟组,也就是只有一个路径组:
如果组合电路部分的优化不能满足时序要求,并且关键路径在组合电路里,根据DC的默认行为,组合电路中关键路径的优化将会阻碍了与它属于相同时钟组的寄存器和寄存器之间路径的优化。防止出现这种情况可用下面两种方法:自定义路径组和设置关键范围。
1、自定义路径
综合时,工具只对一个路径组的最差(延时最长)的路径作独立的优化,但并不阻碍另外自定义路径组的路径优化。产生自定义路径组也可以帮助综合器在做时序分析时采用各自击破(divide-and-conquer)的策略
产生自定义路径组的命令如下所示:
#Avoid getting stuck on one path in the reg-reg group
group_path -name INPUTS -from [all_inputs]
group_path -name OUTPUTS -to [all_outputs]
group_path -name COMBO -from [all_inputs] -to [all_outputs]
上面的命令产生三个自定义的路径组,加上原有的路径组,即寄存器到寄存器的路径组(因为受CLK控制,默认的是CLK的路径组),现在有4个路径组。
产生自定义的路径组后,路径优化如下图所示,此时,寄存器和寄存器之间的路径可以得到优化:
DC可以指定权重进行优化,当某些路径的时序比较差的时候,可以通过指定权重,着重优化该路径。权重最高5,其次是2,默认是1;因此最差的要设置5;如下图所示,下面的命令就是着重优化CLK这个路径组:-weight
2、设置关键范围
-critical_range:对路径优化的范围设置,每个组内在范围内的路径都会被优化
set_critical_range 2 [current_design]
使用上面的命令之后,DC会对在关键路径2ns的范围内的所有路径作优化,解决相关次关键路径的时序问题可能也可以帮助关键路径的优化。
如果在执行set_critical_range命令后,优化时使关键路径时序变差,DC将不改进次关键路径的时序。
自定义路径组+关键范围:
自定义路径组: 用户自定义路径组后,如果设计的总性能有改善,DC允许以牺牲一个路径组的路径时序(时序变差)为代价,而使另一个路径组的路径时序有改善。在设计中加入一个路径组可能会使时序最差的路径时序变得更差。
关键范围: 关键范围不允许因为改进次关键路径的时序而使同一个路径组的关键路径时序变得更差。如果设计中有多个路径组,我们只对其中的一个路径组设置了关键范围,而不是对整个设计中的所有路径组都设置了关键范围,DC只会并行地对几条路径优化,运行时间不会增加很多。
1、打开DC
2、读入verilog代码检查等等
3、读入约束然后compile -map_effort high -area_effort high;最大compile,相当于compile ultra
(report_timing -delay_type max 检查最差路径)
report_path_group
4、加入路径组约束
report_path_group会得到四条路径
report_timing -delay_type max 检查最差路径
综合后处理时序分析
一、编译及编译后步骤
1、第一次综合
compile_ultra | -no_boundary | -no_autoungroup | -scan | -timing | -retime
2、查看时序
report_constraint -all_violation
report_timing
3、若第二步时序检查有violation,则可进行group_path增添路径,优化多条路径,改进时序约束等等
group_path -critical -weight …
4、再次编译
complile_ultra…
5、若violation还有,继续修改,若violation改进不了,则返回rtl代码阶段,修改代码
二、report_timing
1、check_timing与report_timing区别
check_timing:检查路径是否都有约束,约束是否完整,在综合之前检查
report_timing:检查时序有没有问题,在综合之后检查
2、时序报告的查看
Design Compiler中,常用report_timing命令来报告设计的时序是否满足目标(Check_timing:检查约束是不是完整的,在综合之前查看,要注意不要与这个混淆)
有四个主要部分:
(1)第一部分是路径信息部分
主要报告了工作条件,使用的工艺库,时序路径的起点和终点,路径所属的时钟组,报告的信息是作建立或保持的检查,以及所用的线负载模型
(2)路径延迟部分
这个路径延迟部分是DC计算得到的实际延迟信息;命令执行后,对于下图中的路径,得到的一些路径信息,有了单元名称(point),通过该单元的延时(Incr),经过这个单元后路径的总延时等信息:
- 路径的起点:上一级D触发器的的时钟端
- input external delay:(由于上一级D触发器的翻转(路径的起点也就这里)、芯片外部组合逻辑而经历的)输入延时约束(set_input_delay),也就是数据到达芯片的数据输入管脚的延时建模,这个延时是1ns;”r”表示上升延时,”f”表示下降延时
- clock network delay(idle):时钟信号从芯片的端口到内部第一个寄存器的延时是0.5ns
- Data1(in):芯片输入端口到芯片内部真正数据输入端之间的线延时,是0.04ns。(可以认为是管脚的延时)
- U2/y :前面0.12表示u2这个器件的翻转/传输延时,意思是从这个器件的数据输入端(包括连线),到输出端y的延时是0.12ns。后面的1.66的意思是从路径起点到u2的y输出的延时是1.66ns.
- 最后u4/D:这里就是终点了,D触发器的数据输入端;当然终点也可能是芯片的输出端口
报告中,小数点后默认的位数是二,如果要增加有效数(字),在用report_timing命令时,加上命令选项“-significant_digits"。报告中,Incr:是连线延迟和其后面的单元延迟相加的结果。如要分别报告连线延迟和单元延迟,在使用report_timing命令时,加上命令选项"-input_pins"
(3)路径要求部分
这个路径要求部分是我们约束所要求的部分;值-0. 06从库中查出,其绝对值是寄存器的建立时间。值2.17为时间周期加上延时减去时钟偏斜值再减寄存器的建立时间(假设本例中的时钟周期是2 ns)
(4)时间总结部分
DC得到实际数据到达的时间和我们要求的时间后,进行比较。数据要求2.17ns前到达(也就是数据延时要求不得大于2.17ns),DC经过计算得到实际到达时间是2.15ns,因此时序满足要求,也就是met,而不是时序违规(violation)。时间冗余(Timing margin),又称slack,如果为正数或‘0’,表示满足时间目标。如果为负数,表示没有满足时间目标。这时,设计违反了约束(constraint violation)。
问题所在:
1、外部的输入延迟为22 ns,对于时钟周期为30 ns的设计,显然是太大了。2、设计中,关键路径通过6个缓冲器,需要考虑这些缓冲器是否真的需要;3、OR单元的延迟为10.72ns,似乎有问题。
4、关键路径通过四个层次划分模块,从模块u_proc,经模块u_proc/u_dcl,经模块u_proc/u_ctl,到模块u_int。前面我们说过,DC在对整个电路做综合时,必须保留每个模块的端口。因此,逻辑综合不能穿越模块边界,相邻模块的组合逻辑并不能合并。这4个层次划分模块使得DC不能充分使用组合电路的优化算法对电路进行时序优化,是否考虑需要进行模块的重新划分。
查看violations
report_constraint -all_violation:
- 查看是否有timing违规:hold time violation在后端可优化,所以可忽略;set time violation需要解决。
- 查看DRC是否有违规:一定要解决掉。
- 查看area是否有违规:有时可忽略。
上一篇: Linux(centOS 7.2)下nginx安装步骤
下一篇: unity3d中Lua的技能学习