基础知识"/>
【DC综合】综合基础知识
文章目录
- 一、综合流程
- 1.库的设置
- 2.读入文件
- 3.环境属性设置
- (1) set_operating_conditions
- (2) set_wire_load_model与set_wire_load_mode
- (3) set_load:设置输出负载
- (4) set_driving_cell:设置驱动能力
- 4.设计规则检查
- (1) set_max_capacitance:限制端口的最大电容负载值
- (2) set_max_transition:限制端口的最大传输时间
- (3) set_max_fanout:限制端口的最大扇出负载
- 5.时序约束
- (1) create_clock:生成时钟
- 综合模块时钟
- 虚拟时钟
- set_dont_touch_network
- (2) set_clock_uncertainty:skew+jitter(一般为0.2-0.3)
- (3) set_clock_latency一般为0.3-0.8
- (4) set_clock_transition
- (5) create_generated_clock:生成分频时钟
- (6) set_input_delay:设置输入延时
- (7) set_output_delay:设置输出延时(与input_delay相同)
- (8) set_false_path:解除时序约束
- (9) set_multicycle_path:设置多路径
- (10) set_disable_timing/set_case_analysis:将电路断开
- (11) set_min_delay/set_max_delay:设置路径最小/最大延迟(纯组合逻辑)
- (12) set_max_area:设置面积
- 6.实例唯一化设置 uniquify
- 7.编译 compile
- 8.输出
- 二、综合时遇到时序违例
- 1pile_ultra
- (1)optimize_registers:适合于包含寄存器的门级网表
- (2)pipeline_design:适合于纯组合逻辑的门级网表
- 2pile -scan -inc(增量编辑)
- 3.自定义路径组和关键范围
- (1)自定义路径组:允许以牺牲一条路径的时序来优化另一条路径的时序
- (2)关键范围(Critical Range):不允许牺牲关键路径的时序来优化其他路径的时序
- (3)自定义路径+关键范围
- (4)重新划分模块
- 三、具体知识
- 1.uncertainty、latency与transition
- 2.工作环境对cell延迟的影响set_operating_conditions
- 3.set_false_path与set_disable_timing的区别以及各自的应用场景
- 四、DC中的报告命令
- 五、电路优化
- 1.结构级优化
- (1)设计结构的选择(Implementation Selection)
- (2)数据通路的优化(Data-path Optimization)
- (3)共享共同的子表达式(sharing common subexpression)
- (4)资源共享(resource sharing)
- (5)重新排序运算符号
- 2.逻辑级优化
- (1)结构(Structuring)优化
- (2)展平(Flattening)优化
- (3)结构(Structuring)优化和展平(Flattening)优化的比较
- 2.门级优化
- 六、与综合相关的知识
- 7.参考文献
一、综合流程
综合总流程
1.库的设置
2.设计的读入(read verilog)
3.环境属性设置
set_operating_conditions
set_wire_load_model/set_wire_load_mode
set_load
set_driving_cell
4.设计规则约束
set_max_capacitance
set_max_transition
set_max_fanout
5.时序约束
create_clock
set_clock_uncertainty
set_clock_transition(一般为时钟周期的10%)
set_clock_latency
set_generated_clock:生成分频时钟
set_input_delay -max(建立时间约束)/set_input_delay -min(保持时间约束)
set_output_delay -max(建立时间约束)/set_output_delay -min(保持时间约束)
set_min_delay/set_max_delay(纯组合逻辑约束)
set_false_path(跨时钟域约束/异步复位信号约束)
set_multicycle_path(多周期约束)
set_max_area(面积约束)
6.编译命令以及DC输出格式
注:1.在前端设计中,一般不做hold_time的约束,hold_time的约束可以在后端修复(set_fix_hold)
2. Design Compiler默认所有路径都是单周期路径
综合流程图
1.启动DC——2.设置库环境——3.环境约束——4.设计规则约束——5.时序约束——6.实例唯一化(uniquify)——7.编译(compile)——8.输出
1.库的设置
1.设置搜索路径(search_path)
2.设置目标库(target_library)
3.设置链接库(link_library)
4.设置图像库(symbol_library)
set LIB_PATH "/home/xulu/DC/smic13"
set search_path "$search_path../rtl ./scripts $LIB_PATH/IO_01/Synopsys $LIB_PATH/STD/Synopsys $LIB_PATH/IO_01/Symbol/synopsys $LIB_PATH/STD/Symbol/synopsys"
set target_library "smic13_ss.db smic13IO_01_line_ss.db"
set link_library "* $target_library"
set symbol_library "smic13.sdb smicIO_01.sdb"
2.读入文件
read_verilog {fifo.v fc2sc.v sc2fc.v}
current_design fifo #指定顶层文件
link #链接
reset_design#删掉之前的约束
check_design #检查设计是否正确
3.环境属性设置
(1) set_operating_conditions
最差情况(延时最大)用于对建立时间的时序分析 -max slow.db
最好情况(延时最小)用于对保持时间的时序分析 -min fast.db
最差情况:高温低压
最差情况:低温高压
延时随着温度的升高而增大,随着电压的增加而减小
温度对延时的影响比电压对延时的影响更大
#做建立时间分析用最差情况
set_operating_conditions -max “slow”
#既要分析建立时间又要分析保持时间
set_min_library -max slow.db -min_version fast.db #最好的库fast-用于hold time分析;
set_operating_conditions -max slow -min fast#最差的库slow-用于setup time分析
(2) set_wire_load_model与set_wire_load_mode
#在布局布线之前应该使用比较悲观的模型,对最坏的情况做综合
set_wire_load_model -name reference_area_100000 -max(最坏情况)
#set_wire_load_model -name reference_area_100000 -library smic13_ss
DC自动选择WLM
set auto_wire_load_selection true
负载模块使用位置,三种情况
set_wire_load_mode top
set_wire_load_mode enclosed
set_wire_load_mode segmented(smic13_ss默认)
top:指定模块互连线延迟的估计使用顶层模块的线负载模型(一般使用最悲观的形式)
enclosed:指定模块互连线延迟的估计使用包含连线的最小模块的线负载模型
segmented:将连线按模型边界分段,各段的延迟分别按照各自模块的线负载模型估计延迟,然后把估计结果相加的得到该连线的延迟
(3) set_load:设置输出负载
set_load [load_of my_lib/and2a0/A] [all_outputs]
- 为了准确地计算输出电路的时间,DC需要知道输出单元所驱动的总负载电容
- set_load:明确说明端口(输入或输出)上的外部电容负载
- load_of:明确说明电容负载的值为工艺库中某一单元引脚的负载
- 电容负载的大小会影响它得延迟,负载越大,延迟越大,DC在缺省情况下认为端口的负载电容为0,因此具有无穷大的驱动能力
(4) set_driving_cell:设置驱动能力
set_driving_cell -lib_cell FD1 -pin Q [get_ports IN1]
- 在DC中用set_driving_cell命令明确说明输入端口是由一个真实的外部单元驱动
- 上述的例子说明输入端IN1由FD1的输出引脚Q驱动
- 该值越大,说明输入端口的驱动能力越弱,连线延迟越大(因此,保守起见,假设输入端口由驱动能力弱的单元驱动)
4.设计规则检查
设计规则优先级(向下优先级降低):max_capacitance、max_transition、max_fanout
以输入端口IN1为例对设计规则的脚本进行举例
(1) set_max_capacitance:限制端口的最大电容负载值
#从工艺库找出设计中预期驱动器的最大允许电容负载
set DRIVE_PIN TECH_LIB/invla27/Y #TECH_LIB为假设的库文件
set MAX_CAP [get_attribute $DRIVE_PIN max_capacitance] #找出Y的最大电容负载
#max_capacitance=3.60;在驱动器增加一些富余量使DC不会给它加满载
set CONSERVATIVE_MAX_CAP [expr $MAX_CAP/2.0]
set_max_capacitance $CONSERVATIVE_MAX_CAP [get_ports IN1]
#输入端口最大的电容负载=内部负载电容+外部负载电容
set_load 1.2 [get_ports IN1]
#外部电容负载为1.2pF,因此DC可以给输入端IN1施加的最大内部负载是:1.8-1.2=0.6pF
set all_in_ex_clk [remove_from_collection [all_inputs][get_ports CLK]]
set MAX_INPUT_LOAD [expr [load_of ssc_core_slow/and2al/A]*10]
set_max_capacitance $MAX_INPUT_LOAD $all_in_ex_clk
为整个设计加入最大电容设计规则
set_max_capacitance 3.0 $current_design
(2) set_max_transition:限制端口的最大传输时间
包括rising time和falling time,从10%的VDD变化到90%的VDD所需要的时间,一般设置为周期的10%
#从工艺库找出设计中预期驱动器的最大允许转换时间
set DRIVE_PIN TECH_LIB/invla27/Y
set MAX_TRANS [get_attribute $DRIVE_PIN max_transition] #找出Y的最大转换时间
#max_transition=0.4;在驱动器增加一些富余量使DC不会给它加满载
set CONSERVATIVE_MAX_TRANS [expr $MAX_TRANS/2.0]
set_max_transition $CONSERVATIVE_MAX_TRANS [get_ports IN1]
为整个设计加入最大转换时间的设计规则
set_max_transition 0.4 $current_design
(3) set_max_fanout:限制端口的最大扇出负载
设置最大扇出负载,不影响时序,只用作设计规则检查
set_max_fanout 6 [get_ports IN1]
需要注意的是,set_max_fanout命令使用的是扇出负载(fanout_load),而不是绝对的扇出数目。电口的扇出负载之和必须小于最大扇出的设计规则约束
为整个设计加入最大扇出负载的设计规则
set_max_fanout 6 $current_design
5.时序约束
(1) create_clock:生成时钟
综合模块时钟
create_clock -period 10 [get_port Clk]
其中,10为时钟周期,单位ns;Clk为时钟端口名
虚拟时钟
虚拟时钟在设计里不驱动触发任何寄存器,它主要用于说明相对于时钟的I/O端口延迟。
说明:(1)因为虚拟时钟不驱动设计中的任何寄存器,设计中没有其对应的输入端口,所以定义中没有端口或引脚;因此必须对虚拟时钟命名
(2)虚拟时钟主要用作为输入/输出端口设置延迟
例子如下:
create_clock -period 20 [get_ports CLKC]
create_clock -period 30 -name CLKA
set_input_delay -max 5.5 -clock CLKA [get_ports IN1] #见5.6
当一个端口存在多个时钟约束时
#对输出端口OUT1添加两个约束
create_clock -period [expr 1.0/75*1000] -name CLKD #得到一个不为0的实数[expr 1.0/75*1000]
create_clock -period 10 -name CLKE
create_clock -period 20 [get_ports CLKC]
set_output_delay -max 2.5 -clock CLKD [get_ports OUT1] #见5.7
set_output_delay -max 4.5 -clock CLKE -add_delay [get_ports OUT1]
说明:“-add_delay”意思为输出端口OUT有两个约束。如果不加该选项,第二个“set_output_delay”命令将覆盖第一个“set_output_delay”命令,此时输出端口OUT只有一个约束
set_dont_touch_network
在net和port上设置don’t touch属性,表明DC综合时不会对该部分做优化,不会插入buffer,留到布局布线时综合。主要用于clock和reset信号。如:
set_dont_touch_network [get_clocks CLK]
(2) set_clock_uncertainty:skew+jitter(一般为0.2-0.3)
set_clock_uncertainty -setup TU [get_clocks CLK]
- -setup为开关选项,也可选为-hold,分别为建立和保持时间的偏差值。如果不加选项,则对建立保持时间赋予相同值
- TU:为约束的uncertainty值,一般为0.2-0.3
- CLK为时钟端口名
(3) set_clock_latency一般为0.3-0.8
set_clock_latency -source 3 [get_clocks CLK]
set_clock_latency 1 [get_clocks CLK]
- 时钟源延迟(Source Latency):时钟信号从实际时钟原点到设计中时钟定义点的传输时间
- 时钟网络延迟(Network Latency):定义的时钟信号点到寄存器时钟引脚的传输时间
- CLK为时钟端口名
如下图所示:
(4) set_clock_transition
set_clock_transition 0.25 [get_clocks CLK]
- 默认的上升转换时间为:20%—80%;下降转换时间为80%—20%
- set_clock_transition中也存在-setup/hold开关选项,分别对应建立(上升)/保持(下降)时间。如果不加开关选项,则认为该命令给时钟赋予相同的上升/下降转换时间
- CLK为时钟端口名
(5) create_generated_clock:生成分频时钟
#分频时钟的定义
create_clock -period 50 [get_ports Ext_Clk]
create_generated_clock -name Int_Clk -source [get_pins CLOCK_GEN/U2/CP] -divide_by 2 \
[get_pins CLOCK_GEN/U2/Q] #Int_Clk是U2 CP(即Ext_Clk)二分频
set_clock_latency -source 1.5 [get_clocks Int_Clk]
set_clock_latency 0.5 [get_clocks Int_Clk]
(6) set_input_delay:设置输入延时
用于建立时间分析,-max选项
#对时钟以外的所有输入端口设置约束
set_input_delay -max 6 -clock CLK [remove_from_collection [all_inputs][get_ports clk]]
#对输入端口A添加约束
set_input_delay -max 6 -clock CLK [get_ports A]
用于保持时间分析,-min选项
set_input_delay -min 4 -clock CLK [remove_from_collection [all_inputs][get_ports clk]]
去掉rst_n这些不需要设置输入延时的信号
remove_input_delay [get_ports rst_n]
要移掉多个时钟,用下面的命令
remove_from_collection [all_inputs][get_ports “clk1 clk2”]
(7) set_output_delay:设置输出延时(与input_delay相同)
#用于建立时间分析,-max选项
set_output_delay -max 5.4 -clock CLK [get_ports B]
#用于保持时间分析,-min选项
set_output_delay -min 1 -clock CLK [get_ports C]
注:input_delay和output_delay的设置需要根据具体情况设置
(8) set_false_path:解除时序约束
主要对异步电路和逻辑上不存在的电路做约束。优化时,对这些部分不做优化处理。如果要取消则使用reset_path
#复位引脚
set_false_path -through [get_ports rst_n]
#两个时钟clka,clkb
set_false_path -from [get_clocks clka] -to [get_clocks clkb]
set_false_path -from [get_clocks clkb] -to [get_clocks clkb]
(9) set_multicycle_path:设置多路径
默认保持分析时间咋建立时间分析的前一周期,假设加法器的延迟约为6个时钟周期
set_multicycle_path -setup 6 -from [get_cells FF1] -to [get_cells FF2]#第6个周期才分析建立时间
假设时钟周期是10ns,则建立时间分析是在第60ns进行;而保持时间分析默认在50ns,如下图所示:
实际上引起寄存器C_reg的D引脚信号变化的是时钟CLK在0ns时刻的触发沿(Launch)。在0ns,时钟CLK将寄存器A_reg和B_reg的D引脚信号采样到它们的输出端,再通过加法器,把信号传输到寄存器C_reg的D引脚。因此对保持时间(采样沿之后数据保持稳定的时间)的分析应在0ns时,正确的约束为:
set_multicycle_path -setup 6 -from [get_cells FF1] -to [get_cells FF2]
set_multicycle_path -hold 5 -from [get_cells FF1] -to [get_cells FF2]#第0个周期分析保持时间
(10) set_disable_timing/set_case_analysis:将电路断开
对该电路做约束为
create_clock -period 10 [get_ports Ext_Clk]
create_clock -period 100 [get_ports Test_Clk]
set_dont_touch_network [get_clocks Ext_Clk]
set_dont_touch_network [get_clocks Test_Clk]
#允许DC使用Ext_Clk做时序分析
set_disable_timing CLOCK_GEN/U1 -from a -to y #去掉了mux从引脚a到引脚y的时间弧(timing arc),这时DC认为它们之间没有时间关系
也可以使用set_case_analysis(模式特征)对该电路进行约束:
set_case_analysis 0 [get_pins U1/Sel] #0=b,1=a
#或:set_case_analysis 0 [get_ports Sel]
和set_disable_timing相比,set_case_analysis会增加DC的运行时间,但是使用模式分析命令(set_case_analysis)更简单
(11) set_min_delay/set_max_delay:设置路径最小/最大延迟(纯组合逻辑)
set_min_delay 2 -from [all_inputs] -to [all_outputs] #限制所有输入到输出的最小路径
(12) set_max_area:设置面积
一般第一次综合时不设置面积约束,综合完成后根据综合面积取85%来进行约束
6.实例唯一化设置 uniquify
uniquify -force(force为可选项,表示强制)
7.编译 compile
compile -scan:自顶向下(top-down)的方式编辑(compile),加上开关选项“-scan”,是为了方便做可测试的设计。
时序违列为20%-30%,使用compile -ultra命令进行优化
8.输出
change_name -rule verilog -hier #DC实现rtl-netlist,三方工具实现netlist-GDSII;change_name的作用是让三方工具正确识别netlist;change_names命令可将设计中的特别字符去掉
set_fix_multiple_port_nets -all -buffer_constants [get_designs *]#去掉多端口连线,避免在网表中产生assign
set verilogout_no_tri true#去掉三态门
set verilogout_equation false
set_fix_hold [all_clocks] #修复hold timewrite -format verilog -hier -output my_verilog.v #输出网表,后续布局布线需要
write -format ddc -hier -output my_ddc.ddc#输出ddc文件格式
write_sdf my_sdf.sdf#输出延时文件,使用PT做静态时序仿真时需要
write_sdc my_constraints.sdc#输出设计约束文件,布局布线需要report_timing #关键路径时序
report_power #功耗
report_area #面积
二、综合时遇到时序违例
1pile_ultra
当时序违例为20%-30%时,通过这个方法解决时序违例。在DC Ultra中,可以用Behavior ReTiming(简称BRT)技术,对门级网表的面积和时序进行优化。BRT有两个命令:
(1)optimize_registers:适合于包含寄存器的门级网表
optimize_registers命令首先对时序进行优化,然后对面积进行优化。该命令只对门级网表做优化,优化后模块的功能保持不变。
(2)pipeline_design:适合于纯组合逻辑的门级网表
pipeline_design -period 10 -stateges 3
2pile -scan -inc(增量编辑)
增量编辑只对门级网表进行优化,不会回到GETCH格式。编辑时不做逻辑优化。增量编辑比一般的编辑快得多。
3.自定义路径组和关键范围
DC的默认行为是对关键路径做优化。当它不能为关键路径找到一个更好的优化解决方案时,综合过程就停止。DC不会对次关键路径做进一步的优化。
防止出现这种情况可用以下两种方法:
(1)自定义路径组:允许以牺牲一条路径的时序来优化另一条路径的时序
自定义路径组的命令为:group_path
group_path -name INPUTS -from [all_inputs]
group_path -name OUTPUTS -from [all_outputs]
group_path -name COMBO -from [all_inputs] -to [all_outputs]
如图,左边是未添加自定义路径组的 情况,在该电路中只存在一个路径组:Register-to-Register Paths;右边是添加了三个路径组的情况,现在电路存在四个路径组:INPUTS,OUTPUTS,COMBO以及Register-to-Register Paths。添加路径组之后,路径的时序优化见下图,此时Register-to-Register Paths得到优化
(2)关键范围(Critical Range):不允许牺牲关键路径的时序来优化其他路径的时序
使用
set_critical_range 2 [current_design]
来设置关键范围,DC会对在关键路径2ns的范围内的所有路径作优化。建议关键范围的值不要超过关键路径总值的10%
(3)自定义路径+关键范围
#在每个路径组用指定的关键范围来设置设计的关键范围
group_path -name CLK1 -critical_range 0.3
group_path -name CLK2 -critical_range 0.1
group_path -name INPUTS -from [all_inputs] -critical_range 0
report_path_group #报告当前设计中的时序路径分组情况
(4)重新划分模块
DC中建议的好的模块划分为:
(1)不要通过层次边界分离组合电路(避免胶合逻辑:顶层的组合逻辑)
(2)把寄存器的输出作为划分的边界
(3)模块的规模大小适中,运行时间合理
(4)把核心逻辑(Core Logic)、Pads、时钟产生电路、异步电路和JTAG电路分开到不同的模块
三、具体知识
1.uncertainty、latency与transition
在默认情况下,逻辑综合时,即使一个时钟要驱动很多寄存器,DC也不会在时钟连线上加时钟缓冲器(clock buffer)。为了能在综合时比较准确的描述时钟树,我们需要为时钟树建模,使逻辑综合的结果能与版图的结果相匹配。
- uncertainty:由于时钟要经过一些时钟缓冲器才到达寄存器的时钟引脚,因此不同寄存器的时钟引脚之间,时钟信号的相位有些不同,我们用偏差(uncertainty)来表示时钟网络分枝的延迟差异(相位差异)。这种延迟差异称为clock skew,我们也用时钟偏差来计算时钟锁相环的抖动(PLL jitter)
- latency:a.时钟源延迟(clock source latency),也称为插入延迟(insertion delay),是时钟信号从其实际时钟原点到设计中时钟定义点的传输时间; b.时钟网络延迟:定义的时钟信号点到寄存器 时钟引脚的传输时间
- transition:模拟时钟的转换时间。默认的上升转换时间为从电压的20%上升至80%的时间,下降的转换时间为从电压的80%下降至20%的时间
建立时钟模式使用以下命令,具体用法见《综合流程5.3/5.4/5.5》
set_clock_uncertainty
set_clock_latency
set_clock_transition
理想时钟网络的延迟(latency)和时钟的偏差(skew)及转变时间(transition)默认为零。理想时钟网络和实际时钟网络之间的关系图:
2.工作环境对cell延迟的影响set_operating_conditions
- 温度越高,cell延迟越大
- 电压越大,cell延迟越小
- 工艺越先进(制程越小,即:process越小),cell延迟越小
3.set_false_path与set_disable_timing的区别以及各自的应用场景
set_disable_timing:多时钟选择上
set_false_path:异步信号以及时序例外路径上
四、DC中的报告命令
命令 | 作用 |
---|---|
report_constraint | 查看电路是否违反设计规则的要求 |
report_path_group | 报告当前设计中的时序路径分组情况 |
report_timing -input_pins | 报告设计的时序是否满足目标,默认行为是报告每个时序路径组里的关键路径 incr是连线延迟和其后面的单元延迟相加的结果;如果要分别报告连线延迟和单元延迟,加上选项“-input_pins” |
report_path_group | 得到设计中时序路径组的情况 |
check_timing | 在电路中寻找未加约束的路径 |
report_clock | 检查已经定义的时钟 |
reset_design | 删除当前设计中所有的属性和约束 |
report_lib libname | 将厂商提供的libname工艺库的所有工作条件列出来 |
report_timing_requirements -ignored | 报告设计中所有的例外(包括有效的例外和无效的例外) 将无效的例外报告出来 |
reset_path 如:reset_path -from FF1/Q(时序路径的起点为时钟端口或输入端口) | 去掉任何不要的例外 |
五、电路优化
电路优化的三个阶段
(1)结构(Architecture)
(2)逻辑(Logic-Level)
(3)门级(Gate-Level)
1.结构级优化
(1)设计结构的选择(Implementation Selection)
在Design Ware中选择最合适的结构或算法实现电路的功能,如:
行波进位加法器(Ripple Carry Adder,RCA):面积最小但延迟最大的加法器
超前进位加法器(Carry Look-Ahead,CLA):面积比行波进位加法器大,但速度快
进位存储加法器(Carry Save Adder,CSA):进位存储加法器是一种广泛使用的加法器,它的面积与行波进位加法器一样大,但是速度要快得多
(2)数据通路的优化(Data-path Optimization)
选择CSA等算法优化数据通路的设计
(3)共享共同的子表达式(sharing common subexpression)
为了便于了解sharing common subexpression,举例说明:
sum1<=A+B+C;
sum2<=A+B+D;
sum3<=A+B+E;
代码子表达式A+B可以被共用,原等式可改为:
temp=A+B;
sum1<=temp+C;
sum2<=temp+D;
sum3<=temp+E;
这种方法可以把比较器的数目减少,共享共同的子表达式
(4)资源共享(resource sharing)
实现资源共享的两种方式:
a.DC综合时设计面积约束
set hlo_resource_allocation area
b.将面积约束关掉,RTL代码中资源共享
set hlo_resource_allocation none #此时RTL要实现相应的资源共享
如以下代码:
module resources(input a,b,c,d,input sel,output reg[1:0] sum
);always @(*)beginif(sel==1'b0)beginsum=a+b;endelse beginsum=d+c;end
endendmodule//实现资源共享,使用一个加法器
module resources(input a,b,c,d,input sel,output [1:0] sum
);reg op1,op2;assign sum=op1+op2;always @(*)beginif(sel==1'b1)beginop1=a;op2=b;endelse beginop1=c;op2=d;end
endendmodule
共享前的综合电路为:
共享后的综合电路为:
(5)重新排序运算符号
表达式sum<=A+B+C*D+E+F+G在DC中的结构图如下所示,总延迟为1个乘法器和4个加法器的延迟。
现在改变表达式的次序,或者使用括号强制电路用不同的拓扑结构,如:
sum<=(A*B)+((C*D)+((E+F)+G))
此时电路的拓扑结构如下
总延迟为1个乘法器和2个加法器的延迟。
2.逻辑级优化
(1)结构(Structuring)优化
结构优化用共用子表达式(这里与结构级的共用表达式不同,逻辑级共用子表达式是门级电路的共用,而结构级的共用表达式是算术电路的共用)来减少逻辑,这种方式既可以用作速度优化又可用作面积优化。结构优化是DC默认的逻辑级优化策略,结构优化如下:
module aaa(input a,b,c,d,e,output f0,f1,f2
);
assign f0=a&&b || a&&c;
assign f1=b||c||d;
assign f2=(~b)&&(~c)&&e;
endmodule//共用子表达式b||C
module aaa(input a,b,c,d,e,output f0,f1,f2
);
wire t0;
assign t0=b||c;assign f0=a&&t0;
assign f1=t0||d;
assign f2=(~t0)&&e;
endmodule
共用表达式前的综合电路为
共用表达式后的综合电路为:
DC中设置结构优化命令:
set_structure true
(2)展平(Flattening)优化
展平优化把组合逻辑路径减少为两级,变为乘积之和(sum-of-products,SOP),即:先与后或的电路,如下:
展平优化主要用做速度的优化,面积可能会变大。DC中设置展平优化命令:
set_flatten true -effort low | medium | high
#-effort的默认值是low
(3)结构(Structuring)优化和展平(Flattening)优化的比较
Structuring优化 | Flattening优化 |
---|---|
产生中间结构来完成设计 | 移去中间结构:把设计减少为乘积之和 |
与约束无关 | 与约束有关(-effort) |
既可做面积优化又可做速度优化 | 面积可能会很大 |
不能保证展平的结果是两级的乘积之和(可能受工艺库的局限) | |
set_structure true | false | set_flatten true | false (默认为结构优化) |
2.门级优化
门级优化时,DC开始映射,实现门级电路,主要分为四个阶段:
Step1:延迟优化
Step2:设计规则修整(不牺牲时序面积)
Step3:以时序为代价的设计规则修整
Step4:面积优化
门级优化时需要映射组合功能和时序功能。
组合功能的映射:DC从目标库中选择组合单元设计,该设计能满足时序和面积的要求,如下所示:
时序功能的映射:DC从目标库中选择时序单元组成设计,该设计能满足时序和面积的要求。时序映射时,为了提高速度,减少面积,DC会选择比较复杂的时序单元,如下所示:
设计规则有:max_capacitance、max_transition和max_fanout。如果不满足设计规则的要求,DC会插入缓冲器(buffers)和修改单元的驱动能力(resizes cell)进行设计规则调整。
六、与综合相关的知识
1.综合的三个步骤
Synthesis=translate+ logic optimization+ gate mapping
Translate: read_verilog(RTL—GETCH)
Gate mapping: compile(GETCH—gate netlist)
2.link_library用于resolve例化模块,target_library用于在compile
3.时钟的network latency是指时钟输入端口到触发器的时钟端延迟;默认为network latency
时钟的source latency是指实际的时钟源到时钟输入端口延迟。
在pre_layout阶段,使用set_clock_latency (-source)来建模;
在post_layout阶段,使用set_propagated_clock来建模。
4.为什么模块级设计推荐寄存器输出?
方便后级模块时序约束和时序预算
5.DC中如何计算cell和net延迟
Cell延迟:使用非线性延迟来计算cell的延时
Net延迟:使用扇出负载和线负载模型来计算net延时
6.Design Compiler 的Topographical Mode相比Wire Load Models有什么优势?
0.18um后,连线延迟在总的延迟中所占比例大于门级延迟,线负载模型不再精确。使用Topographical Mode + 物理信息,提供和实际物理布局更好的时序相关性
7.为什么用于综合的verilog不建议使用for循环?
DC无法优化for循环的逻辑,只是单纯进行展开和复制,这可能降低电路的面积和性能
8.optimize_register命令的作用
不改变寄存器级数; 可能会增加寄存器数量; 将利用正slack以减少寄存器数量; 将执行增量编译,以进一步优化组合逻辑
9.网表中assign语句是由什么导致的?
网表中assign语句可能是由多端口网络和三态网络导致
7.参考文献
《专用集成电路设计使用教程》
更多推荐
【DC综合】综合基础知识
发布评论