1、配置综合环境

source 配置脚本.sh 就可以配置综合时的环境了
打开综合SYN的文件夹,所有工作和脚本都在其中进行操作。

2、所需要的文件
3、设置搜索路径
4、打开as_shell综合工具
as_shell综合工具长成下面这样:

5、约束文件
6、设置编译库
编译库文件 (compile_lib)
含义:EDA 工具(如 Design Compiler)不能直接看懂文本格式的 .lib 文件,它只能看懂二进制格式的 .db 文件。所以第一步必须要把厂家给的 .lib “翻译”成 .db。
命令:compile_lib -f lib …
作用:就像写 C 语言代码需要先编译成 .exe 才能运行一样,这里是把库源代码编译成工具能用的格式。
设置目标库 (target_lib)
含义:告诉综合工具,“请用这些库里的单元来生成电路”。
作用:即使你读入了很多个库,工具只会用 target_lib 列表里指定的那些库来做映射(Mapping)。通常我们会把包含标准逻辑门(与非门、触发器等)的库设为 target_lib。
注意:用户可能会读入很多库(比如还有 IP 核的库、IO 库),但并不是所有库都用来生成逻辑电路,只有 target_lib 里的会被优先使用。
设置链接优先级 (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、逻辑综合优化
逻辑重构期:工艺无关的“抽象整容”
映射前优化 (Pre-Mapping Optimization) 阶段主要处理的是抽象网表 (Abstract Netlist)。它的核心逻辑是与工艺无关 (Technology-independent),就像写文章先调逻辑结构,不纠结用什么字体。在这个环节,工具会进行高阶和逻辑级的优化,通过合并多余的逻辑门、消除冗余,从数学层面把电路精简到极致。
身份转换期:逻辑到实体的“精准跨越”
工艺映射 (Technology Mapping) 是整个流程的分水岭。它的任务是将抽象网表映射到目标工艺库 (Target Library)。通俗来说,就是把之前的逻辑草稿,正式对接到厂商提供的“积木盒”里(比如特定的与非门、触发器等标准单元),让虚幻的逻辑拥有真实的物理属性。
性能打磨期:关联工艺的“门级精修”
映射后优化 (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
| 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
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
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 }
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"
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
source $script_dir/sdc/mac8_dualmode.sdc
optimize
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
analyze_timing -delay_type max -input_pins -precision 6 > $rpt_dir/timing.rpt
write_design -format verilog -hierarchy -o $rpt_dir/mapped.v
write_sdc > $rpt_dir/mac8_dualmode.sdc
run_stat > $rpt_dir/stat.log
mem_usage > $rpt_dir/memusage.rpt
exit
|
要使用脚本,直接source 脚本.tcl即可