数字IC后端使用的各类文件及解释

发布时间 2023-11-12 20:33:51作者: 白发戴花君莫笑

最后修改日期:2023/11/12


HDL综合(使用SDC)

这里以Synopsys Design Compiler(SDC)为例解释。工艺是SMIC130。

TCL(Tool Command Language)配置文件(.tcl)

使用TCL对SDC过程进行配置。

SDC参数配置

下面展示了一些对SDC进行配置的tcl语句。

set DC_S_DESIGN      <TOP_MODULE>
set DC_S_IS_FLATTEN  true
set DC_S_IS_SYN      true
set DC_S_IS_NET      true
set DC_S_IS_APR      false
set DC_S_BLOCK_DB    netlist
set DC_S_UPF_FLOW    true

其中定义了一些运行参数。TOP_MODULE位置填上HDL的顶层模块名。

工艺定义

下面展示了工艺相关的一些tcl语句。

set DC_S_STD_LIB_PATH <LIB_DIR>
set DC_S_STD_LINK_LIB   [list SVT HVT]
set DC_S_STD_TARGET_LIB [list SVT HVT]
set DC_S_STD_LIB_CORNER WC

set LIB_STDCELL_TC_SVT "scc013ug_hd_rvt_tt_v1p2_25c_basic"
set LIB_STDCELL_WC_SVT "scc013ug_hd_rvt_ss_v1p08_125c_basic"
set LIB_STDCELL_BC_SVT "scc013ug_hd_rvt_ff_v1p32_-40c_basic"
set LIB_STDCELL_TC_HVT "scc013ug_hd_hvt_tt_v1p2_25c_basic"
set LIB_STDCELL_WC_HVT "scc013ug_hd_hvt_ss_v1p08_125c_basic"
set LIB_STDCELL_BC_HVT "scc013ug_hd_hvt_ff_v1p32_-40c_basic"
set LIB_STDCELL_PATH_SVT $DC_S_STD_LIB_PATH/rvt
set LIB_STDCELL_PATH_HVT $DC_S_STD_LIB_PATH/hvt

其中在LIB_DIR位置填上数字库文件所在路径。

LINK_LIBTARGET_LIB指向SVT和HVT,这是因为同时安装了两种数字库,分别为RVT(SVT)和HVT版本。在综合时将两种版本混用,这样综合器的选择范围更广,综合结果更好。

STDCELL后面的TC WC BC分别指:typical case, worst case, best Case。一般综合时选择最坏情况,综合得到的电路才是robust的。这也是为什么会有set DC_S_STD_LIB_CORNER WC这一句。

SDC约束文件(.sdc)

对数字电路信号的约束。综合器是按照约束文件的要求来综合优化的,只要满足了约束文件里面的要求了,综合器就认为电路已经合格。

从文件格式来看,SDC文件的语法与TCL是基本一致的,只是可能有一些在一般TCL中不存在的命令。

SDC变量定义

set <NAME> <VALUE>
$<NAME>

以上给出了SDC中定义变量的语法。第一句中定义了变量,NAME VALUE是变量的名称和值,中间用空格隔开。但是注意:在之后使用变量时,必须在前面加上$符号才算引用。这一点可以类比Verilog

约束定义

定义的约束有许多种类。以下列出一些命令名称:

  • create_clock
  • set_clock_groups
  • set_false_path
  • set_input_delay
  • set_output_delay
  • set_driving_cell
  • set_load
  • set_fix_hold

以上命令的含义容易理解,但是具体用法在此不表。可以去找找SDC写法的相关资料。

Database文件(.db)

这类文件一般是PDK内就有的库文件,描述了Synopsys专用的工艺角情形。不过不知道这类文件的内容,因为不能在文本编辑器中显示。

image

以上展示了SMIC130 PDK中的所有db文件。从文件的名称可以得到一些信息。对于scc013ug_hd_rvt_ff_v1p32_0c_basic.db进行解释:

  • scc013ug_hd是这个数字库的名称

  • rvt表示regular voltage,这表示MOS管栅极开启电压是常规的系列,一般常见的有rvt/lvt/hvt

  • ff表示MOS工艺角为ff

    按照NMOS、PMOS的快、慢,组合起来可以得到四个工艺角:ss、sf、fs、ff,加上常规typical(tt),这些工艺角表征了MOS制造偏差所带来的最极端情况。值得一提的是:ff对应BC、ss对应WC、tt对应TC,这应该容易理解。

  • 0c代表0℃,这代表了温度工艺角

    在有的工艺文件命名中,比如零下40℃会被写作m40c,这第一眼看着可能不是很直观,想不到是温度。

LIB文件(.lib)

定义了工艺角下数字器件的电气参数。

library(scc013ug_hd_rvt_ff_v1p32_-40c_basic) { 
  delay_model : table_lookup ; 
  in_place_swap_mode : match_footprint ;
  comment : "Created by Wendy Zhang, Design Service, SMIC" ;
  revision : "0.1" ; 
  library_features(report_delay_calculation);
  time_unit : 1ns ;
  voltage_unit : 1V ; 
  current_unit : 1mA ; 
  capacitive_load_unit(1, pf);
  pulling_resistance_unit : 1kohm ; 
  leakage_power_unit : 1uW ; 
  input_threshold_pct_fall : 50 ; 
  input_threshold_pct_rise : 50 ; 
  output_threshold_pct_fall : 50 ; 
  output_threshold_pct_rise : 50 ; 
  slew_derate_from_library : 0.5 ; 
  slew_lower_threshold_pct_fall : 30 ; 
  slew_lower_threshold_pct_rise : 30 ; 
  slew_upper_threshold_pct_fall : 70 ; 
  slew_upper_threshold_pct_rise : 70 ;
  nom_process : 1 ; 
  nom_temperature : -40 ; 
  nom_voltage : 1.32 ; 
  default_cell_leakage_power : 0 ; 
  default_fanout_load : 1 ; 
  default_inout_pin_cap : 0.031358; 
  default_input_pin_cap : 0.031358; 
  default_leakage_power_density : 0 ;
  default_max_transition : 0.73 ; 
  default_output_pin_cap : 0 ; 
  default_threshold_voltage_group : "scc013ug_hd_rvt" ;
  voltage_map(VNW, 1.32);
  voltage_map(VDD, 1.32);
  voltage_map(VSS, 0);
  voltage_map(VPW, 0);


  operating_conditions(ff_v1p32_-40c) { 
    process : 1 ; 
    temperature : -40 ; 
    voltage : 1.32 ;
    tree_type : balanced_tree ; 
  }

  default_operating_conditions : ff_v1p32_-40c ;

  input_voltage(default) { 
    vil : 0 ; 
    vih : 1.32 ; 
    vimin : 0 ; 
    vimax : 1.32 ; 
  }

  output_voltage(default) { 
    vol : 0 ; 
    voh : 1.32 ; 
    vomin : 0 ; 
    vomax : 1.32 ; 
  }

以上展示了一小部分lib文件的内容。

SVF文件(.svf)

综合过程生成的文件,用于记录综合过程中对于Verilog原始逻辑作出的调整。这些调整有可能改变了实际逻辑功能,有可能没有,这需要将SVF文件输入给其他软件验证。

SDF(Standard Delay Format)文件(.sdf)

这种文件表征了电路器件的延时信息。在Verilog功能仿真的基础上加上SDF文件就成了时序仿真。

SDF文件可以由综合器得到,此时得到的延时只计算了器件固有的传输延时。

SDF文件还可以在布局布线之后再次得到,此时SDF文件还计算了器件距离、走线等带来的延时,因此更接近真实情况。

一般SDF文件不是人工编写的,因此不需要知道其内部语法。不过下面还是列出一个SDF文件的部分内容作为例子。

(CELL
  (CELLTYPE "AND2HDV0")
  (INSTANCE clk_gate_q_reg/main_gate)
  (DELAY
    (ABSOLUTE
    (IOPATH A1 Z (0.259:0.260:0.260) (0.246:0.246:0.246))
    (IOPATH A2 Z (0.253:0.253:0.253) (0.240:0.240:0.240))
    )
  )
)

以上是一个器件(也就是一个实例化)的SDF内容。其中定义了器件的类型,器件的层级位置,器件的IO延时(这是综合器给出的SDF,因此只有IO延时)。

总结SDC过程中的文件

输入文件

  • .tcl:作为SDC运行的配置
  • .sdc:SDC约束文件
  • .db:工艺角database文件
  • .lib:工艺角电气参数文件
  • .v:原始Verilog文件

输出文件

  • .svf:对Verilog逻辑作出的调整记录

  • .sdc:全部信号的约束文件

    需要注意,输出的.sdc文件(一般为了区分命名为xxx_all.sdc)与输入是不同的。在写输入.sdc文件的时候,不可能对所有信号进行约束,我们写的只是关心的关键信号。
    在综合过程中,SDC会将输入.sdc文件中未提到的信号按照默认参数生成约束,并将所有信号的约束输出为新的.sdc文件。这个文件在后续的布局布线中是必须的。

  • .v:输出的综合后网表

    在编写原始Verilog文件时我们肯定不会使用一个具体数字库里面的器件,换句话说,这个Verilog文件是抽象的,与工艺无关的。
    而综合过程就是在数字库中寻找合适的数字器件,将它们组合起来并且完成与你编写的抽象Verilog文件一致的功能。因此综合后的网表(一般为了区分命名为xxx_netlist.v)全都是库数字器件的例化。

  • .sdf:延时文件,用于综合后仿真

  • .rpt:SDC综合的报告文件。检查.rpt文件可以确认综合过程是否存在问题,综合结果是否可靠

布局布线(使用Innovus)

这里以Cadence Innovus为例解释。工艺是SMIC130。

导入设置文件(.globals)

该文件不是必须的。但是有一个.globals配置会快很多。

set ::TimeLib::tsgMarkCellLatchConstructFlag 1
set _timing_save_restore_compression_mode hybrid
set dcgHonorSignalNetNDR 1
set defHierChar {/}
set delaycal_input_transition_delay {0.1ps}
set distributed_client_message_echo {1}
set distributed_mmmc_disable_reports_auto_redirection {0}
set fpIsMaxIoHeight 0
set gpsPrivate::dpgNewAddBufsDBUpdate 1
set gpsPrivate::lsgEnableNewDbApiInRestruct 1
set init_gnd_net {VSS}
set init_lef_file {../../../../LIB130/lef_rvt/tf/tf_wo_RDL/scc013u_7lm_2tm.lef ../../../../LIB130/lef_rvt/macro/SCC013UG_HD_RVT_V0p1.lef ../../../../LIB130/lef_rvt/macro/SCC013UG_HD_RVT_V0p1_ant.lef ../../../../LIB130/lef_hvt/tf/tf_wo_RDL/scc013u_7lm_2tm.lef ../../../../LIB130/lef_hvt/macro/SCC013UG_HD_HVT_V0p1.lef ../../../../LIB130/lef_hvt/macro/SCC013UG_HD_HVT_V0p1_ant.lef}
set init_mmmc_file {import/MMMC_lib1.tcl}
set init_oa_search_lib {}
set init_pwr_net {VDD}
set init_top_cell {double_count_10}
set init_verilog {import/xxx_netlist.v}
set latch_time_borrow_mode max_borrow
set lsgOCPGainMult 1.000000
set pegDefaultResScaleFactor 1.000000
set pegDetailResScaleFactor 1.000000
set report_inactive_arcs_format {from to when arc_type sense reason}
set timing_library_float_precision_tol 0.000010
set timing_library_load_pin_cap_indices {}
set timing_library_write_library_to_directory {}
set tso_post_client_restore_command {update_timing ; write_eco_opt_db ;}

这个文件定义了Innovus-Import Design的配置,如果不load这个.globals文件也可以自己设置。

lef文件设置

set init_lef_file:lef文件后面会说明是什么。文件中对于lef文件需要引用所有用到的lef文件,并且顺序也不是随意的,第一个必须是techfile。

mmmc设置

set init_mmmc_file:mmmc文件后面会说明是什么。

电源地设置

set init_pwr_net set init_gnd_net:这是必须要设置的,否则后面Innovus运行会全是错误。

网表设置

set init_verilog:综合后网表。

MMMC文件(.tcl)

一种特殊的.tcl文件,称为多模多角(Multi-Mode Multi-Corner, MMMC)文件。

set TECH_LIB_RVT_tt  $lib_RVT_PATH/scc013ug_hd_rvt_tt_v1p2_25c_basic.lib

set TECH_LIB_RVT_ss  $lib_RVT_PATH/scc013ug_hd_rvt_ss_v1p08_125c_basic.lib

set TECH_LIB_RVT_ff  $lib_RVT_PATH/scc013ug_hd_rvt_ff_v1p32_-40c_basic.lib

set TECH_LIB_HVT_tt  $lib_HVT_PATH/scc013ug_hd_hvt_tt_v1p2_25c_basic.lib

set TECH_LIB_HVT_ss  $lib_HVT_PATH/scc013ug_hd_hvt_ss_v1p08_125c_basic.lib

set TECH_LIB_HVT_ff  $lib_HVT_PATH/scc013ug_hd_hvt_ff_v1p32_-40c_basic.lib

set file_sdc  $input_PATH/import/double_count_10_all.sdc


create_constraint_mode -name functional \
   -sdc_files [list $file_sdc]

create_library_set  -name fast_LIB \
                    -timing [list $TECH_LIB_RVT_ff $TECH_LIB_HVT_ff]

create_library_set  -name slow_LIB \
                    -timing [list $TECH_LIB_RVT_ss $TECH_LIB_HVT_ss]

create_library_set  -name tpyical_LIB \
                    -timing [list $TECH_LIB_RVT_tt $TECH_LIB_HVT_tt]

create_rc_corner -name rc_cbest\
   -preRoute_res 0.8\
   -postRoute_res 0.8\
   -preRoute_cap 0.8\
   -postRoute_cap 0.8\
   -postRoute_xcap 0.8\
   -preRoute_clkres 0\
   -preRoute_clkcap 0\
   -T -40

create_rc_corner -name rc_cworst\
   -preRoute_res 1.2\
   -postRoute_res 1.2\
   -preRoute_cap 1.2\
   -postRoute_cap 1.2\
   -postRoute_xcap 1.2\
   -preRoute_clkres 0\
   -preRoute_clkcap 0\
   -T 125

create_rc_corner -name rc_ctypical\
   -preRoute_res 1\
   -postRoute_res 1\
   -preRoute_cap 1\
   -postRoute_cap 1\
   -postRoute_xcap 1\
   -preRoute_clkres 0\
   -preRoute_clkcap 0\
   -T 25

create_delay_corner -name fast_d_lib\
   -library_set fast_LIB\
   -rc_corner rc_cbest  \

create_delay_corner -name slow_d_lib\
   -library_set slow_LIB\
   -rc_corner rc_cworst \

create_delay_corner -name typical_d_lib\
   -library_set tpyical_LIB\
   -rc_corner rc_ctypical \

create_analysis_view -name av_maxff -constraint_mode functional -delay_corner fast_d_lib
create_analysis_view -name av_maxss -constraint_mode functional -delay_corner slow_d_lib
create_analysis_view -name av_maxtt -constraint_mode functional -delay_corner typical_d_lib

set_analysis_view -setup [list av_maxss av_maxff av_maxtt] -hold [list av_maxss av_maxff av_maxtt]

setAnalysisMode -analysisType onChipVariation

可以明显看出,其中定义了多个工艺角。

LEF(Library Exchange Format)文件(.lef)

专门用于数字后端的器件版图描述文件。一般.lef文件在PDK中可以找到。

工艺LEF文件

也称为Techfile(tf) LEF文件,因为其中描述了各个层的名称、尺寸限制、走线方向偏好等等信息。

LAYER METAL1
  TYPE		ROUTING ;
  DIRECTION	HORIZONTAL ;
  PITCH		0.41 ;
  OFFSET	0.41 ;
  WIDTH		0.16 ;
  MINWIDTH 0.16 ;
  SPACING 0.17 ;
  SPACING 0.2 RANGE 0.405 2.005 ;
  SPACING 0.4 RANGE 2.005 10.005 ;
  SPACING 0.5 RANGE 10.005 999.0 ;
  RESISTANCE	RPERSQ 0.0995 ;
  CAPACITANCE	CPERSQDIST 3.62e-3 ;
  EDGECAPACITANCE 6.9800e-7 ;
  THICKNESS 0.26 ;
  ANTENNACUMAREARATIO	 5000.0 ;
  ANTENNACUMDIFFAREARATIO PWL (  ( 0.0 5000.0 ) ( 0.159 5000.0 ) ( 0.16 44064.0 ) ( 1.0 44400.0 ) ) ;
  MINIMUMDENSITY 16 ;
  MAXIMUMDENSITY 82 ;
  DENSITYCHECKWINDOW 200 200 ;
  DENSITYCHECKSTEP 100 ;
  AREA	0.08 ;
  MINENCLOSEDAREA  0.170 ;
  MAXWIDTH 14.00 ;
END METAL1

以上是SMIC130某个tf文件里对METAL1的定义。其中DIRECTION HORIZONTAL表示倾向于用METAL1走横向的线。一般各层金属都会依照H,V,H,V,...的顺序排列,这样布局布线工作按照该指示进行更容易布通。其余参数都是电气和工艺参数,容易理解。

注意:LEF文件定义的层只有Poly、MET、Via,是没有有源区、掺杂区、阱区等的定义的。所以在数字流程中不会用到这些层。也正是因为LEF没有定义所有层,所以它只是用于数字后端的版图文件,而不是能取代gds的通用版图文件。

在引用LEF文件时,必须将tf文件放在前面。这很容易理解:必须先定义METAL1,才能用METAL1去绘制图形,反之肯定不行。

版图LEF文件

也称为macro LEF文件,其中定义了各个器件的版图形状。

MACRO INHDV0
  CLASS CORE ;
  ORIGIN 0 0 ;
  FOREIGN INHDV0 0 0 ;
  SIZE 1.23 BY 3.28 ;
  SYMMETRY X Y ;
  SITE CoreSite ;
  PIN I
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER METAL1 ;
        RECT 0.105 1.39 0.345 1.785 ;
    END
  END I
  PIN VDD
    DIRECTION INOUT ;
    USE POWER ;
    SHAPE ABUTMENT ;
    PORT
      LAYER METAL1 ;
        RECT 0.165 2.06 0.325 3.4 ;
        RECT 0 3.16 1.23 3.4 ;
    END
  END VDD
  PIN VSS
    DIRECTION INOUT ;
    USE GROUND ;
    SHAPE ABUTMENT ;
    PORT
      LAYER METAL1 ;
        RECT 0.165 -0.12 0.325 1 ;
        RECT 0 -0.12 1.23 0.12 ;
    END
  END VSS
  PIN ZN
    DIRECTION OUTPUT ;
    USE SIGNAL ;
    PORT
      LAYER METAL1 ;
        RECT 0.515 0.86 0.835 2 ;
    END
  END ZN
END INHDV0

以上LEF定义了一个最简单的CMOS反相器。其中定义了器件的尺寸、管脚信息等。之后使用之前定义的层描绘了各层图形。所以这个MACRO完全定义了该数字器件的版图。

版图转换文件(.map)

在版图转换时,经常用到.map文件,其说明各层的名称、作用、GDS层序号等等。

在Innovus导出版图时需要一个参考.map文件。但是其实有若干个.map文件,在不同地方使用的。因此需要根据内容进行区分。

管脚文件(.io)

这不是必须的文件。其中定义了模块管脚的位置、层、属性等信息。在Innovus中保存.io文件时可以选择Location或Sequence,一般选择Location,因为它是绝对位置。

注意:.io文件中不会包含位置为Inside的管脚,这个文件只会记录在模块Floorplan边缘的管脚。

Flooplan文件(.fp & .fp.spr)

Floorplan文件定义了Innovus的Floorplan,实际上该文件内容很多,下面介绍部分内容。

Design Routing Halo

Halo是器件周围的保护区域,禁止摆放器件、走线等。

Core Row

模块中允许放器件的部分被称为Core。因为数字器件都是按行排列的,所以每一行称为Core Row。

######################################################
#  Core Rows Parameters:                             #
######################################################
Row Spacing = 0.000000
Row SpacingType = 2
Row Flip = 2
Core Row Site: CoreSite 

##############################################################################
#  DefRow: <name> <site> <x> <y> <orient> <num_x> <num_y> <step_x> <step_y>  #
##############################################################################
DefRow: ROW_0 CoreSite 0.0000 0.0000 FS 17073 1 0.4100 0.0000
DefRow: ROW_1 CoreSite 0.0000 3.2800 N 17073 1 0.4100 0.0000
DefRow: ROW_2 CoreSite 0.0000 6.5600 FS 17073 1 0.4100 0.0000
DefRow: ROW_3 CoreSite 0.0000 9.8400 N 17073 1 0.4100 0.0000
DefRow: ROW_4 CoreSite 0.0000 13.1200 FS 17073 1 0.4100 0.0000

如上是关于Core Row的部分内容。定义了Core Row的参数和每行的参属性。

Track

############################################################################################
#  Track: dir start number space layer_num layer1 [firstColor] [isSameColor] [width] [rule]#
############################################################################################
Track: X 1.2300 6828 1.0250 1 7

Track貌似是模块中对于走线位置、尺寸的限制。类似于一种格点。

Physical Net

#########################################################
#  PhysicalNet: <name> [-pwr|-gnd|-tiehi|-tielo]        #
#########################################################
PhysicalNet: VDD -pwr
PhysicalNet: VSS -gnd

定义了电源/地网络。

Physical Instance

#########################################################
#  PhysicalInstance: <name> <cell> <orient> <llx> <lly> #
#########################################################
PhysicalInstance: WT_1 FILLTIEHD MX 0.0000 0.0000
PhysicalInstance: WT_2 FILLTIEHD MX 19.6800 0.0000
PhysicalInstance: WT_3 FILLTIEHD MX 39.7700 0.0000

定义了物理器件的属性。

注意:只有Well Tap Cell会在Physical Instance里面出现。而像Tie Hi/Lo Cell、Physical Filler Cell、Standard Cell都是不会在其中出现的。

从Innovus GUI的角度来看:在Floorplan view下能看到的cell都会被记录到.fp文件里。

Instance

######################################################
#  Instance: <name> <orient> <llx> <lly>             #
######################################################
Instance: clk_1G__L8_I0 R0 2522.7300 252.5600
Instance: clk_1G__L7_I0 MX 2854.8300 249.2800
Instance: clk_1G__L6_I0 R0 3187.7500 246.0000
Instance: clk_1G__L5_I1 R0 2324.7000 252.5600
Instance: clk_1G__L5_I0 MX 3512.0600 249.2800
Instance: clk_1G__L4_I0 MX 3526.0000 249.2800
Instance: clk_1G__L3_I0 MX 4726.0700 249.2800
Instance: clk_1G__L2_I0 R0 5925.3200 246.0000
Instance: clk_1G__L1_I0 MX 6992.1400 118.0800
Instance: clk_rd__L4_I0 R0 3733.8700 42.6400
Instance: clk_rd__L3_I0 MX 4853.1700 52.4800
Instance: clk_rd__L2_I0 MX 5966.7300 59.0400
Instance: clk_rd__L1_I0 MX 6992.1400 157.4400

关于这里面的cell的类型不是很确定。推测是只有CTS相关的Cell,而没有Standard Cell。

Blockage

####################################################################################
#  <PlacementBlockages>                                                            #
#     <Blockage name="blk_name" type="hard|soft|partial">                      #
#       <Attr density=1.2 excludeFlops=yes inst="inst_name" pushdown=yes />      #
#       <Box llx=1 lly=2 urx=3 ury=4 /> ...                                        #
#     </Blockage>                                                                  #
#  </PlacementBlockages>                                                           #
####################################################################################
<PlacementBlockages>
    <Blockage name="defScreenName" type="hard" >
	<Box llx=0.0000 lly=65.6000 urx=6670.2900 ury=236.1600 />
    </Blockage>
</PlacementBlockages>

#################################################################
#  <SizeBlockages>                                             #
#     <Blockage name="blk_name">                              #
#       <Box llx=1 lly=2 urx=3 ury=4 /> ...                     #
#     </Blockage>                                               #
#  </SizeBlockages>                                            #
#################################################################

##########################################################################################################
#  <RouteBlockages>                                                                                      #
#     <Blockage name="blk_name" type="User|RouteGuide|PtnCut|WideWire">                              #
#       <Attr spacing=1.2 drw=1.2 inst="name" pushdown=yes fills=yes exceptpgnet=yes pgnetonly=yes />  #
#       <Layer type="route|cut|masterslice" id=layerNo />                                              #
#       <Box llx=1 lly=2 urx=3 ury=4 /> ...                                                              #
#       <Poly points=nr x0=1 y0=1 x1=2 y2=2 ...  />                                                      #
#     </Blockage>                                                                                        #
#  </RouteBlockages>                                                                                     #
##########################################################################################################
<RouteBlockages>
    <Blockage type="User">
	<Layer type="route" id=7 />
	<Box llx=6653.2200 lly=65.6000 urx=6653.8200 ury=71.7600 />
    </Blockage>
</RouteBlockages>

实际上细分可以分为Placement Blockage、Size Blockage、Pin Blockage、Route Blockage。Blockage就是在一个区域内禁止某种做法。比如Route Blockage就是在区域内禁止走线。

值得一提的是,在.fp文件中,Route Blockage的记录方式是将各Layer分开的。比如说你创建的一个Route Blockage是-layer {M1 M2},看起来创建的是一个Blockage,但是在记录时会将M1M2的Blockage分开记录。

IO Pins

##############################################################################
#  <IOPins>                                                                  #
#    <Pin name="pin_name" type="clock|power|ground|analog"                   #
#         status="covered|fixed|placed" is_special=1 >                       #
#      <Port>                                                                #
#        <Pref x=1 y=2 side="N|S|W|E|U|D" width=w depth=d orientation=val /> #
#        <Via name="via_name" x=1 y=2 BotMask=2 CutMask=1 TopMask=2 />...  #
#        <Layer id=id spacing=1.2 drw=1.2>                                   #
#          <Box llx=1 lly=2 urx=3 ury=4 /> ...                               #
#          <Poly points=nr x0=1 y0=1 x1=2 y2=2 ...           />              #
#        </Layer> ...                                                        #
#      </Port>  ...                                                          #
#      <NETEXPR>                                                             #
#        ground VSS                                                          #
#      </NETEXPR> ...                                                        #
#      <Antenna model=num type="name" value=float_num layer=num /> ...       #
#    </Pin> ...                                                              #
#  </IOPins>                                                                 #
##############################################################################

<IOPins>
  <Pin name="wr[255]" status="fixed" >
    <Port>
      <Pref x=31.5100 y=298.4800 side=N width=0.2000 depth=0.6000 orientation=R180 />
      <Layer id=5 >
        <Box llx=31.4100 lly=297.8800 urx=31.6100 ury=298.4800 />
      </Layer>
    </Port>
  </Pin>
  ...
</IOPins>

.fp文件中包含IO Pins,这就意味着.fp文件是可以完全替代.io文件的。不仅如此,我发现.fp文件中的IO是记录IO的坐标的。也就是说,导入.fp也可以导入位置为Inside的Pin,比.io更好。

PG Pin

###################################################################################################################
#  PGPin: <pin> <net> {in|out|inout} {pwr|gnd|-} {placed|fixed|-} <x> <y> <side> <layerId> <nrBox> <NETEXPR=""> #
#    PinBox: <llx> <lly> <urx> <ury>                                                                              #
#    PinPoly: <nrPts> <x1> <y1> <x2> <y2>...<xn> <yn>                                                             #
###################################################################################################################
PGPin: VSS VSS inout gnd fixed 103.7500 0.0000 S 4 1
  PinBox: 103.0000 0.0000 104.5000 1.5000 -lyr 4
PGPin: VSS VSS inout gnd fixed 103.7500 298.4800 N 4 1
  PinBox: 103.0000 296.9800 104.5000 298.4800 -lyr 4

根据和版图的比较,我认为PG Pin定义的是Power Stripe。其中定义了与Power Ring连接点的位置、层等。然后用Innovus用MET将两个点连接就得到了Power Stripe。

Global Net Connection

###########################################################$############################################################################################
#  GlobalNetConnection: <net_name> {-pin|-inst|-net} <base_name_pattern> -type {pgpin|net|tiehi|tielo} {-all|-module <name>|-region <box>} [-override] #
########################################################################################################################################################
GlobalNetConnection: VDD -pin VDD -inst * -type pgpin -all
GlobalNetConnection: VDD -inst * -type tiehi -all
GlobalNetConnection: VSS -inst * -type tielo -all
GlobalNetConnection: VSS -pin VSS -inst * -type pgpin -all
GlobalNetConnection: VDD -pin VNW -inst * -type pgpin -all
GlobalNetConnection: VSS -pin VPW -inst * -type pgpin -all

这里一般定义的都是电源地。

GDS(Graphic Design System)版图文件(.gds)

通用的版图文件,可以认为该文件不受限于EDA工具和厂商。

数字模块生成结束后,将其生成为.gds再导入到版图工具(比如Virutoso)中。在芯片版图画完后,也是将其生成为.gds提交流片。

关于Floorplan文件的总结

  • 无论保存还是读取用的都是.fp文件,但是实际上会多出来一个.sp.spr文件,这应该是为.fp文件作配置的,不要动就行了

  • Floorplan文件包含的内容很多,可以认为导入了Floorplan文件就可以直接跳到Place Standard Cell开始的步骤了

  • Flooplan文件囊括了IO文件的内容,并且不存在IO文件对Inside Pin的限制

  • Floorplan文件的内容太多了,以至于甚至可能存在冗余的信息

    如果你是已经做了Place Cell、CTS、Nano Route等步骤的话,注意一下这些步骤是否影响了.fp文件。建议在Place Cell进行前生成.fp备忘,也方便修改。

总结Innovus用到的文件

参数文件

这里的文件都不是必须的。可以从外部导入到Innovus作为配置,也可以由Innovus导出供以后使用。

  • .globals:Innovus Import参数文件
  • .io:数字模块IO管脚定义文件
  • .fp:Floorplan定义文件

输入

  • .sdc:综合给出的sdc,包含了所有信号的约束
  • .lef:包括工艺tf和数字器件版图macro的定义,供数字后端使用
  • mmmc.tcl:多模多角文件
  • .v:综合后网表文件
  • .map:作为输出gds文件的参考文件
  • (optional).tcl:可以是任何Innovus TCL命令组成的文件,在Innovus中可以调用并执行

输出

  • .gds:通用版图文件,可以导入到IC设计软件中
  • .sdf文件:这个延时文件相比综合后的延时文件多了走线延时等,更接近实际
  • .v:布局布线后网表(一般以示区分可以命名为xxx_apr.sdf)