EDA13--DC脚本命令(二)

前文介绍了一部分DC脚本的使用,包括启动、读入与链接、工作环境、输入输出负载、规则约束、时序定义、时钟定义I/O口定义、组合逻辑约束、时序逻辑定义、设计面积约束。
本文接着介绍剩余的,包括设计优化方法,编译策略,设计编译,优化技巧,导出报告,生成文件。

一、 设计优化方法

设定完各项综合约束后就可以进行编译,即设计优化了,但通常情况下,设定完约束后并不马上进行综合优化,因为对一个较大的设计而言,综合一次消耗的时间一般都较长,数小时甚至几天,因此综合前确认综合约束命令是否正确添加到设计中是很有必要的,这可以降低由手约束不正确而重新综合的风险,减少迭代次数。检查综合约束的常用命令有:

report_design
report_port -verbose
report_clock
report_constraints
report_timing_requirement

完全优化的设计是指满足所有时序要求,并且占用面积最小的综合后门级网表。当然,面积最小是约指,不是确指,需要根据项目运行实际来判定是否面积最小。优化是基于设计的功能、时序和面积等约束进行的,目标即是满足设计约束。
DC中的优化一般包括三个步骤:结构优化、逻辑优化和门级优化。

1.1结构优化

结构优化,有时也称为high-level优化,是根据设计约束,针对RTL编码风格进行的优化。该步骤执行的操作包括:
选择Design Ware实现 (Design Ware Implementation Selection)
共享公共的子表达式 ( Sharing Common Subexpressions)
共享资源 (Resource Sharing)
操作符重排序 (Reordering Operators)

1.1.1 选择Design Ware实现

以上操作中,除了 Design Ware Implementation Seletion 外,都是针对未映射的设计进行的。该步骤得到一个以GTECH库的元件表示的设计。比如有段代码:

if(enable)
y <= A + B;
else
y <= C + D;

那么“+”电路入何实现,最终电路中应该有几个加法器。在配置文件中指定的 systhetic_library可以起提供DC根据速度、面积等折中考感而选择的电路结构,如下图所示:
在这里插入图片描述
从上图的加法器可以看出,DW Foundation 除了具有 Carry Look-Ahead 和 Ripple Carry 两种结构的加法器外,还有另外四种结构,并且速度更快。
如果要 Foundation 的 Design Ware除了需要有 Design Ware Foundation 的 Licesen 之外 还需要在综合的时候设置 synthetic_library
在这里插入图片描述

1.1.2 共享子表达式

这里的子表达式主要是指数学表达式,比如下面这个例子,如果按照原来的语句综 合,会包含 6 各加法器,但是如果表达式之间的公共项提取出来,便可以大大的减小面积,如下图:
在这里插入图片描述
如果要直接综合出共享后的电路,可以在编写 RTL 代码的时候强制指定共享项:
在这里插入图片描述

1.1.3 资源共享

资源共享的原理与共享子表达式类似,只不过这里指的所谓资源是一些 HDL 的运算符和表达式,比如加(+)、减(-)、乘(*)、除(/)以及大于(>)、大于等于(>=)、小于(<)、小于等于(<=)。 这里举例子:
在这里插入图片描述
它可能有下面两种电路实现:

在这里插入图片描述
DC会根据具体的约束条件综合出最符合要求的结构来。

1.1.4 运算符排序

对于下面这个表达式 Z <= A + B + C + D;(输出 Z 是施加了一定时序约束),DC最初是按照从左至右的顺序计算的,也就是说它最初的排序如下:
在这里插入图片描述

如果几个输入信号到达的时间相同, DC 会通过运算符排序优化成下图的平衡的结构,减小延时:
在这里插入图片描述
如果 A 信号较迟到达, 综合出的电路结构会如下:
在这里插入图片描述

1.2逻辑优化

逻辑优化针对结构优化得到的 GTECHT 网表进行优化,也可以称为是对布尔方程的控制,一般包括两个过程:展平和构造。
展平(Flattening):展平是把组合逻辑变成一种两级积之和的形式。展平是独立于约束的,在展平过程中,DC 把设计中的所有中间变量去掉,可以提高速度但会增加面积。但需要两点:一是受限于工艺库的影响,展平也许不能保证把设计映射成 SOP 形式;二是展平操作并不影响设计的层次结构,其命令是set_fatten,与消除层次的命令 ungroup 不同。虽然“fatten”通常意味着去掉层次结构,但在DC中,“fatten”有其特殊的含义,fatten 仅仅指展平一个逻辑表达式而不是展平设计。如下是展开的示例:
在这里插入图片描述
用到的命令:
在这里插入图片描述
**构造(Structuing):**构造是基于约束的,通过给设计添加中间变量和逻辑结构,使得逻辑共享,可以减少设计的面积。构造过程中,DC 在设计中寻找最有可能减少逻辑的子设计,将其设为中间变量,从设计表达式中提取出来。其命令为 set_structure。如下图所示:
在这里插入图片描述
结构化电路的典型是奇偶校验电路。
由于DC 默认是用结构化的方式综合逻辑级电路, 而且这种方式可以得到兼顾时序和面积的结果, 因此我们可以先用这种方式优化。 在优化后的电路中找出关键路径, 看关键路径上有没有符合使用 SOP 电路的模块,再将这些方便使用 SOP 的模块 set_flatten,以便取得最佳的效果。

1.3门级优化

门级优化是优化的最后阶段, 它所要完成的任务就是将 GTECH 的电路映射到最终的工艺库中,并且保证映射后的电路不违反设计规则(Design Rule) 。
门级优化产生目标库上的最终网表。一般包括:映射、延时优化、设计规则修正和面积优化。逻辑优化和门级优化都通过命令compile 完成,但满足所有约束、或用户中断、或DC 无法满足约束且无法进一步优化时,编译就会停止。
综上关于优化的三个步骤,可表示为:
在这里插入图片描述

1.3.1工艺映射

工艺映射包括组合逻辑映射和时序逻辑映射。 组合逻辑映射是指 DC 使用工艺库中的各种门替换 GTECH 单元,并选择能实现相同逻辑的符合时序及面积要求的单元。
在这里插入图片描述
映射的方法和组合逻辑相类似, 也是出于速度和面积的考虑, 尽量使用复杂的时序单元吸收一部分组合逻辑。
在这里插入图片描述

1.3.2设计规则检查

对于工艺库的单元而言, Foundry 都指定了每个单元的工作条件的限制, 比如最大电容(max_capacitance)等等, 这些限制也可以称为设计规则(Design Rule), 在设计规则限定的范围内, Foundry 提供的参数才有实际的意义。 比如一个单元允许的最大电容为 5pf,而实际工作电路中出现的电容值为 10pf, 那么这时, 便违反了设计规则, 单元的参数也就不能确保是准确的了。
因此DC在作门级优化的时候,在映射的过程中也会检查电路的设计规则,一般的做法是在单元中插入 buffer 增加驱动能力, 或者将小驱动的单元替换为大单元。 设计规则检查分为两个过程—DRC I 和 DRC II。DRC I 是指 Design Compiler 在不影响电路的时序和面积的前提下修正违反规则的一些单元, 如果在这个前提下不能完全修正, 则要进行下一步的检查, 即 DRC II,这一步的修正必然是以牺牲一部分时序和面积为代价的。

二、 编译策略

通常设计中都包括多个层次结构和多个子设计,如何选择编译策略会影响到编译时间好优化结构。常见编译策略有:自顶向下层次化编译(Top-Down)、时间预算编译、Bottom-UP的CCWSR方法。

2.1 Top-Down

指对顶层设计和所有的子设计同时进行编译,首先自低向上读取所有的源码,然后在顶层施加约束,进而执行编译。
优点:方法简单,只需要顶层约束、易理解,编写,维护、由于在整个设计上进行优化,可得到更优的结果;
缺点:编译时间长、对子模块的增量改变需要重新综合整个设计、若设计有多个时钟就会缺乏对子设计的恰当约束而导致结果不理想。
TOP-DOWN编译思路如下:
在这里插入图片描述

自上而下的编译方法有一个明显的优点, 即它使得设计者无需考虑各个子模块之间的依赖关系, 也就不需要制定子模块之间的时序和负载预算,这一切都由 Design Compiler 自动考虑。 另外, 使用这种方法也使得设计者编写脚本变得简单, 维护起来也比较方便。

2.2 Bottom-UP

自底向上的策略对不具有明确的模块关系的设计比较有用,且不受机器内存的限制。该方法在设计的项层施加约束,并且对每个子设计进行预编译,然后使用 characterize 命令和 write_script命令为子设计保存综合脚本,继而重新读入设计并对顶层进行编译。
characterize命令根据子设计的工作环境计算实际的属性和约束;write_scrip命令输出执行characterize命令的模块的约束脚本。characterize 命令的使用如下图所示,对应的脚本如下:
在这里插入图片描述

current_design TOP
characterize_constraints [get cells U2]
current_design B
compile -incremental mapping -map effort high

和前一种方法不同, 自下而上的编译方法需要先单独编译各个子模块, 在编译子模块的同时要考虑到与其它模块之间的关系, 看是否满足约束, 然后再读入顶层文件, 施加顶层约束, 顶层编译完成之后还必须看顶层约束是否满足。 下面是单个模块编译的脚本。
在这里插入图片描述
下面是顶层模块编译脚本:
在这里插入图片描述
从上面的过程不难看出 Bottom-Up方法的一些特点——优点是利用了”分而治之”的策略, 这对于大型的不可能一次编译的设计是十分有用的;另外它也摆脱了 Top-down 方法的对工作站硬件条件的限制,使得大型设计也能在一般的机器上编译完成。缺点是实现步骤比较多, 尤其对各个模块之间的时序和负载预算要求很高, 如果不注意会很容易造成违反。
综合上述两种方法, 我们可以做一个小结: 对于规模不算太大的设计, 我们推荐使用 Top-down 的编译方法, 这样可以在不长的时间内得到满意的结果。

2.3 CCWS

CCWS,基于时间预算的编译要求设计者根据设计规范为每一个子设计编写综合脚本,然后从底层开始综合每一个子设计直到完成最顶层设计的综合,最后再分析综合结果是否满足要求。
优点:子设计的脚本易于编写维护,且对子设计的综合结果较好;易于处理各个时钟和生成时钟;某一子设计的改变不需要整体设计的重新综合。
缺点:需要编写和维护的子设计脚本多;要求设计者为每个子设计指定时序约束,而这往往是比较困难的;顶层的关键路径对子设计而言可能并不是关键路径。

三、 设计编译

compile命令进行设计或模块的编译,将HDL代码映射到指定的目标库。其选项可用于设计的映射优化,语法格式为:

compile [-map_effort medium|high]
[-area_effort none|low|medium|high]
[-incremental_mapping]
[-ungroup_all]
[-auto_ungroup area|delay]
[-no_design_rule | -only_design_rule | -only_hold_time]
-map_effort:综合映射的努力程度,有medium和high两个选项,缺省默认为medium;
项,缺省为值与 map_ctfort 的值相同。
-area_effort:综合器面积优化的努力程度,有1ow,medium,high三个选项,缺省默认为medium;
-incremental_mapping:称为增量编译,指示综合器在前一次综合结果的基础上进一步优化,
只用在门级,通常用于改善时序和修正 DRC违规。增量编译时,DC 会进行各种映射优化以改善时序。若只对设计修正DRC,可以加上
-only_desien_rule 选项;
-ungroup_all:对设计中除了具有dont_touch属性的设计外全去除层次。
-auto_ungroup:对设计中的层次结构根据需要自动去除层次。

比如,在初次编译时采用 medium 的映射努力,增量编译时采用high的映射努力,相应命令为:

#1st compile
compile -map_effort medium
#2nd compile
current_design xsoc
compile -incremental -map_effort high

编译时,DC提供了 compie_ultra命令,包括许多高级的综合优化算法,可以使关键路径的分析和优化在最短时间内完成。

四、 优化技巧

除了编译选项的选择外,设计者还可以根据优化目标的不同进行不同设置。

4.1消除层次

综合在默认情況下是保持设计的层次结构的,尽管可以让 DC 跨越边界优化,但为了去掉不必要的层次,可以采用 ungroup 打平设计,这与前面讨论的展平不同。例如要彻底消除某设计xsoc 内部的层次关系,可以采用如下命令:

dc_shell-t>current_design_xsoc
dc_shell-t>ungroup -flatten -all

4.2限制使用某些单元

有些情况下,不希望综合结果采用目标库中的特定单元,可以采用set_dont_use命令实现。比如,限制使用带scan 的触发器,可以采用如下命令进行设置:

dc_shell-t>set SCAN_FF1 smic13_ss/FFS*
de shell-t>set_dont_use $SCAN_FF1

4.3 设置关键路径范围(critical range)

关键路径指违反设计约束最严重的路径,也是DC 优化的重点,但对于接近违规最严重的路径,DC 通常不对其进行优化,因此可以设置一个关键路径的范围,指示DC对处于该范围内的路径都进行优化;这会增加编译时间,通常和group_path一样作为优化最后阶段采用的方法。比如设置关鍵路径范围为2ns,则所有处于关键路径2ns范围内的路径都被优化,而其他路径DC 将不优化。

dc_shell-t> set_critical_range 2 [current design]

4.4 时序优先

如果设计是时序优先的,可以尝试如下方法:
使用ungroup去除不必要的层次;
使用group_path 命令创建路径组,并为该组内的路径设置DC优化的优先级;
调用 DC-Ultra,即使用compile_ultra 命令。

4.5 面积优先

如果设计对面积比较敏感,可以尝试如下方法:
获取设计的最小面积,对设计最小面积的预估可以通过调用 simple compile mode 的编译完成,该编译模式没有任何时序约束。对应命令为:

dc_shell-t> set simple_compile_mode true
dc shell-t> compile

对小的设计模块通过 ungroup命令消除层次,以实现单元共享;该操作也可以通过 compile-auto_ungroup area命令自动完成。
设计若是面积关键的,可通过命令set_max_area area_constraint [ignore_tns]明确指示工具。其中-ignore_tns 选项用以指示面积的优先级高于总的时间违反。
使用 compile -arca_effort high 可以减少单元数目。
设置变量 compile_sequential_area_recovery 为 trure。
启动构造以减少面积,set compile_new_boolean_structure true 。

五、 导出报告

DC生成的报告信息是分析设计的关键,DC提供了多个命令用于保存综合的报告。

5.1违规报告

命令report_constraint用于报告设计中违反约束的信息,包括设计规则\建立时间、保持时间和面积。违规分为 big 和small,一般把小于等于设计约束 10%的违规归类为 small,其他归为 big。对于big 违规,要从确认约束符合实际、划分是否合理、要否ungroup不必要子模块、构造展平、high映射努力、修改HDL代码等角度尝试修正;

对于small违规,则需考虑增量编译、high映射努力、设置关键路径范围等角度尝试修正,其语法格式为:

report_constraint [-all_violators] [-verbose]
-all_violators:给出设计中关于优化和设计规则的违规信息。
-verbose:给出违规的详细计算信息。

比如要把所有违规报告保存到报告日录(report_path)下的文件

con_violators.rpt 中,则可用如下命令:
dc_shell-t>report_constraint -all_violators > $report _path/con_violators.rpt

5.2 检查设计

当设计中存在多实例化或未连接的引脚时,check_design就返回 warning;当设计中有未被约束的引脚、门控时钟时,check_timing 就会返回 warning。

5.3 时序报告

对于多数设计而言,时序报告可说是最重要的一类报告,由命令report_timing完成。Report_timing 给出设计的时序信息。

report_timing [-to to_list]
[-from from_list]
[-through through_list]
[-path full]
[-delay min | max]
[-nworst paths_per_endpoint]
[-max_paths max_path_count]
[-nets] [-capacitance] [-nosplit]
-from. -through, to:指定时序路径的起点、经过节点、终点列表。
path:给出完整的时序路径信息。
-delay:指定路径的延时类型,min 代表保持时间检查,max 代表建立时间检杳。
-nworst:指定为每个终点报告的路径数,默认为1。
-max_paths:指定为每个路径组报告的路径数,默认为1。
-nets:指定在报告中显示每个单元的扇出。
-capacitance:指定在报告中显示互连线上的集总电容。
-nosplit:指定报告中的内容超过固定的列数时仍显示在同一行上。
比如产生到z1 的最差两条路径的建立时间报告,可用命令:
dc_shell-t>report_timing -to z1 -nworst 2

5.4 面积报告

面积报告由命 令report_area 完成,其语法格式为:

r

eport_area [-nosplit]
-nosplit:指定报告中的内容超过固定的列数时仍然显示在同一行上。

比如要所有的面积报告保存到报告目录中则可用如下命令:

dc_shell-t>report_area > $report_path/area.rpt

5.5 时钟报告

时钟报告由命令report_clock 完成,其语法格式为:
r

eport_clock [-attributes] [-skew] [-nosplit]
-attributes:报告时钟信息,如源类型、上升时间、下降时间和属性,缺省情况下该选项有效。
-skew :报告时钟的歪斜信息,如上升时间、下降时间、不确定性。
-nosplit如上述。

比如要把所有的时钟属性信息保存到报告目录下clock.rpt则可用如下命令:

dc_shell-t>report_clock > $report_path/clock.rpt

5.6线负载报告

线负载信息由命令report_clock 完成,其语法格式为:

report_wire_load [-design design_name] [-name model_name] [-nosplit]
-design:指定为哪个设计报告线负载信息。
-name:报告线负载模型名称,默认报告所有模型。
-nosplit如上述。

比如要把当前设计中的线负载模型信息保存到报告目录 (report path) 下的文件wlm.rpt 中,则可用如下命令:

dc_shell-t> report_wire_load > $report_path/wlm.rpt

六、 保存设计

综合后的设计可以通过 write 命令保存输出。其语法格式为:

write -format db|verilog|vhdl -hierarchy -output filename
-format:指定输出数据格式,可以是 db、edif、equation、lsi、st、 pla、st、tdl、verilog、vhdl、xnf。Verilog 和 VHDL格式可读,但不保存约束信息;db格式不可读但可以保存约束信息。
-hierarchy:该选项指示 DC保存设计的所有层次。
-output:该选项指定输出文件的名称。

比如编译完成后,通常保存两个设计文件,一个db格式,一个Verilog格式,则可用如下命令:

dc_shell-t>write -format verilog -hier -output $map_path/xsoc_top.sv
dc_shell-t>write -format db -hierarchy -output $map_path/xsoc_top.db

由于综合过程中DC 对设计对象的命名可能导致分析不便,所以通常在保存设计前会调用如下命令以保证命名的规范。

dc_shell-t>change_names -rule verilog -h
  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值