【DC综合】综合基础知识

编程入门 行业动态 更新时间:2024-10-10 01:25:54

【DC综合】综合<a href=https://www.elefans.com/category/jswz/34/1769428.html style=基础知识"/>

【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 | falseset_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综合】综合基础知识

本文发布于:2024-02-27 20:34:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766142.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:基础知识   DC

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!