基础知识

  • WLM(线负载模型):

在布图规划(Floorplan)或布局(Layout)之前,线负载模型可以用来估计电容、电阻和互连线的面积开销。可以用线负载模型(Wireload Model)基于扇出的数量估计线的长度。线负载模型依赖于块(Block)的面积,不同面积的设计可以采用不同的线负载模型。线负载模型也可以把预估的线长映射为电阻、电容以及由于走线产生的面积开销。

在库中有不同的线负载模型

  • target_library:

目标库在编译期间用于创建特定于技术的门级网表,DC优化选择满足所需 DRC、时序和逻辑功能的最小门

  • link_library:

不仅有target_library,还有一些IP的加密文件等(.db格式,.ddc格式)

1
set_app_var link_library "* $target_library IP.db"
  • search_path

例如在读取verilog文件的时候,如果没有指定具体的文件路径,dc会在search_path中去寻找

1
set_app_var search_path "$search_path libs cons"
  • read_verilog
1
2
3
4
5
6
read_verilog {top.v a.v b.v} # 一般默认第一个是顶层

read_verilog top.v
read_verilog a.v
read_verilog b.v # 默认最后一个是顶层
current_design top # 设置真正的顶层文件
  • check_design
1
check_design -html check_design.html
  • analyze & elaborate

verilog如下,带有parameter

1
2
3
4
5
6
module MY_TOP(A, B, ...);
parameter A_WIDTH 2;
parameter B_WIDTH 4;
input [A_WIDTH-1: 0] A;
input [B_WIDTH-1: 0] B;
endmodule

此时在dc中可以指定对应的parameter

1
2
3
4
analyze -format verilog {a.v b.v}

elaborate MY_TOP # 不用再运行 current_design 和link
elaborate MY_TOP -parameters "A_WIDTH=9,B_WIDTH=16"
  • read_ddc
1
read_ddc {decode.ddc encode.ddc}
  • 在编译之前保存一个ddc

读取命令采用 RTL 代码并在 DC 内存中构建“GTECH”设计 - 即转换为未映射的 ddc 格式

大型设计的 RTL 到 ddc 转换可能需要一些时间

将来可能需要在将来重新读取未编译的设计

好的做法:保存未映射的 ddc - 读取 ddc 更快

源文件修改后记得重新再保存要给ddc,下一次只要读取ddc就行

1
2
3
4
5
6
read_verilog {a.v b.v top.v}
curren_design top
link
check_design
write -format ddc -hier -output unmapped/my_top.ddc
source top.con
  • 在综合之后再保存一个ddc(交给后端工具使用)
1
2
3
4
5
check_timing
compile_ultra
change_name -rule verilog -hier # 更改名字
write -format verilog -hier -output mapped/my_top_net.v
write -format ddc -hier -output mapped/my_top.ddc

my_top_net.v:后仿或者不是synopsys公司的工具

my_top.ddc:synopsys公司的后仿真使用,DFT等

  • set和set_app_var对比

set_app_vr的使用更加安全,因为会提示报错信息,如果敲错了,例如search_path 打成了serch_path

  • 查看当前已有的库

image-20250315193036453

  • 查看dc中的一个变量
1
2
3
4
# 后面紧跟变量名
Printvar var_name
get_app_var var_name
echo $var_name
  • 重新读取设计
1
2
3
4
5
list_designs # 查看所有的设计
remove_design -hierarchy # 清除设计
analyze -format verilog [list counter_4bit.v]
elaborate -architecture verilog counter_4bit # 会自动进行link
check_design
  • 检查tcl脚本是否存在问题
1
dcprocheck /home/zero/synopsys/syn/script/top_dc.tcl # 在终端,不是dc_shell
  • 查看时序最差的路径
1
report_timing -delay_type max
  • 将脚本的运行结果重定向

.tcl的运行结果会保存到compile.log中

1
redirect -tee -file ${WORK_PATH}/compile.log {source -echo -verbose dc_top.tcl}
  • 将原有的设计打散

此时模块之间的连接信号消失

1
ungroup -flatten -all
  • 插入扫描链

原来未插入扫描链的寄存器

image-20250320171738951

1
2
# 使用下面指令插入扫描链
compile -map_effort high -area_effort high -sacn

image-20250320172405497

寄存器修改为带选择器的寄存器,但是相互之间并没有连接成扫描连

  • 查看每个路径组最差的路径
1
report_timing -delay_type max
  • 报告伪路径
1
report_timing_requirements -ignored
  • 在输出插入buffer
1
2
# 插入buffer或者反相器,插入隔离单元,隔离外部端口和内部电路
set_isolate_ports -type buffer [all_outputs]

tcl 脚本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
set root_path [sh pwd]
sh mkdir -p mapped
sh mkdir -p report
sh mkdir -p unmapped
sh mkdir -p work

set RTL_PATH /home/icer/workspace/git_prj/vip_ahb2apb_dv/rtl
set DC_PATH /opt/Synopsys_2022/syn/U-2022.12-SP7-3
set STD_LIB_PATH /home/icer/ic_lib/SMIC_55nm/STD/SCC55NLL_HD_RVT_V2p1a/liberty/0.9v

set_app_var search_path [list $search_path . $RTL_PATH $STD_LIB_PATH]
set_app_var target_library scc55nll_hd_rvt_ss_v0p81_125c_basic.db
set_app_var link_library [list $target_library]

set_svf mapped/ahb2apb_bridge.svf
set verilogout_show_unconnected_pins true
set verilogout_no_tri true
set verilogout_equation false
set verilogout_higher_designs_first true
set enable_page_mode false

set top_design ahb2apb_bridge
define_design_lib work -path work/

set rtl_vf [list]
set filelist_fp [open scripts/filelist.f r]
while {[gets $filelist_fp line] >= 0} {
set line [string trim $line]
if {$line eq ""} {
continue
}
if {[string match "#*" $line]} {
continue
}
lappend rtl_vf $line
}
close $filelist_fp

analyze -format verilog -library work $rtl_vf
elaborate $top_design -architecture verilog -update
link


remove_unconnected_ports [get_cells * -h]
check_design
uniquify
write -f verilog -h -output unmapped/${top_design}.v
write -f ddc -h -output unmapped/${top_design}.ddc

redirect -tee -file report/timing.rpt {source scripts/timing_syn.sdc}

set_max_area 0

simplify_constants -boundary_optimization
set_fix_multiple_port_nets -all -buffer_constants

compile_ultra

set_svf off
write -format verilog -h -output mapped/${top_design}.v
write -format ddc -h -output mapped/${top_design}.ddc
write_sdc -nosplit mapped/${top_design}.sdc

redirect -tee -file report/setup.rpt {report_timing -delay_type max}
redirect -tee -file report/hold.rpt {report_timing -delay_type min}
redirect -tee -file report/qor.rpt {report_qor}
redirect -tee -file report/vio.rpt {report_constraint -all_vio}