Design Compiler综合操作
15 Mar 2020 6631字 23分 次 Digital IC Design Synthesis Tcl打赏作者 CC BY 4.0 (除特别声明或转载文章外)
1 前言
以综合AXI4_Interconnect为例,记录综合全过程。
- 开发环境:
- Design Compiler 2016
- 操作系统:
- Ubuntu 18.04 LTS
2 前期准备
Ubuntu的安装与使用、工艺库的下载、Design Compiler安装等必要准备在这就不说了。
2.1 工程目录
首先建立工程目录,以AXI4_Interconnect为例:
- AXI4_Interconnect
- config:配置文件;
- library:工艺库;
- mapped:map过的网表文件;
- report:综合后的报告;
- rtl:RTL代码;
- script:tcl约束指令;
- unmapped:未map的网表文件;
- work:DC启动文件等。
将下载好的工艺库放入“library”文件夹;将功能仿真之后的RTL代码放入“RTL”文件夹。
在“work”文件夹下新建“.synopsys_dc.setup”文件。从此路径启动DC的话会优先从该配置文件读取配置信息,而不是使用默认配置。
编辑配置信息:
echo "***********************************************************"
echo "************** Start load .synopsys_dc.setup **************"
echo "***********************************************************"
set SYN_ROOT_PATH /media/verdvana/Project/IC_Synthesis/AXI4_Interconnect
set RTL_PATH $SYN_ROOT_PATH/rtl
set CONFIG_PATH $SYN_ROOT_PATH/config
set SCRIPT_PATH $SYN_ROOT_PATH/scirpt
set MAPPED_PATH $SYN_ROOT_PATH/mapped
set REPORT_PATH $SYN_ROOT_PATH/report
set UNMAPPED_PATH $SYN_ROOT_PATH/unmapped
# 设置工作路径
set WORK_PATH /media/verdvana/Project/IC_Synthesis/AXI4_Interconnect/work
set DC_PATH /usr/synopsys/dc2016
set SYMBOL_PATH /media/verdvana/Project/IC_Synthesis/AXI4_Interconnect/library/symbols
set LIB_PATH /media/verdvana/Project/IC_Synthesis/AXI4_Interconnect/library/synopsys
# 设置工艺库
set_app_var search_path [list . $search_path $LIB_PATH \
$SYMBOL_PATH $RTL_PATH \
$SCRIPT_PATH \
${DC_PATH}/libraries/syn]
set_app_var target_library [list typical.db fast.db slow.db]
set_app_var link_library [list * typical.db fast.db slow.db]
set_app_var symbol_library [list smic18.sdb]
set_app_var synthetic_library []
echo "***********************************************************"
echo "************* End of load .synopsys_dc.setup **************"
echo "***********************************************************"
echo "***********************************************************"
echo "************** Start source hs_name_rules.v ***************"
echo "***********************************************************"
source -v -e ./hs_name_rules.tcl
echo "***********************************************************"
echo "************* End of source hs_name_rules.v ***************"
echo "***********************************************************"
主要包括设置工作路径和设置工艺库。Tcl很好懂,不同工程不同路径做一些修改就行。
2.2 DC启动脚本
DC启动之前需要启动SCL,并且需要进入工程目录,虽说这总共就三行指令,那我也记不住,所以写了一个脚本自动完成:
#! /bin/bash
cd /media/verdvana/Project/IC_Synthesis/AXI4_Interconnect/work
lmstat -c /usr/synopsys/license/synopsys.dat
lmgrd -c /usr/synopsys/license/synopsys.dat
echo "START"
dc_shell | tee dc_start.log
除了注释以外的第一行是工程路径,不同工程作相应修改;后面两行全宇宙通用。最后两行是打印启动信息和启动DC。
保存成“*.sh”文件即可,每次打开终端后先进入管理员模式:
sudo -i
然后进入脚本所在路径,通过“source”指令运行脚本:
source ./Synopsys.sh
不出意外,DC会启动并加载之前设定好的配置文件:
3 设计约束
这一部分其实也需要提前准备,但是太多了,就搁这儿了。
3.1 添加设计文件
综合首先要读取RTL文件。读取文件有两种方式,一种是用read指令来读入,一种是同时使用analyze和elaborate指令,两者区别见Design Compiler入门一文。我习惯用read指令:
# 宏定义
set TOP_MODULE AXI4_Interconnect; # 定义顶层文件名
# 读文件
read_sverilog -rtl [list AXI_Arbiter_R.sv \
AXI_Arbiter_W.sv \
AXI_Arbiter.sv \
AXI_Master_Mux.sv \ AXI_Slave_Mux.sv \
AXI4_Interconnect.sv]
#设置顶层文件
current_design $TOP_MODULE
这样就把RTL代码全部读进去并且设置好了顶层文件。
3.2 检查与复位
在配置信息那一步配置了工艺库的路径,现在可以检查一下是否成功;另外也可以检查一下RTL文件的语法错误:
# 检查link
if {[link] == 0} {
echo "Link Error!";
exit;
}
# 检查语法
if {[check_design] == 0} {
echo "Check Design Error!";
exit;
}
另外如果不是第一次约束该工程,又怕被之前的约束信息所影响,可以复位约束:
reset_design
3.3 时序约束
时序约束主要是告诉DC时钟的周期、SKEW等属性然后建立这个时钟:
# 宏定义
set CLK_NAME ACLK
set CLK_PERIOD 2
set CLK_SKEW [expr $CLK_PERIOD*0.05]
set CLK_TRAN [expr $CLK_PERIOD*0.01]
set CLK_SRC_LATENCY [expr $CLK_PERIOD*0.1]
set CLK_LATENCY [expr $CLK_PERIOD*0.1]
# 新建时钟
create_clock -period $CLK_PERIOD [get_ports $CLK_NAME]
# 设置为理想时钟(默认的,不加也行)
set_ideal_network [get_ports $CLK_NAME]
set_dont_touch_network [get_ports $CLK_NAME]
# 设置驱动源
set_drive 0 [get_ports $CLK_NAME]
# 建立时钟树模型
set_clock_uncertainty -setup $CLK_SKEW [get_ports $CLK_NAME]
set_clock_transition -max $CLK_TRAN [get_ports $CLK_NAME]
set_clock_latency -source -max $CLK_SRC_LATENCY [get_ports $CLK_NAME]
set_clock_latency -max $CLK_LATENCY [get_ports $CLK_NAME]
3.4 复位设置
复位信号也需要建立:
set RST_NAME ARESETn
# 设置
set_ideal_network [get_ports $RST_NAME]
set_dont_touch_network [get_ports $RST_NAME]
set_drive 0 [get_ports $RST_NAME]
3.5 输入延迟设置
然后是设定IC外部输入的延迟和驱动模型等:
# 宏定义
set LIB_NAME typical
set WIRE_LOAD_MODEL smic18_wl10
set DRIVE_CELL DFFHQX1
set DRIVE_PIN Q
set OPERA_CONDITION typical
set ALL_IN_EXCEPT_CLK [remove_from_collection [all_inputs] [get_ports $CLK_NAME]]
set INPUT_DELAY [expr $CLK_PERIOD*0.6]
# 设置延迟
set_input_delay $INPUT_DELAY -clock $CLK_NAME $ALL_IN_EXCEPT_CLK
#set_input_delay -min 0 -clock $CLK_NAME $ALL_IN_EXCEPT_CLK
set_driving_cell -lib_cell ${DRIVE_CELL} -pin ${DRIVE_PIN} $ALL_IN_EXCEPT_CLK
3.6 输出延迟设置
输出的延迟和负载也需要设置:
# 宏定义
set OUTPUT_DELAY [expr $CLK_PERIOD*0.6]
set MAX_LOAD [expr [load_of $LIB_NAME/DFFHQX1/D] *1]
# 设置延迟
set_output_delay $OUTPUT_DELAY -clock $CLK_NAME [all_outputs]
set_load [expr $MAX_LOAD*1] [all_outputs]
# 输出端口插入隔离单元,这里是插入缓存单
set_isolate_ports -type buffer [all_outputs]
3.7 操作条件和线负载模型
设置线负载模型:
# 設置操作条件
set_operating_condition -max $OPERA_CONDITION \
-max_library $LIB_NAME
# 关闭自动选择线负载模型
set auto_wire_load_selection false
# 设置线负载模式
set_wire_load_mode top
# 设置线负载模型
set_wire_load_model -name $WIRE_LOAD_MODEL \
-library $LIB_NAME
3.8 面积约束
对面积大小没啥概念,都是瞎逼设置的。要让DC综合后的面积尽量小,可以设为0,只不过违例报告中肯定会有面积违例这一条:
set_max_area 0
3.9 设置分组
可以对不同类型的路径设置分组,让DC分别优化:
# 時鐘分組
group_path -name $CLK_NAME -weight 5 -critical_range [expr $CLK_PERIOD *0.1]
# 輸入路徑(包含輸入路徑中的組合電路)分組
group_path -name INPUTS -from [all_inputs] -critical_range [expr $CLK_PERIOD *0.1]
# 輸出路徑(包含輸出路徑中的組合電路)分組
group_path -name OUTPUTS -to [all_outputs] -critical_range [expr $CLK_PERIOD *0.1]
# 輸入與輸出路徑上的組合電路分組
group_path -name COMB -from [all_inputs] -to [all_outputs] -critical_range [expr $CLK_PERIOD *0.1]
# 報告分組情況
#report_path_group
最后报告最差路径等,也会分组报告。
3.10 消除多端口互联
一些其他约束:
set_app_var verilogout_no_tri ture
set_app_var verilogout_show_unconnected_pins ture ;# 显示寄存器未用到的Q非端口
set_app_var bus_naming_style { %s[%d] }
simplify_constants -boundary_optimization ;# 边界优化
# 相同net插buffer
set_fix_multiple_port_nets -all -buffer_constants
3.11 綜合
综合命令就一条,但是有很多不同的附加指令:
#compile
compile -map_effort high -area_effort high
#compile -map_effort high -area_effort medium
#compile -map_effort hign -area_effort high -boundary_optimization
#compile -map_effort hign -area_effort high -scan
3.12 生成报告文件
报告约束信息并写到“report”文件夹里:
report_constraint -all_violators
report_timing -delay_type max
redirect -tee -file ${REPORT_PATH}/check_design.txt {check_design}
redirect -tee -file ${REPORT_PATH}/check_timing.txt {check_timing}
redirect -tee -file ${REPORT_PATH}/report_constraint.txt {report_constraint -all_violators}
redirect -tee -file ${REPORT_PATH}/check_setup.txt {report_timing -delay_type max}
redirect -tee -file ${REPORT_PATH}/check_hold.txt {report_timing -delay_type min}
redirect -tee -file ${REPORT_PATH}/report_area.txt {report_area}
4 运行约束
回到刚刚打开DC的终端。现在DC的路径是工程路径中的“work”文件夹。而需要运行的约束在“script”文件夹中,所以运行指令:
source ../script/AXI4_Interconnect.tcl
之前写好的约束指令便会一条一条排队执行,最后生成报告:
要启动图形界面的话在dc_shell里输入:
gui_start
告辞