10dc综合输出文件
DC综合文件输出完整指南
📚 目录
🌟 基础篇
🚀 进阶篇
💡 实战篇
1. 文件输出概述
🔍 DC综合输出文件体系
综合完成后,需要输出多种格式的文件供后续流程使用:
文件类型 | 格式 | 用途 | 重要程度 |
---|---|---|---|
门级网表 | .v/.ddc | 逻辑实现 | 🔥🔥🔥🔥 |
约束文件 | .sdc | 时序约束 | 🔥🔥🔥🔥 |
时序文件 | .sdf | 延迟信息 | 🔥🔥🔥 |
扫描链 | .def | DFT信息 | 🔥🔥🔥 |
报告文件 | .rpt | 分析结果 | 🔥🔥 |
⚡ 后续流程文件需求
graph LR
A[DC综合] --> B[门级网表.v]
A --> C[约束文件.sdc]
A --> D[时序文件.sdf]
A --> E[扫描链.def]
B --> F[物理设计]
C --> F
B --> G[功能验证]
D --> G
E --> H[DFT验证]
2. 理想网络设置
🌐 理想网络基础概念
理想网络是告诉DC不对某些关键信号进行优化的设置,通常用于时钟、复位等全局信号。
基本理想网络设置
#==========================================
# 理想网络设置基础
#==========================================
# 设置复位信号为理想网络 (DC不会优化)
set_ideal_network [get_ports reset]
# 设置多个端口为理想网络
set_ideal_network [get_ports {reset clk}]
# 设置内部信号为理想网络
set_ideal_network [get_pins CTRL_reg/Q]
# 设置网络为理想网络 (不传播延迟)
set_ideal_network -no_propagate [get_nets CTRL]
精确理想网络建模
#==========================================
# 精确理想网络建模
#==========================================
# 设置理想延迟 (用于更精确的时序建模)
set_ideal_latency 1.8 [get_ports rst]
# 设置理想转换时间
set_ideal_transition 0.5 [get_ports rst]
# 组合使用:理想网络 + 精确参数
set_ideal_network [get_ports system_rst]
set_ideal_latency 2.0 [get_ports system_rst]
set_ideal_transition 0.3 [get_ports system_rst]
📊 线负载模型 (WLM) 配置
#==========================================
# 线负载模型设置
#==========================================
# 自动选择线负载模型
set auto_wire_load_selection true
# 手动指定线负载模型
set_wire_load_model -name "10K_hvratio_1_4" -library my_tech_lib
# 不同层次使用不同模型
set_wire_load_mode "segmented"
3. 基本文件输出
📝 SDC约束文件输出
基本SDC文件输出
#==========================================
# SDC约束文件输出
#==========================================
# 基本SDC文件输出
write_sdc constraints.sdc
# 指定版本的SDC文件
write_sdc -version 2.1 constraints_v21.sdc
# 包含详细注释的SDC文件
write_sdc -version 2.1 -include_comments detailed_constraints.sdc
高级SDC输出选项
#==========================================
# 高级SDC输出配置
#==========================================
# 输出时包含所有约束信息
write_sdc -include_disabled_constraints all_constraints.sdc
# 分层输出SDC文件
write_sdc -hierarchical hierarchical_constraints.sdc
# 只输出时钟相关约束
write_sdc -include {clocks} clock_only.sdc
🔄 网表文件输出
Verilog网表输出
#==========================================
# Verilog网表文件输出
#==========================================
# 基本Verilog网表输出
write -f verilog -hierarchy -output netlist/design.v
# 输出时处理多驱动网络
set_fix_multiple_port_nets -all -buffer_constants
write -f verilog -hierarchy -output netlist/design_fixed.v
# 转换tri类型为wire类型
set_app_var verilogout_no_tri true
write -f verilog -hierarchy -output netlist/design_no_tri.v
# 修正变量名称 (放在compile之后)
change_names -rules verilog -hier
write -f verilog -hierarchy -output netlist/design_clean_names.v
DDC格式输出
#==========================================
# DDC格式文件输出
#==========================================
# DDC格式保存 (Synopsys专有格式,包含完整设计信息)
write -f ddc -hierarchy -output database/design.ddc
# 保存当前设计状态
write -f ddc -output checkpoint/design_post_compile.ddc
4. 综合结果文件
⏱️ SDF时序文件输出
标准SDF文件输出
#==========================================
# SDF时序文件输出
#==========================================
# 基本SDF文件输出
write_sdf timing/design.sdf
# 指定SDF版本
write_sdf -version 3.0 timing/design_v30.sdf
# 包含最小典型最大延迟
write_sdf -include_typ timing/design_full.sdf
# 分层输出SDF
write_sdf -hierarchy timing/design_hier.sdf
SDF文件输出选项
#==========================================
# SDF输出高级选项
#==========================================
# 只输出互连延迟
write_sdf -interconn_only timing/interconnect.sdf
# 包含时钟门控信息
write_sdf -include_cg timing/design_with_cg.sdf
# 输出绝对延迟
write_sdf -absolute_delay timing/design_absolute.sdf
🔍 DEF扫描链文件
#==========================================
# DEF扫描链文件输出
#==========================================
# 基本DEF文件输出 (用于DFT)
write_def scan/scan_def.def
# 包含详细扫描链信息
write_def -include_placement scan/detailed_scan.def
# 只输出扫描链连接
write_def -scan_only scan/scan_connections.def
5. 时序分析文件
📊 时序分析报告输出
基础时序报告
#==========================================
# 时序分析报告输出
#==========================================
# 设计检查报告
redirect -tee -file reports/check_design.rpt {check_design}
# 保持时间检查报告
redirect -tee -file reports/check_hold.rpt {
report_timing -significant_digits 4 -delay_type min -max_paths 20
}
# 建立时间检查报告
redirect -tee -file reports/check_setup.rpt {
report_timing -significant_digits 4 -delay_type max -max_paths 20
}
# 约束违例报告
redirect -tee -file reports/violations.rpt {
report_constraint -all_violators
}
详细分析报告
#==========================================
# 详细时序分析报告
#==========================================
# 完整时序报告
redirect -file reports/timing_summary.rpt {
report_timing -transition_time -nets -attributes -nosplit
}
# 时钟分析报告
redirect -file reports/clock_analysis.rpt {
report_clocks -attributes -skew
report_clock_tree
}
# 功耗分析报告
redirect -file reports/power_analysis.rpt {
report_power -analysis_effort medium -verbose
}
# 面积分析报告
redirect -file reports/area_analysis.rpt {
report_area -hierarchy -physical
}
6. 物理设计交付
📦 后端设计文件包
物理综合所需文件清单
#==========================================
# 物理设计交付文件包
#==========================================
# 创建交付目录结构
file mkdir deliverables/netlist
file mkdir deliverables/constraints
file mkdir deliverables/timing
file mkdir deliverables/dft
file mkdir deliverables/reports
# 1. 门级网表 (主要交付物)
write -f verilog -hierarchy -output deliverables/netlist/design.v
write -f ddc -hierarchy -output deliverables/netlist/design.ddc
# 2. 约束文件
write_sdc deliverables/constraints/constraints.sdc
# 3. 时序文件
write_sdf deliverables/timing/design.sdf
# 4. 扫描链文件
write_def deliverables/dft/scan_def.def
# 5. 关键报告
redirect -file deliverables/reports/timing_summary.rpt {
report_timing -max_paths 50
report_constraint -all_violators
}
质量检查文件
#==========================================
# 质量检查文件生成
#==========================================
# QA检查报告
redirect -file deliverables/reports/qa_check.rpt {
puts "=== 设计质量检查报告 ==="
puts "生成时间: [clock format [clock seconds]]"
puts "设计: [current_design]"
puts "=============================="
check_design -summary
check_timing -verbose
# 统计信息
puts "\n=== 统计信息 ==="
report_hierarchy
report_area
# 时序摘要
puts "\n=== 时序摘要 ==="
set wns_setup [get_attribute [get_timing_paths -delay_type max -max_paths 1] slack]
set wns_hold [get_attribute [get_timing_paths -delay_type min -max_paths 1] slack]
puts "Setup WNS: $wns_setup"
puts "Hold WNS: $wns_hold"
}
7. 文件输出脚本
🤖 自动化输出脚本
一键输出脚本
#==========================================
# 自动化文件输出脚本
#==========================================
proc generate_all_outputs {design_name} {
puts "开始生成所有输出文件..."
# 创建输出目录
set output_dir "outputs_${design_name}"
file mkdir $output_dir
file mkdir $output_dir/netlist
file mkdir $output_dir/constraints
file mkdir $output_dir/timing
file mkdir $output_dir/reports
file mkdir $output_dir/dft
# 网表文件输出
puts "生成网表文件..."
change_names -rules verilog -hier
set_fix_multiple_port_nets -all -buffer_constants
write -f verilog -hierarchy -output $output_dir/netlist/${design_name}.v
write -f ddc -hierarchy -output $output_dir/netlist/${design_name}.ddc
# 约束文件输出
puts "生成约束文件..."
write_sdc $output_dir/constraints/${design_name}.sdc
# 时序文件输出
puts "生成时序文件..."
write_sdf $output_dir/timing/${design_name}.sdf
# DFT文件输出
puts "生成DFT文件..."
if {[sizeof_collection [get_dft_drc_violations]] == 0} {
write_def $output_dir/dft/${design_name}_scan.def
}
# 报告文件生成
puts "生成分析报告..."
redirect -file $output_dir/reports/timing_report.rpt {
report_timing -max_paths 20
}
redirect -file $output_dir/reports/area_report.rpt {
report_area -hierarchy
}
redirect -file $output_dir/reports/power_report.rpt {
report_power
}
puts "所有文件生成完成,保存在: $output_dir"
return $output_dir
}
# 使用示例
set output_location [generate_all_outputs "cpu_core"]
条件输出脚本
#==========================================
# 条件输出脚本 (基于综合结果)
#==========================================
proc smart_output_generation {} {
set design_name [current_design]
# 检查综合状态
set wns [get_attribute [get_timing_paths -max_paths 1] slack]
if {$wns >= 0} {
puts "✅ 时序满足,生成完整输出文件"
# 生成所有文件
write -f verilog -hierarchy -output final/${design_name}_final.v
write_sdc final/${design_name}_final.sdc
write_sdf final/${design_name}_final.sdf
# 生成最终报告
redirect -file final/final_summary.rpt {
report_timing -max_paths 10
report_area
report_power
}
} else {
puts "⚠️ 时序违例,生成调试文件"
# 生成调试网表
write -f verilog -hierarchy -output debug/${design_name}_debug.v
# 生成详细时序报告
redirect -file debug/timing_debug.rpt {
report_timing -max_paths 50 -transition_time -nets
report_constraint -all_violators
}
puts "请检查时序问题后重新综合"
}
}
smart_output_generation
8. 质量检查报告
🔍 综合质量检查
自动化质量检查
#==========================================
# 综合质量自动检查脚本
#==========================================
proc synthesis_quality_check {} {
puts "========================================"
puts "综合质量检查"
puts "========================================"
# 1. 基本设计检查
puts "\n1. 基本设计检查"
puts "--------------------"
redirect -variable design_check {check_design -summary}
if {[string match "*Error*" $design_check]} {
puts "❌ 设计检查发现错误"
puts $design_check
} else {
puts "✅ 设计检查通过"
}
# 2. 时序检查
puts "\n2. 时序检查"
puts "--------------------"
set wns_setup [get_attribute [get_timing_paths -delay_type max -max_paths 1] slack]
set wns_hold [get_attribute [get_timing_paths -delay_type min -max_paths 1] slack]
puts "Setup WNS: ${wns_setup}ns"
puts "Hold WNS: ${wns_hold}ns"
if {$wns_setup >= 0 && $wns_hold >= 0} {
puts "✅ 时序检查通过"
} else {
puts "❌ 时序检查失败"
}
# 3. DRC检查
puts "\n3. DRC检查"
puts "--------------------"
set drc_violations [sizeof_collection [get_drc_violations]]
puts "DRC违例数量: $drc_violations"
if {$drc_violations == 0} {
puts "✅ DRC检查通过"
} else {
puts "❌ DRC检查失败"
report_drc_violations
}
# 4. 面积和功耗统计
puts "\n4. 设计统计"
puts "--------------------"
set total_area [get_attribute [current_design] area]
puts "总面积: ${total_area}"
# 5. 生成质量报告
redirect -file quality_check_report.txt {
puts "综合质量检查报告"
puts "生成时间: [clock format [clock seconds]]"
puts "设计: [current_design]"
puts "Setup WNS: ${wns_setup}ns"
puts "Hold WNS: ${wns_hold}ns"
puts "DRC违例: $drc_violations"
puts "总面积: ${total_area}"
if {$wns_setup >= 0 && $wns_hold >= 0 && $drc_violations == 0} {
puts "综合质量: ✅ 通过"
} else {
puts "综合质量: ❌ 需要优化"
}
}
puts "\n质量检查完成,详细报告: quality_check_report.txt"
}
synthesis_quality_check
9. 最佳实践
✅ 文件输出检查清单
交付前检查清单
文件命名规范
#==========================================
# 文件命名规范示例
#==========================================
# 推荐的文件命名规范
set design_name [current_design]
set version "v1_0"
set timestamp [clock format [clock seconds] -format "%Y%m%d"]
# 网表文件
set netlist_name "${design_name}_${version}_${timestamp}.v"
# 约束文件
set sdc_name "${design_name}_${version}_${timestamp}.sdc"
# 时序文件
set sdf_name "${design_name}_${version}_${timestamp}.sdf"
# 报告文件
set report_name "${design_name}_${version}_${timestamp}_summary.rpt"
puts "使用规范化文件名:"
puts "网表: $netlist_name"
puts "约束: $sdc_name"
puts "时序: $sdf_name"
puts "报告: $report_name"
💡 输出优化建议
性能优化的输出策略
#==========================================
# 性能优化的输出策略
#==========================================
# 1. 网表优化输出
proc optimize_netlist_output {} {
# 处理多驱动网络
set_fix_multiple_port_nets -all -buffer_constants
# 转换三态信号
set_app_var verilogout_no_tri true
# 修正信号名称
change_names -rules verilog -hier
# 输出优化后的网表
write -f verilog -hierarchy -output optimized_netlist.v
puts "优化网表输出完成"
}
# 2. 约束优化输出
proc optimize_sdc_output {} {
# 包含所有必要约束
write_sdc -include_comments -version 2.1 optimized_constraints.sdc
puts "优化约束输出完成"
}
# 3. 时序优化输出
proc optimize_timing_output {} {
# 输出详细时序信息
write_sdf -version 3.0 -include_typ optimized_timing.sdf
puts "优化时序输出完成"
}
# 执行优化输出
optimize_netlist_output
optimize_sdc_output
optimize_timing_output
🎓 总结
✅ 关键要点回顾
- 理想网络设置: 正确设置全局信号,避免不必要的优化
- 文件格式选择: 根据后续流程需求选择合适的输出格式
- 质量检查: 确保输出文件的完整性和正确性
- 命名规范: 建立统一的文件命名和目录组织规范
- 自动化脚本: 使用脚本提高输出效率和一致性
🚀 进阶应用建议
graph LR
A[掌握基本输出] --> B[理解文件格式]
B --> C[建立输出流程]
C --> D[自动化脚本]
D --> E[质量保证体系]
💡 实践建议
🎯 文件输出最佳实践:
- 标准化流程: 建立统一的文件输出流程
- 质量检查: 每次输出后进行质量验证
- 版本管理: 对输出文件进行版本控制
- 文档记录: 详细记录输出文件的用途和格式