## ******************** 设置综合环境 ******************** ## source /home/project/ASIC/FFT_IFFT_IP/user/script/setup.tcl set DO_SCAN 0 ## ******************** common setting ******************** ## #dc common setting set_host_options -max_cores 8 set compile_enable_register_merging false set svf_file_records_change_names_changes true set enable_recovery_removal_arcs true set case_analysis_with_logic_constants true set timing_enable_multiple_clocks_per_reg "true" set compile_instance_name_prefix "U" set verilogout_no_tri true set verilogout_show_unconnected_pins true set bind_unused_hierarchical_pins false #CLOCK gating setting set compile_clock_gating_through_hierarchy false #->set power_cg_auto_identify true #->positive_edge_logic integrated set_clock_gating_style \ -sequential_cell latch \ -control_point before \ -control_signal scan_enable \ -observation_point false \ -max_fanout 16 \ -minimum_bitwidth 4 #--append -------------------------------------------- set pwr_hdlc_split_cg_cells true set timing_scgc_override_library_setup_hold true set power_keep_license_after_power_commands true set verilogout_equation false set compile_seqmap_propagate_constants false set compile_seqmap_propagate_high_effort false set set_ultra_optimization "true" set compile_seqmap_identify_shift_registers false set compile_seqmap_no_scan_cell true set compile_seqmap_propagate_constants false set compile_delete_unloaded_seqential_cells false set timing_report_unconstrained_paths true set hdlin_enable_vpp true set power_keep_license_after_power_command true set single_group_per_sheet true set auto_wire_load_selection false set timing_disable_recovery_removal_checks false set enable_recovery_removal_arcs true # 开始记录DC综合的变动 set_svf $RES_OUT/$CURR_DESIGN.svf set_app_var dc_allow_rtl_pg true ## ******************** 读取设计源文件 ******************** ## #读入设计 analyze -format verilog { \ /home/project/ASIC/FFT_IFFT_IP/user/src/top.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/FFT_FLOW.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/send.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/sum.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/utils/ram.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/utils/SPI_M2S.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/utils/math/cmult.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/utils/RAM/2048FP/RAM2048.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/Flow_FFT_IFFT/top/FFT_IFFT.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/Flow_FFT_IFFT/top/fft.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/Flow_FFT_IFFT/stage/BF_stage.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/Flow_FFT_IFFT/stage/fft_stage.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/Flow_FFT_IFFT/utils/BF_op.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/Flow_FFT_IFFT/utils/ftrans_I.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/Flow_FFT_IFFT/utils/ftrans_II.v \ /home/project/ASIC/FFT_IFFT_IP/user/src/Flow_FFT_IFFT/utils/ftwiddle.v \ } elaborate $CURR_DESIGN -architecture verilog current_design $CURR_DESIGN set_fix_multiple_port_nets -all -buffer_constants set hdlout_internal_busses true set bus_inference_style "%s\[%d\]" # define_name rules verilog -check_bus_indexing -allowed {a-XA-Z0-9_} link > $RPT_OUT/00_link_design.log set uniquify_naming_style ${CURR_DESIGN}_%s_%d uniquify -force check_design > $RPT_OUT/01_check_design.log report_attributes -design set_dont_touch u_FFT_FLOW/u_FFT_IFFT/FFT_INST.fft_ins/stagX[*].u_fft_stage/LARGER_THAN_2.BF_inst_I/u_ram/RAM_GEN.RAM*_IP.u_RAM* set_dont_touch *_PAD* set_dont_touch [get_ports CLK -filter {@port_direction == in} -quiet] set_dont_touch u_FFT_FLOW/u_sum/u*_RAM2048/u*_FRAM512 set_dont_use scc018ug_hd_rvt_ff_v1p98_-40c_basic/PULLHD0 set_dont_use scc018ug_hd_rvt_ff_v1p98_-40c_basic/PULLHD1 ## ******************** 进行设计约束 ******************** ## # sdc read_sdc /home/project/ASIC/FFT_IFFT_IP/user/data/constraint/timing.sdc set_operating_conditions -max ff_v1p98_${F_TEMP}c -library $lib_fast set_app_var auto_wire_load_selection false # set_wire_load_model -name ForQA # set_wire_load_mode enclosed # 设置输入transtion,注:需要将输入时钟信号去除 set_input_transition 0.89 [remove_from_collection [all_inputs] [get_clocks clk]] echo "INFO : Defining Reset : RSTN" set_drive 0 [get_ports RSTN -filter {@port_direction == in} -quiet] set_false_path -from [get_ports RSTN -filter {@port_direction == in} -quiet] set_ideal_network -no_propagate [get_nets -of_object [get_ports RSTN -filter {@port_direction == in} -quiet] -quiet] set_ideal_network -no_propagate [get_nets -of_object [get_ports CLK -filter {@port_direction == in} -quiet] -quiet] # set_ideal_network -no_propagate [get_nets -of_object [get_ports rstn -filter {@port_direction == in} -quiet] -quiet] # set_ideal_network -no_propagate [get_nets -of_object [get_ports iclk -filter {@port_direction == in} -quiet] -quiet] # 对时序进行分组 # 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 clock_ports [get_ports -quiet [all_fanout -clock_tree -flat]] set all_inputs [all_inputs] set all_outputs [all_outputs] set all_nonclk_inputs [remove_from_collection $all_inputs $clock_ports] set all_nonclk_outputs [remove_from_collection $all_outputs $clock_ports] set all_icgs [get_cells -hier -filter "is_integrated_clock_gating_cell == true"] set all_reg [all_registers] set all_reg [remove_from_collection $all_reg $all_icgs] group_path -from $all_reg -to $all_reg -name reg2reg group_path -from $all_reg -to $all_nonclk_outputs -name reg2out group_path -from $all_nonclk_inputs -to $all_reg -name in2reg group_path -from $all_nonclk_inputs -to $all_nonclk_outputs -name in2out #group_path -from $all_reg -to $all_icgs -name reg2gate report_path_group set_critical_range 3 [current_design] #设置在RTL代码中用上升沿沿触发的寄存器采用使用集成门控时钟单元。 #设置该门控单元在DFT时的控制点放在门逻辑中的锁存器之前。 #设置一个门控单元所驱动的最大负载数目,定义CG单元最大扇出的一个目的是减少CG后面的时钟延迟 #门控时钟单元的扇出越大,它到达寄存器的延迟越长 #此外,还有用来约束重新平衡 #设置进行时钟门控的寄存器阵列的最小宽度(一个门控时钟至少要触发4个寄存器) #基于锁存器的离散门控单元 # 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 4 \ # -sequential_cell latch ## ******************** 映射门级单元及优化 ******************** ## #综合并插入门控时钟单元 compile_ultra -incremental -scan -gate_clock ## ******************** 检查综合结果并输出报告 ******************** ## #报出所有违规,包括setup, hold check, drv, clock gating check等 report_constraint -all_violators > $RPT_OUT/all_vios.rpt check_design > $RPT_OUT/05_check_design.log check_timing > $RPT_OUT/06_check_timing.rpt #为formality进行停止记录数据(形式验证) set_svf -off #因为DC和其它的XX命名规则不同,为了避免出现问题,在产生网表之前先要定义一些命名规则。 change_names -rules verilog -hierarchy uniquify -force #保存综合后的设计 write -format ddc -hierarchy -output $RES_OUT/${CURR_DESIGN}.ddc #输出网表,自动布局布线需要 write -f verilog -hierarchy -output $RES_OUT/${CURR_DESIGN}.v ## ******************** 进行scan chain的插入 ******************** ## source /home/project/ASIC/FFT_IFFT_IP/user/script/scan.tcl exit