集创赛(4)---Altisyn综合

1、配置综合环境

source 配置脚本.sh 就可以配置综合时的环境了

打开综合SYN的文件夹,所有工作和脚本都在其中进行操作。

2、所需要的文件

3、设置搜索路径

4、打开as_shell综合工具

as_shell综合工具长成下面这样:

5、约束文件

6、设置编译库

  1. 编译库文件 (compile_lib)
    含义:EDA 工具(如 Design Compiler)不能直接看懂文本格式的 .lib 文件,它只能看懂二进制格式的 .db 文件。所以第一步必须要把厂家给的 .lib “翻译”成 .db。
    命令:compile_lib -f lib …
    作用:就像写 C 语言代码需要先编译成 .exe 才能运行一样,这里是把库源代码编译成工具能用的格式。

  2. 设置目标库 (target_lib)
    含义:告诉综合工具,“请用这些库里的单元来生成电路”。
    作用:即使你读入了很多个库,工具只会用 target_lib 列表里指定的那些库来做映射(Mapping)。通常我们会把包含标准逻辑门(与非门、触发器等)的库设为 target_lib。
    注意:用户可能会读入很多库(比如还有 IP 核的库、IO 库),但并不是所有库都用来生成逻辑电路,只有 target_lib 里的会被优先使用。

  3. 设置链接优先级 (link_priority)
    含义:告诉工具,“当你在设计里看到一个单元(比如 AND2X1)时,先去哪个库里找它的定义?”
    作用:如果多个库里都有同名的单元,这个变量决定了工具先用谁。这对于解决命名冲突或者优先使用特定版本的库非常重要。
    搜索顺序:工具会严格按照你在这个变量里列出的顺序去查找单元定义。

7、约束文件怎么编写

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
########## Configuring parameter ##########
#set_parameter max_thread_number 8

# set units
# 设置物理单位:时间(ns), 电阻(kOhm), 电容(pF), 电压(V), 电流(mA)
set_units -time ns -resistance kOhm -capacitance pF -voltage V -current mA

# set operating conditions
# 设置工作条件(PVT:工艺、电压、温度)
# -max: 最差情况(用于建立时间检查),通常是慢工艺(ss)、低电压(1.08v)、高温(125c)
# -min: 最好情况(用于保持时间检查),通常是快工艺(ff)、高电压(1.32v)、低温(-40c)
set_operating_conditions \
-max ETSCA_N55_H9BR_ss_mos_RCworst_1.08_125 \
-max_library scc55nll_hs_rvt_ss_v1p08_125c_basic \
-min ETSCA_N55_H9BR_ff_mos_RCbest_1.32_-40 \
-min_library scc55nll_hs_rvt_ff_v1p32_0c_basic

# set load
# 设置输出负载电容。模拟芯片输出管脚外部连接的电路负载。
# 这里给 sum_out[0] 到 sum_out[15] 都设置了 0.025pF 的负载。
set_load -pin_load 0.025 [get_ports {sum_out[15]}]
set_load -pin_load 0.025 [get_ports {sum_out[14]}]
# ... (省略中间重复部分 sum_out[13] 到 sum_out[1]) ...
set_load -pin_load 0.025 [get_ports {sum_out[0]}]

# set ideal network
# 将 clk 设置为理想网络。意味着综合工具暂时忽略该网络的延迟和扇出限制(通常在CTS时钟树综合之前使用)
set_ideal_network [get_ports clk]

# create clock
# 创建时钟定义。周期为10ns (100MHz),波形在0ns上升,5ns下降(50%占空比)
create_clock [get_ports clk] -period 10 -waveform {0 5}

# set clock latency
# 设置时钟延迟为0(理想情况)
set_clock_latency 0 [get_clocks clk]

# set clock uncertainty
# 设置时钟不确定性(Jitter/Skew)为 0.5ns。这会在建立时间检查中作为扣除项。
set_clock_uncertainty 0.5 [get_clocks clk]

# set clock transition
# 设置时钟的转换时间(Slew rate/上升下降沿时间)为 0.1ns
set_clock_transition -max -rise 0.1 [get_clocks clk]
set_clock_transition -max -fall 0.1 [get_clocks clk]
set_clock_transition -min -rise 0.1 [get_clocks clk]
set_clock_transition -min -fall 0.1 [get_clocks clk]

# set input delay
# 设置输入延时。模拟外部电路向芯片输入数据所消耗的时间。
# 意味着数据在时钟沿之后 6ns 才到达输入端口。
# 留给内部逻辑的时间 = 周期(10) - 输入延时(6) - Setup时间 - Uncertainty
set_input_delay -clock clk -max 6 [get_ports rst_n]
set_input_delay -clock clk -max 6 [get_ports clr]
set_input_delay -clock clk -max 6 [get_ports mode]
# 对 a[7:0] 和 b[7:0] 设置同样的延时
set_input_delay -clock clk -max 6 [get_ports {a[7]}]
# ... (a[6] 到 a[0]) ...
set_input_delay -clock clk -max 6 [get_ports {a[0]}]
set_input_delay -clock clk -max 6 [get_ports {b[7]}]
# ... (b[6] 到 b[0]) ...
set_input_delay -clock clk -max 6 [get_ports {b[0]}]

8、逻辑综合优化

  1. 逻辑重构期:工艺无关的“抽象整容”
    映射前优化 (Pre-Mapping Optimization) 阶段主要处理的是抽象网表 (Abstract Netlist)。它的核心逻辑是与工艺无关 (Technology-independent),就像写文章先调逻辑结构,不纠结用什么字体。在这个环节,工具会进行高阶和逻辑级的优化,通过合并多余的逻辑门、消除冗余,从数学层面把电路精简到极致。

  2. 身份转换期:逻辑到实体的“精准跨越”
    工艺映射 (Technology Mapping) 是整个流程的分水岭。它的任务是将抽象网表映射到目标工艺库 (Target Library)。通俗来说,就是把之前的逻辑草稿,正式对接到厂商提供的“积木盒”里(比如特定的与非门、触发器等标准单元),让虚幻的逻辑拥有真实的物理属性。

  3. 性能打磨期:关联工艺的“门级精修”
    映射后优化 (Post-Mapping Optimization) 针对的是已经映射到工艺的网表 (Mapped Netlist)。由于此时电路已经有了具体的物理参数,优化的重点就转向了与工艺相关 (Technology-dependent) 的细节。工具会进行门级优化 (Gate-level Optimization),通过调整单元尺寸、优化关键路径等手段,解决时序、功耗和面积的最终合规问题。

9、综合脚本

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
68
69
70
71
72
73
74
75
76
77
78
79
#### 1. Environment Setting (环境设置) ####
set script_dir [file dirname [file normalize [info script]]]
set case_dir $script_dir
set lib_dir ../../Common/ics55_LLSC_H9CR_0917/liberty/lib
set src_dir $case_dir/rtl
set rpt_dir $case_dir/report
set search_path "$script_dir $lib_dir $src_dir"

set design mac8_dualmode

#### 2. Library Compilation (库文件编译) ####
# 将 .lib 文件编译为工具内部使用的格式
compile_lib -f lib ics55_LLSC_H9CR_ff_cbest_1p32_125_nldm.lib
compile_lib -f lib ics55_LLSC_H9CR_ff_rcbest_1p08_125_nldm.lib
compile_lib -f lib ics55_LLSC_H9CR_ff_rcbest_1p32_m40_nldm.lib
compile_lib -f lib ics55_LLSC_H9CR_ss_cworst_1p08_m40_nldm.lib
compile_lib -f lib ics55_LLSC_H9CR_ss_rcworst_1p08_125_nldm.lib
compile_lib -f lib ics55_LLSC_H9CR_ss_rcworst_1p2_m40_nldm.lib
compile_lib -f lib ics55_LLSC_H9CR_typ_tt_1p2_25_nldm.lib

#### 3. Library Linking (库文件链接设置) ####
# 设置目标库 (Target Library)
set target_lib { ics55_LLSC_H9CR_ff_cbest_1p32_125_nldm.lib ics55_LLSC_H9CR_ff_rcbest_1p08_125_nldm.lib ics55_LLSC_H9CR_ff_rcbest_1p32_m40_nldm.lib ics55_LLSC_H9CR_ss_cworst_1p08_m40_nldm.lib ics55_LLSC_H9CR_ss_rcworst_1p08_125_nldm.lib ics55_LLSC_H9CR_ss_rcworst_1p2_m40_nldm.lib ics55_LLSC_H9CR_typ_tt_1p2_25_nldm.lib }

# 设置链接优先级 (Link Priority)
set link_priority "* ics55_LLSC_H9CR_ff_cbest_1p32_125_nldm.lib ics55_LLSC_H9CR_ff_rcbest_1p08_125_nldm.lib ics55_LLSC_H9CR_ff_rcbest_1p32_m40_nldm.lib ics55_LLSC_H9CR_ss_cworst_1p08_m40_nldm.lib ics55_LLSC_H9CR_ss_rcworst_1p08_125_nldm.lib ics55_LLSC_H9CR_ss_rcworst_1p2_m40_nldm.lib ics55_LLSC_H9CR_typ_tt_1p2_25_nldm.lib"

#### 4. Design Load & Elaboration (读入设计与阐述) ####
read_design -format verilog "$src_dir/mac8_dualmode.v"

set current_design $design

link_design
make_unique
write_design -format verilog -hierarchy -o $rpt_dir/pre_mapped.v

#### 5. Constraints & Optimization (约束与优化) ####
# 加载 SDC 约束文件
source $script_dir/sdc/mac8_dualmode.sdc

# 优化指令
#optimize -mode timing -structure_effort high -map_effort high
optimize

#### 6. Reporting & Output Generation (报告与输出) ####
# 生成 QoR (Quality of Results) 报告
analyze_qor -summary -precision 6 > $rpt_dir/qor.rpt

# 生成面积报告
analyze_area > $rpt_dir/area.rpt

# 生成资源报告
analyze_resources > $rpt_dir/resource.rpt

# 生成约束违例报告
analyze_constraint -verbose -all_violators > $rpt_dir/cstr.rpt

# 生成设计概况报告
analyze_design > $rpt_dir/design.rpt

# 生成功耗报告
analyze_power > $rpt_dir/power.rpt

# 生成时序报告 (Max Delay / Setup Time)
analyze_timing -delay_type max -input_pins -precision 6 > $rpt_dir/timing.rpt

# 输出综合后的网表 (Mapped Netlist)
write_design -format verilog -hierarchy -o $rpt_dir/mapped.v

# 输出综合后的 SDC
write_sdc > $rpt_dir/mac8_dualmode.sdc

# 运行统计日志
run_stat > $rpt_dir/stat.log

# 输出内存使用情况
mem_usage > $rpt_dir/memusage.rpt

exit

要使用脚本,直接source 脚本.tcl即可

ESC 关闭 | 导航 | Enter 打开
输入关键词开始搜索