Design Compiler进行数字综合

Design Compiler 功能

Design Compiler的主要功能是将所写的行为级(behavior level)描述的Verilog/VHDL文件转化为结构级(structure level)的Verilog/VHDL文件。

DC的工作流程

  • 设置环境
  • 读入并分析设计
  • 环境约束
  • 设计约束
  • 生成Netlist

设置环境

  • Target Library: 由ASIC Vendor提供,后缀一般为".db",里面包含标准单元,Verilog文件映射为最后结构级网表的时候,就在里面查找标准单元。我的标准单元库为wcell.db
set target_library  "Lib/wcells.db"
  • Link Library:在最开始分析你的行为级Verilog文件的时候,并非里面的所有Module都可以转化为Target Library中的标准单元(比如PLL,编译好的RAM,PAD这些),这就需要告诉DC这些东西在那些库里。一般情况下我们的设计不包括这些奇奇怪怪的东西,所以一般在DC中都设置为:
set link_library   [ list * Lib/wcells.db Lib/dw_foundation.sldb]

最后的dw_foundation.sldb是在你的设计中使用了Synopsys DesignWare提供的IP时,方便DC找到相应的IP,否则link会报错
前面的“*”号表示DC的内存空间,也就是说如果设计中某个模块找不到对应的库,那么就现在内存中搜索。

  • Symbol Library:标准单元在电脑上显示的一个样子,也就是每个标准单元的“图标”,一般后缀为“.sdb”。
set symbol_library  "Lib/wcells.sdb"
  • Synthetic Library:Synopsis内部集成了很多可以复用的逻辑,比如+, -, *, <, >, <=, >=这些运算,并且可以根据不同的要求来选择不同的实现,比如选择Booth乘法器或者Wallace Tree乘法器等等,一般这个库不用载入,DC会自动载入synopsis的DesignWare。

  • Search Path: 当在Link Library中无法找到某些模块时,DC会在Search Path下的库中自动找对应的模块。比如Synopsis的DesignWare中的库就缺省包含在了Search Path下,这也就是为什么一般不需要手动设置Synthetic Library的原因。在Verilog源文件中,如果找不到include的文件,也会在Search Path下寻找。

set     search_path      [ list $search_path "../Src" \
                                             "../Src/Common" \
                                             "../Src/Datapath" \
                                             "../Src/Interp" \
                                             "../Src/Log2Compute" \
                                             "../Src/Sample" \
                                             "../Src/Status"] 

读入并分析设计

#首先清理系统
remove_design -all
#读入并分析Verilog文件,autoread会自动按照文件的依赖顺序逐个分析源文件,
#如果有错误analyze命令会报错,如果没有错误会生成中间文件。
analyze -format verilog  ../Src/TMO_System.v -autoread > ./log/analyze.rpt
#elaborate命令将analyze生成的中间文件转化为technology-independent design (GTECH)
elaborate TMO_System
#确认在DC的内存中,当前正在处理的是我们的顶层TMO_System
current_design TMO_System
# 如果我们要将顶层转化为最后的网表,就要将所有的模块都组合起来,
# 这一过程即是Link,其实在elaborate命令会自动执行Link命令,如果再次执行Link命令,我看可以看到关于Link的报告
link > ./log/link.rpt
# 如果一个设计中多次使用了同一个instance,那么在DC的内存中多个instance均指向一个模块,
# 但是在电路中他们应该是多个独立的实体,uniquify命令的目的就是为这些instance都创造一个新的模块,
# 使其指向它,这样,即使在Verilog源文件中,多个instance源自同一个module,
# 在DC中他们也会指向不同的module(虽然每个module是一样的,但是名字不一样了,DC就将其看做不同的东西了)
uniquify > ./log/uniquify.rpt
# 通过check_design命令检查设计是否一致,在消除report中的所有error以后才能继续后面的工作
# Report中也会有很多很多的warning,但是一般都无关紧要,稍微看看就可以了。
check_design > ./log/check_RTL.rpt
#replace_synthetic会将设计中的很多运算符替换为DesignWare中设计好的ALU
replace_synthetic > ./log/replace_synthetic.rpt

环境约束

环境约束就是将芯片的工作环境考虑在内来进行电路转化和设计,可以简单的用下图来概括


Design Compiler进行数字综合_第1张图片
环境约束
set_operating_conditions -min_library wcells -min BEST -max_library wcells -max WORST
set auto_wire_load_selection true 
set_wire_load_mode enclosed
# 从库中找一个标准单元来驱动所有输入
set_driving_cell -lib_cell winv_1 -pin op [all_inputs]
set_load 3 [all_outputs]

设计约束

设计约束包含两类,分别是设计规则约束(Design Rule Constraints)和优化约束(Optimization Constraints)。

  • 设计规则约束在逻辑库中明确定义,一般要满足这些约束设计才能正常的工作。


    Design Compiler进行数字综合_第2张图片
    Design Rule Constraints.png

优化约束由用户制定,比如你对面积、功耗等等的要求。优化约束的优先级没有设计规则约束的优先级高,所以DC会优先满足DRC的要求。


Design Compiler进行数字综合_第3张图片
Optimization Constraints.png
#############################优化约束##################################

#首先为电路设计一个时钟,
create_clock -name "clock" -period 10 -waveform {0 5} [get_ports clock]
#实际情况下,时钟不可能是理想的,所以需要设计时钟的一些“非理想”属性
set_clock_latency          1     [get_clocks clock]
set_clock_transition       0.3   [get_clocks clock]
set_clock_uncertainty      -setup 0.8 [get_clocks clock]
set_clock_uncertainty      -hold 0.4  [get_clocks clock]
#认为时钟的驱动能力无穷大
set_drive 0  [get_ports clock]
#为了防止在时钟路径上插入Buffer而恶化时序,所以对时钟网络设置Dont_touch_network属性
set dont_touch_network [ list clock ]
set all_inputs_in_domain [get_ports [list Pi_Value hsync vsync configure_addr configure_value write read]]
set all_outputs_in_domain [get_ports [list configured_value toned_pixel TValid]]
set_input_delay  -max       2.5 -clock "clock" $all_inputs_in_domain    
set_input_delay  -min       0.4 -clock "clock" $all_inputs_in_domain
set_output_delay -max       2.5 -clock "clock" $all_outputs_in_domain
set_output_delay -min       0.4 -clock "clock" $all_outputs_in_domain


#############################DRC约束##################################
#0.35先使用库中的默认值
#set_max_transition
#set_max_capacitance
#set_max_fanout
#set_max_delay
#set_min_delay

生成Netlist

#### One Pass Compilation ####
current_design TMO_System
compile_ultra -timing_high_effort_script  > ./log/compile_pass1.rpt
set_auto_disable_drc_nets  -clock  true  -constant  true
set  bus_inference_descending_sort   true
set  bus_inference_style     %s\[%d\]
set  bus_naming_style        %s\[%d\]
set  verilogout_no_tri true
set  verilogout_show_unconnected_pins true
set_fix_multiple_port_nets  -all -buffer_constants
remove_unconnected_ports [get_cells -hier {*}]
set  change_names_dont_change_bus_members   true
change_names  -hier   -rules   verilog
#change_names  -hier   -rules   lab_vlog

#### Two Pass Compilation ####
current_design TMO_System 
compile_ultra -incremental  > ./log/compile_incr.rpt
set  bus_inference_descending_sort   true
set  bus_inference_style     %s\[%d\]
set  bus_naming_style        %s\[%d\]
set  verilogout_no_tri true
set  verilogout_show_unconnected_pins true
set_fix_multiple_port_nets  -all -buffer_constants
remove_unconnected_ports [get_cells -hier {*}]
set  change_names_dont_change_bus_members   true
change_names  -hier   -rules   verilog
#Check Netlist
check_design > ./log/check_netlist.rpt
current_design TMO_System
write -f verilog -h -output ./netlist/TMO_System_syn.v
write -f ddc -h -output ./unmapped/TMO_System.ddc
write_sdc  ./unmapped/TMO_System.sdc  -version 1.4

#get reports
report_timing -to [all_outputs]  -max_paths 5000 -nworst 5000 > ./log/timing_max_output.rpt
report_timing -to [all_registers -data_pins]    -max_paths 5000 -nworst 5000 > ./log/timing_max_register.rpt       
report_timing -to [all_outputs]                 -max_paths 5000 -nworst 5000  -delay min \
                                                > ./log/timing_min_output.rpt
report_timing -to [all_registers -data_pins]  -max_paths 5000 -nworst 5000  -delay min \
                                              > ./log/timing_min_register.rpt
report_area   > ./log/area.rpt
report_power  > ./log/power.rpt

你可能感兴趣的:(Design Compiler进行数字综合)