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
环境约束
环境约束就是将芯片的工作环境考虑在内来进行电路转化和设计,可以简单的用下图来概括
![](https://img.haomeiwen.com/i1817489/8faae8413b002b01.png)
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 Rule Constraints.png
优化约束由用户制定,比如你对面积、功耗等等的要求。优化约束的优先级没有设计规则约束的优先级高,所以DC会优先满足DRC的要求。
![](https://img.haomeiwen.com/i1817489/e2bb9743594f08c2.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
网友评论