1.理论
2.实践
项目介绍OC8051
3.DCT介绍
1.为什么要用DCT
DCT需要的数据
如何使用DCT
DCT实践
#source ../scripts/dc_setup.tcl
source ../scripts/icc_setup.tcl
sh mkdir -p ../rpts
sh mkdir -p ../output_data
##################################################独特的####################
create_mw_lib -technology $TECH_FILE \
-mw_reference_library $MW_REFERENCE_LIB_DIRS \
$MW_DESIGN_LIBRARY
open_mw_lib $MW_DESIGN_LIBRARY
set_tlu_plus_files -max_tluplus $TLUPLUS_CMAX \
-tech2itf_map $TLUPLUS_MAP
##################################################独特的####################
set_svf ../output_data/${top}.svf
define_design_lib temp_work -path ./tmp_work
#analyze -format verilog ${RTL_SOURCE_FILES}
#elaborate ${DESIGN_NAME}
source /disk2/course/proj/oc8051/design/read_design.dc.tcl
current_design $top
link
#sdc
read_sdc /disk2/course/proj/oc8051/design/sdc/8051.sdc
set_operating_conditions -max WORST -max_library saed90nm_max_hth \
-min WORST -min_library saed90nm_max_hth
#set_app_var auto_wire_load_selection false
#set_wire_load_model -name 8000
#set_wire_load_mode top
set_max_leakage_power 0
set_max_area 0
set_dont_touch_network [get_ports clk]
set ports_clock_root [filter_collection [get_attribute [get_clocks] sources] object_class==port]
group_path -name reg2out -from [all_registers -clock_pins] -to [all_outputs]
group_path -name in2reg -from [remove_from_collection [all_inputs] $ports_clock_root] -to [all_registers -data_pins]
group_path -name in2out -from [remove_from_collection [all_inputs] $ports_clock_root] -to [all_outputs]
set_critical_range 3 [current_design]
##################################################独特的####################
###physical cons
set_ignored_layers -min_routing_layer M1 -max_routing_layer M6
read_floorplan /disk2/course/proj/oc8051/flow/pnr/output_data/v0/init_floorplan.for_dct.tcl
set_fix_multiple_port_nets -all -buffer_constants
##################################################独特的####################
set_clock_gating_style \
-positive_edge_logic {integrated:saed90nm_max_hth_cg_lvt/CGLPPRX8_LVT} \
-control_point before \
-max_fanout 32 \
-no_sharing \
-minimum_bitwidth 8 \
-sequential_cell latch
#extra cmds
#set_structure false
#set_flatten true -effort high
compile_ultra -gate_clock -scan -spg
report_constraint -all_violators > ../rpts/all_vios1.rpt
compile_ultra -incr -only_design_rule -spg
#Ecompile_ultra -incremental -scan -spg
report_constraint -all_violators > ../rpts/all_vios2.incr.rpt
set_svf -off
#outpu data
change_names -rules verilog -hierarchy
write -format ddc -hierarchy -output ../output_data/${top}.mapped.ddc
write -f verilog -hierarchy -output ../output_data/${top}.mapped.v
##############################################
############### insert scan chain ############
##############################################
set_dft_insertion_configuration -preserve_design_name true
# Do not run incremental compile as a part of insert_dft
set_dft_insertion_configuration -synthesis_optimization none
set_scan_configuration -clock_mixing mix_clocks
create_port -direction in {scan_en test_mode scan_clk}
create_port -direction in {si[0]}
create_port -direction in {si[1]}
create_port -direction out {so[0]}
create_port -direction out {so[1]}
set_dft_signal -view spec -type ScanDataIn -port si[*]
set_dft_signal -view spec -type ScanDataOut -port so[*]
set_dft_signal -view spec -type ScanEnable -port scan_en -active_state 1 -usage {scan}
set_dft_signal -view spec -type TestMode -port test_mode -active_state 1 -usage {clock_gating}
set_dft_signal -view existing_dft -type ScanClock -port [get_ports scan_clk] -timing {45 55}
set_dft_signal -view existing_dft -type Reset -port rst -active 0
#set_dft_signal -view existing_dft -type ScanClock -port [get_ports scan_clk] -timing {45 55}
#set_dft_signal -view spec -type ScanClock -port [get_ports scan_clk];# -timing {45 55}
set_dft_configuration -fix_clock enable -test_points enable -control_points enable
set_dft_configuration -fix_set enable
set_dft_configuration -fix_reset enable
set_scan_configuration -chain_count 2
#set_autofix_configuration -method mux -type clock -fix_data enable -control_signal test_mode -test_data scan_clock
#set_autofix_configuration -method mux -type reset -fix_data enable -control_signal test_mode -test_data rst
create_test_protocol
#dft_drc
#report_scan_configuration
#report_dft_insertion_configuration
#preview_dft
insert_dft
change_names -rules verilog -hierarchy
write_scan_def -output ../output_data/${top}.mapped.scan.def
disconnect_net data_source [get_port data_source]
remove_port data_source
#create_port -direction in scan_clk
connect_net data_source scan_clk
#compile_ultra -incremental -scan
#outpu data
write -format ddc -hierarchy -output ../output_data/${top}.mapped.scan.ddc
write -f verilog -hierarchy -output ../output_data/${top}.mapped.scan.v
环境初始化与库配置(1-12行)
- 创建报告和输出目录
../rpts
存放时序/面积报告../output_data
存放网表、DDC数据库等输出文件
- 创建Milkyway物理库
-technology
指定工艺文件(.tf)-mw_reference_library
设置参考标准单元库路径- 使用
$MW_DESIGN_LIBRARY
变量定义设计库名称
二、设计输入与链接(13-20行)
- 采用分层设计读取方式
- 通过
read_design.dc.tcl
脚本加载RTL设计 - 使用
current_design $top
指定顶层模块 link
命令验证设计层次完整性
- 通过
- 设置TLUPlus文件
- 用于RC寄生参数提取的工艺映射文件
-max_tluplus
指定最坏情况下的互连模型
三、约束设置(21-38行)
- 时序约束
- 读取8051.sdc 约束文件(时钟定义、I/O延迟等)
- 设置最坏工况库
saed90nm_max_hth
- 定义三条关键路径组:
- reg2out:寄存器到输出路径
- in2reg:输入到寄存器路径
- in2out:纯组合逻辑路径
- 物理约束
- 设置布线层范围(M1-M6)
- 读取初始布局规划文件
init_floorplan.for_dct.tcl
四、逻辑综合优化(39-58行)
- 时钟门控配置
- 指定
CGLPPRX8_LVT
单元作为门控单元 - 设置最大扇出32,最小位宽8,禁用共享
- 指定
- 两级优化策略
compile_ultra -gate_clock
:主综合阶段(插入扫描链前)compile_ultra -incr
:增量优化(解决DRC违规)
- 输出中间结果
- 生成DDC数据库和Verilog网表
- 保存约束违例报告
all_vios*.rpt
五、扫描链插入(59-105行)
- DFT配置
- 创建扫描使能(scan_en)、测试模式(test_mode)、扫描时钟(scan_clk)端口
- 设置双扫描链结构(chain_count 2)
- 保留设计名称
-preserve_design_name true
- 特殊信号定义
si[0:1]
作为扫描输入端口so[0:1]
作为扫描输出端口- 配置扫描时钟时序窗口(45-55时间单位)
- 扫描插入流程
create_test_protocol
生成测试协议insert_dft
执行实际扫描单元替换- 最终输出包含扫描链的DEF文件和网表