1. 引言

1.1 DFA 工具定位

DFA(Design Flow Automation)是DOP(Design Operation Platform)的核心模块,通过标准书签文件(standard ticket format)流程定义文件(design flow definition),实现集成电路芯片设计流程的标准化和自动化,使用者只要按照需求填入Ticket中的参数,就可以调用系統预先设定的Design Flow流程范本, 产生可执行的EDA工作环境目录。其核心价值包括:

  • 消除人为差异:通过Ticket统一输入参数、工艺库版本及流程配置。
  • 复杂流程管理:支持多步骤嵌套流程(如综合→时序分析→物理验证)。
  • 质量与效率提升:集成DQI(Design Quality Indicator),自动提取关键指标并生成报告。

1.2 适用角色与场景

角色典型场景关键操作
芯片设计工程师日常任务执行(Synthesis、STA)、数据提交与版本管理编辑Ticket、生成运行目录、执行流程
流程设计工程师维护流程模板、优化脚本、开发流程范本编写.dfd文件、调试流程逻辑
项目经理监控流程状态、审计设计质量、协调跨团队协作查看DQI报告、执行全局审计

2. 系统要求与安装

2.1 硬件与软件要求

组件规格
计算节点支持Slurm作业调度
软件依赖Python 3.12+、EDA工具链(Synopsys/Cadence/Mentor)
平台组件DVC (版本控制)、TLP (工艺库管理)、DQI(质量指标)

2.2 安装与配置步骤

  1. 下载DFA软件包:通过终端或命令提示符运行以下命令下载 DFA 包
    git clone https://gitlab.lyg-semi.com/ly0108/dop.git
  2. 设置环境变量:下载完成后,source DFA环境变量到您的当前 shell 会话
    source dop-master/cshrc_dop  

3. 用户界面与核心概念

3.1 DFA 系统架构

  • DFA总体架构如下图所示
  • 以下表格为各个文件内容说明:
名字说明
ticketstandard ticket format文件仓库,存储各个design flow对应的.stf文件,其中.stf文件的命名格式为 < T{FLOW_ID}.stf > ex.< T510_RCX.stf >
cshrc_dfaDFA环境配置脚本,使用DFA前需要先执行source cshrc_dop命令,cshrc_dop中包含对此环境配置脚本的source
flow储存构建起EDA工作环境的design flow的脚本的目录,目录结构为如图所示的stage_id/flow_ref_id的格式。
dqi_def存储抽取design flow的dqi判断文件的目录,每个 .dqi 文件对应一个设计质量指标(DQI),定义其取值、单位及各个状态(如 Pass、Fail)的判断条件。
bin | etc | libDFA系统相关文件的存放目录

3.2 与DOP各个模块的交互

3.2.1 DOP概述

DOP(Design Operation Platform)是芯片设计全流程管理平台,包含以下核心模块:

DVC(Design Version Control):管理设计数据版本,支持分支、标签和版本回滚。

TLM(Technology Library Management):标准单元库的安装、更新与路径管理。

DFA(Design Flow Automation):自动化执行设计流程,支持多流程组合与动态扩展。

DQI(Design Quality Indicator):自动化生成设计质量报告,支持跨项目对比。

3.2.2 DFA与DOP各个模块的交互

DVC:从 DVC(Design Version Control)获取以及存储设计数据,确保流程输入的一致性。(DVC_SRC为输入路径,DVC_DST为输出路径)。

TLM:通过 TLM(Technology Library Management)自动加载技术库路径,避免手动配置错误(通过在TECHLIB字段指定库配置文件)。

DQI:自动化生成质量报告(如时序违例、功耗分析)。

3.3 关键配置文件

  • Standard Ticket Format(.stf): ticket文件是DFA的核心配置文件,主要用于定义flow的输入/输出路径、版本控制信息、工艺库配置及运行参数,用户通过在ticket文件中按照需求填入参数,就会构建出对应design flow的EDA工作环境,此文件存于DFA的standard ticket format文件仓库(ticket目录),文件命名格式为T{FLOW_ID}.stf,ex.T510_RCX.sft,FLOW_ID的命名格式均为三位数字或字母加上flow名称的格式,例如510_RCX,5C0_STA等等。ticket格式如下:
    [HEADER]
    ## DESCRIPTION : flow name & run directory
    ## ARGUMENT   : < flow_name:run_dir_name >, ex. 510_RCX:rcxt_spef
    FLOW_ID = flow_reference_id:ticket_run_dir

    ## DESCRIPTION : techlib confilg file from TLM
    ## ARGUMENT   : < techlib config file name >, ex.dfalib.cfg
    TECHLIB = techlib_config_file

    ## DESCRIPTION : source path from DVC
    ## ARGUMENT   : < source path >, ex.phase/block/stage/v1
    DVC_SRC = design_source_version_path

    ## DESCRIPTION : destination path from DVC
    ## ARGUMENT   : < destination path >, ex.phase/block/stage/v2
    DVC_DST = design_dest_version_path

    ## DESCRIPTION : top module name
    ## ARGUMENT   : < top module name >, ex.design
    DESIGN  = top_module_name


    [INPUT]
    ## DESCRIPTION : input file of this flow
    ## ARGUMENT   : < path | file_name >, ex.NETLIST_FILE = netlist.v
    input_ref_id1  = input_file_name
    input_ref_id2  = input_dir_name


    [OUTPUT]
    ## DESCRIPTION : output file of this flow
    ## ARGUMENT   : < path | file_name >, ex.NETLIST_FILE = netlist.v
    output_ref_id1 = output_file_name
    output_ref_id2 = output_dir_name


    [PARAMETER]
    ## DESCRIPTION : Script path of EDA tool
    ## ARGUMENT   : , ex. encounter
    TOOL = encounter

    ## DESCRIPTION : Set tool option
    ## ARGUMENT   : ex. tool version, …
    TOOL_OPTION = -uv 9.10-e014_1 -u64

    ## DESCRIPTION : Specify queue name
    ## ARGUMENT   : [ Local | FE | BE ]
    ## if QUEUE = Local, only run job in local machine
    QUEUE = Local

    ## DESCRIPTION: Set queue option
    ## ARGMENT   :   #ex. slurm’s options
    QUEUE_OPTION = –mem=64G -c 1   #slurm’s options

    ## DESCRIPTION : PARAMETER of this flow
    ## ARGUMENT   : < path | parameter >, ex.rc_corner = Typ_85c
    parameter_id1  = parameter_value1
    parameter_id2  = parameter_value2

Standard Ticket Format文件案例

[HEADER]
## DESCRIPTION : flow name & run directory
## ARGUMENT   : < flow_name:run_dir_name >, ex. 510_RCX:rcxt_spef
FLOW_ID = 510-RCX

## DESCRIPTION : techlib confilg file from TLM
## ARGUMENT   : < techlib config file name >, ex.dfalib.cfg
TECHLIB = dfalib.cfg

## DESCRIPTION : source path from DVC
## ARGUMENT   : < source path >, ex.phase/block/stage/v1
DVC_SRC = phase/block/stage/v1

## DESCRIPTION : destination path from DVC
## ARGUMENT   : < destination path >, ex.phase/block/stage/v2
DVC_DST = phase/block/stage/v2

## DESCRIPTION : top module name
## ARGUMENT   : < top module name >, ex.design
DESIGN = hg2325


[INPUT]
## DESCRIPTION : input file of this flow
## ARGUMENT   : < path | file_name >
TOP_DEF_FILE = /lyg/projects/d6ui418a/HG2325/RUN/shizhu/apr_DFT_0410a/out/hg2325.full_chip.def.gz
METAL_FILL_GDS_FILE = /lyg/projects/d6ui418a/HG2325/RUN/shizhu/apr_DFT_0410a/pv/04_BE/hg2325_Dummy_BE.gds


[OUTPUT]
## DESCRIPTION : output file of this flow
## ARGUMENT   : < output file_name >
COUPLING_REPORT_FILE = abc/couplingreport.rep
NETLIST_FILE =${DESIGN}.spef.gz


[PARAMETER]
## DESCRIPTION : PARAMETER of this flow
## ARGUMENT   : < path | parameter >
MAPPING_FILE = /tools/d6techlib/PDK/SYNOPSYS/layers.map
CORNERS_FILE = /lyg/projusers/d6ui418a/d6ui418ab18/RUN/RCX/0.7/script/corners.smc
GDS_LAYER_MAP_FILE = /lyg/projusers/d6ui418a/d6ui418ab18/RUN/RCX/0.7/script/dummy_gds.map
SELECTED_CORNERS =Typ_85c

## DESCRIPTION : Script path of EDA tool
## ARGUMENT   : <eda_tool_path_script>, ex. encounter
TOOL = synopsys_starrc_shell_U

## DESCRIPTION : Set tool option
## ARGUMENT   : <eda_tool_options> ex. tool version, ...
TOOL_OPTION = -2022.12-SP5-2

## DESCRIPTION : Specify queue name
## ARGUMENT   : [Local | BE | FE ]
## if QUEUE = Local, only run job in local machine
QUEUE = BE

## DESCRIPTION: Set queue option
## ARGMENT   : <queue_options>   #ex. slurm's options
QUEUE_OPTION = --mem=64G -c 4

注:

  • Ticket的[INPUT]中参数的值支持以绝对路径去指定输入文档,例如:
#绝对路径
[INPUT]
NETLIST_FILE = /home/netlist/design.v
  • [INPUT]下的参数同样支持以相对路径去指定位于DVC下的文档,此相对路径是相对于DVC_SRC的四层目录下的相对路径,以下面片段为例若要使用DVC的phase/block/stage/version/netlist/design.v这一路径下的design.v的化则需按照如下例子方式填写:
#DVC中的data
DVC_SRC = phase/block/stage/version
...
[INPUT]
NETLIST_FILE = netlist/design.v
  • [INPUT]下的参数值的相对路径除位于DVC下外,还有另一种情况是由另一flow产生,此时INPUT填写的参数值则需要填写这两条flow的::main目录的相对路径,即存在以下目录结构,其相对路径的填写则如下
#目录结构
├── rcxt2spef/    
| └──::main/
|     └──design.spef
└── spef2sdf/    
└──::main/
    └──design.spef -> ../.inpSPEF_FILE     #此文档是由rcxt2spef这一flow产生

#ticket中INPUT填写
[INPUT]
spef2sdf/SPEF_FILE = ../../rcxt2spef/::main/design.spef #此相对路径为spef2sdf的::main目录相对于原始文件目录的路径
[OUTPUT]
rcxt2spef/SPEF_FILE = design.spef
  • Ticket中支持在值中使用上下文中的变量去指定的行为,例如:
DESIGN = design
......
SPEF_FILE = ${DESIGN}_${rc_corner}.spef.gz  
......
rc_corner = cworst
  • Ticket中支持在键前指定路径的行为,且适用通配符去匹配路径,例如:
5M0_MMMC/01_RCX/cbest_125/DEF_FILE = ${rc_corner}.def
......
5M0_MMMC/01_RCX/*/SPEF_FILE = ${DESIGN}_${rc_corner}.spef.gz

一个完整的设计流程,可以拆解成许多的小步骤(flow step),执行每个step都必须指定使用的EDA工具(tool)及参数(parameters),来源资料(input data)以及输出资料(output data ),还有工具运行时产生的检验报告(report file)跟过程记录(log file)档案等,于是我们规范了一个标准的流程步骤定义档案,即Flow Step Definition文件

  • Flow Step Definition (.dfd):definition文件中主要是定义集成电路设计流程的步骤、参数传递的规则以及子流程依赖等信息,此文件经由流程设计者设计,用户无需修改,其文档中的内容为此design flow的默认值,该文件存放于DFA中的对应的flow script目录下(flow目录),档名格式为< {FLOW_ID}.dfd >,其中单个step的格式如下:DEFINE STEP <step_name>

    INPUT input_ref_id1 = input_file;
    INPUT input_ref_id1 = input_file;
    OUTPUT output_ref_id = output_file;
    OUTPUT output_ref_id = output_file;
    PARAM param_ref_id = default_value;

    ## DESCRIPTION : Script path of EDA tool
    ## ARGUMENT   : <eda_tool_path_script>, ex. encounter
    PARAM TOOL = encounter

    ## DESCRIPTION : Set tool option
    ## ARGUMENT   : <eda_tool_options> ex. tool version, …
    PARAM TOOL_OPTION = -uv 9.10-e014_1 -u64

    ## DESCRIPTION : Specify queue name
    ## ARGUMENT   : [Local | <queue_name>]
    ## if QUEUE = Local, only run job in local machine
    PARAM QUEUE = Local

    ## DESCRIPTION: Set queue option
    ## ARGMENT   : < queue_options >   #ex. slurm’s options
    PARAM QUEUE_OPTION = -mem 64 -core 1   #slurm’s options

    ## DESCRIPTION: flow scripts
    ## ARGMENT   : < script_file_name >   #ex. run_precheck
    PRE_CHECK pre_check_script
    EXEC $eda_cmd ….
    POST_CHECK post_check_script
    ## DESCRIPTION: script that extracts the dqi report
    EXEC_DQI exec_dqi.script

    END STEP
  • Flow Step Definition文件中包含以下内容:
    • 流程信息:指定该步骤的输入输出文件以及参数的默认值,eda工具以及运行模式等流程相关信息,其中:
      • DEFINE STEP <step_name>:此项为此流程的名字,其中<step_name>中填写的为该流程的FLOW_ID。ex.DEFINIFE STEP 510_RCX
      • INPUT:此项为此流程所需的输入档案,包含设计资料,设计规范文档,其格式为 INPUT input_ref_id = input_file,其中input_ref_id为其输入参数键名,input_file_name为其输入参数默认值。ex.INPUT DEF_FILE = design.def
      • OUTPUT:此项为此流程运行所产生的设计资料,设计质量报告,执行日记文件等等,其格式为OUTPUT output_ref_id = output_file,同INPUT相同,output_ref_id和output_file_name为其输出参数的键值。ex.OUTPUT NETLIST_FILE = design.v
      • PARAM:此项为此流程运行所需的其他参数设置,其中TOOL,TOO_OPTION,QUEUE,QUEUE_OPTION为必须参数,其他参数格式也是遵循PARAM param_ref_id = param的格式,其中
        • TOOL:此项内容为改流程所需使用的eda工具的名字
        • TOOL_OPTION:此项内容为该流程所使用的eda工具的版本,参数
        • QUEUE:此项内容为该流程作业时所运行的slurm队列,有 < Local | FE | BE >这三种,其中Local为不使用slurm,仅在当前节点运行,FE为前端作业节点(cal06-cal10),BE为后端作业节点(cal11-cal16)
        • QUEUE_OPTION:此项为该流程作业时的slurm作业提交的参数
    • 流程脚本:通过指定流程脚本来决定流程的运行步骤,其中:
      • PRE_CHECK:此项脚本为验证Ticket档中输入文件和参数是否存在,以及其设定值是否合理
      • EXEC:此项为生成EDA工具流程脚本以及运行EDA工具的主要脚本
      • POST_CHECk:此项为EDA工作结束后,对EDA工作结果复查,确保EDA工作正常完成的脚本
      • EXEC_DQI:此项脚本用于EDA工作正常结束后,从产出的报告或日记文件中抽取出<DQI_ID>.val文件,<DQI_DI>.val为生成dqi_rpt.json的中间文件,另外,系统已有支持抽取出<DQI_ID>.val文件的程序,只需在流程脚本目录下准备dqi_ext.spec文件即可依靠系统实现抽取,流程设计者可自行选择采用系统自带程序抽取或者实作EXEC_DQI脚本去抽取<DQI_ID>.val文件,详细过程请参考6.1
    Flow Step Definition文件案例DEFINE STEP 510-RCX
    INPUT METAL_FILL_GDS_FILE  = /lyg/projects/d6ui418a/HG2325/RUN/shizhu/apr_DFT_0410a/out/hg2325.full_chip.def.gz
    INPUT TOP_DEF_FILE         = /lyg/projects/d6ui418a/HG2325/RUN/shizhu/apr_DFT_0410a/pv/04_BE/hg2325_Dummy_BE.gds
    OUTPUT NETLIST_FILE         = ${DESIGN}.spef.gz
    OUTPUT COUPLING_REPORT_FILE = couplingreport.rep
    PARAM rc_corner    = Typ_85c
    PARAM TOOL         = synopsys_starrc_shell_U
    PARAM TOOL_OPTION  = -2022.12-SP5-2
    PARAM QUEUE        = BE
    PARAM QUEUE_OPTION = –mem=64G -c 1
    PRE_CHECK run_precheck
    EXEC run_execute
    POST_CHECK run_postcheck
    EXEC_DQI run_execdqi
    END STEP
  • 一条flow可以通过一个step或者多个step组成,多个step组成的flow step definition文件格式如下:DEFINE FLOW

    INPUT input_ref_id1 = input_file;
    INPUT input_ref_id2 = input_file;
    OUTPUT output_ref_id1 = output_file;
    OUTPUT output_ref_id2 = output_file;
    PARAM param_name = default_value;

    STEP step_name step_id
    > step_input = $input_file
    < step_output = $output_file
    + param_name = $param_value
    ;
    SUBFLOW flow_name flow_id
    > step-input = $input_file
    < step_output = $output_file
    + param_name = $param_value
    ;

    END FLOW
    • 多个step组成的flow的flow step definition文件包含以下内容:
      • DEFINE FLOW <flow_name>:此项为flow名字,同STEP中的DEFINE STEP <step_name>相同
      • 流程步骤定义:描述设计流程的各个步骤的串接,根据输入输出的关系自动生成子流程的执行顺序,确保依赖项先于目标步骤执行
      • 输入输出映射:指定每个步骤的输入(> =)以及输出(< =),形成数据流依赖
      • 参数传递:通过+ =传递参数
    • 字段说明
      • STEP/SUBFLOW:通过定义子流程依赖可以实现复杂流程链形成
      • step_name/flow_name:此项内容为子流程的运行目录的名称,支持多层目录。ex.01_RCX/cbest_125
      • step_id/flow_id:此项为子流程对应的FLOW_ID
      • > < +:输入输出映射(>表示输入,<表示输出)以及参数传递(+表示参数)。

多个step的Step Flow Definition文件案例

  DEFINE FLOW    521-DEF2SDF
INPUT   DEF_FILE = design.def
INPUT   VLOG_FILE = design.v
OUTPUT SDF_FILE = design.sdf.gz
OUTPUT SPEF_FILE = design.spef
PARAM   rc_corner = Cmax_WCL
PARAM   lib_corner = WC

STEP 01/rcxt_spef 510-RCX
> DEF_FILE  = design.def
< SPEF_FILE = design.spef
+ rc_corner = Cmax_WCL
;
SUBFLOW 02/spef2sdf 511-SPEF2SDF
> VLOG_FILE = design.v
> SPEF_FILE = design.spef
< SDF_FILE  = design.sdf.gz
+ lib_corner = WC
;

END FLOW

4. 基本操作流程

芯片设计工程师主要通过使用DFA来实现自动构建出可执行的EDA工作环境,以下是用户使用DFA构建流程的基本操作步骤

操作步骤

  1. Source environment valuable:在使用DFA前先source位于DOP中心目录下的环境变量脚本,这样才能使用DFA命令source /path/to/DOP/cshrc_dop
  2. Checkout Ticket:芯片设计工程师从DFA中心资料库中下载PM/CAD准备的Ticket文件到本地工作执行环境 dop ticket checkout <Ticket file name>    
  3. Edit Ticket:使用者根据需求修改Ticket文件中的内容参数
  4. Build Ticket:根据Ticket定义的内容产生可执行的EDA工作环境(create run directory & Makefile),包含把所需要的输入设计文档以及设计规范下载到工作执行环境,EDA工具运行流程也会根据Ticket文件中的参数进行调试,同时也会对资料完整性进行验证,使用以下命令:dop ticket build <Ticket file name> 即可展开流程,其中DFA流程展开的过程如下图所示:build-flow.png之后会根据ticket以及definition文件的内容生成目录参考如下:### 单个STEP的flow展开后目录结构 ###
    ticket_run_dir
    ├──.techlib -> TLP/techlib_config_file
    ├──.design -> DVC/phase/block/stage/version
    ├──.script -> DFA/flow/flow_stage_id
    ├──.inp$input_ref_id1 -> .design/input_file_name
    ├──.out$output_ref_id1 -> ::main/output_file_name
    └──::main/
        ├──script -> ../.script/flow_ref_id
        ├──input_file_name -> ../.inp$input_ref_id1
        └──Makefile -> script/Makefile.flow
         
    ### 多个STEP的flow展开后目录结构 ###
    ticket_run_dir
    ├──.techlib -> TLP/techlib_config_file
    ├──.design -> DVC/phase/block/stage/version
    ├──.script -> DFA/flow/flow_stage_id
    ├──.inp$input_ref_id1 -> .design/input_file_name1
    ├──.inp$input_ref_id2 -> .design/input_file_name2
    ├──.out$output_ref_id1 -> step_dir1/.out$output_ref_id1
    ├──.out$output_ref_id2 -> step_dir2/.out$output_ref_id2
    ├──::main/
    |     ├──script -> ../.script/flow_ref_id
    |     ├──input_file_name1 -> ../.inp$input_ref_id1
    |     ├──input_file_name2 -> ../.inp$input_ref_id2
    |     ├──output_file_name1 -> ../.out$output_ref_id1
    |   ├──output_file_name2 -> ../.out$output_ref_id2
    |     └──Makefile -> script/Makefile.flow
    ├── step_dir1/    
    | ├──.techlib -> ../.techlib
    | ├──.design -> ../.design
    | ├──.script -> ../.script
    | ├──.inp$input_ref_id1 -> ../input_file_name1
    | ├──.out$output_ref_id1 -> ::main/output_file_name1
    | └──::main/
    |     ├──script -> ../.script/flow_ref_id
    |     ├──input_file_name1 -> ../.inp$input_ref_id1
    |     └──Makefile -> script/Makefile.flow
    └── step_dir2/    
    ├──.techlib -> ../.techlib
    ├──.design -> ../.design
    ├──.script -> ../.script
    ├──.inp$input_ref_id2 -> ../input_file_name2
    ├──.inp$output_ref_id1 -> ../step_dir1/.out$output_ref_id1     ### 各个STEP间的依赖关系通过链接构建
    ├──.out$output_ref_id2 -> ::main/output_file_name2
    └──::main/
        ├──script -> ../.script/flow_ref_id
        ├──input_file_name2 -> ../.inp$input_ref_id2
        └──Makefile -> script/Makefile.flow会在::main目录下生成Makefile文件,参考如下:### STEP下的Makefile文件 ###
    FLOW         := 510-RCX
    INPUT       := input_file_name
    OUTPUT       := output_file_name
    TOOL         := synopsys_starrc_shell_U
    TOOL_OPTION := -2022.12-SP5-2
    QUEUE       := BE
    QUEUE_OPTION := –mem=64G -c 4
    PRE_CHECK   := script/run_precheck
    EXEC         := script/run_execute
    POST_CHECK   := script/run_postcheck
    EXEC_DQI     := script/run_execdqi
    run :
          ../.dfa/dfa_run.sh
    precheck :$(INPUT)
           $(PRE_CHECK) | tee precheck.log
    $(OUTPUT) :precheck
           $(EXEC) | tee execute.log
    postcheck :$(OUTPUT)
           $(POST_CHECK) | tee postcheck.log
    dqi :$(OUTPUT)
          dqi_extractor.py –spec ./script/dqi_ext.spec –dfd ../.dfa/dfd.tcl –ticket ../.dfa/ticket.tcl
          dqi_generate_rpt.py –flow_dqi_value_path ./.dqi –flow_dqi_path ${DFA_FOLDER}/dqi_def –output ./dqi_rpt.json
          cksum dqi_rpt.json > ../.dfa/.dqi_cksum
    clean :
           rm -rf ./.dqi/* ./dfa.log ./dfa_run_*.log
          dfa_set_status.sh 00_dfa_Init
          script/f_flow_clean.run
    rerun :
           make clean
           make run
    kill :
          dfaPid=$$(cat ../.dfa/dfa.pid)
           kill -9 $$dfaPid
    checkin :
          dfa_checkin.py
           
    ### 多个STEP流程下的顶层Makefile文件 ###
    FLOW     := 521-DEF2SDF
    INPUT     := A.v design.def design.spef.gz design.v
    OUTPUT   := design.sdf.gz design.spef.gz
    run:
           cd ../510-RCX/::main && make run
           cd ../511-SPEF2SDF/::main && make run
    clean:
           cd ../510-RCX/::main && make clean
           cd ../511-SPEF2SDF/::main && make clean
    kill:
           cd ../510-RCX/::main && make kill
           cd ../511-SPEF2SDF/::main && make kill
    precheck:
           cd ../510-RCX/::main && make precheck
           cd ../511-SPEF2SDF/::main && make precheck
    postcheck:
           cd ../510-RCX/::main && make postcheck
           cd ../511-SPEF2SDF/::main && make postcheck
    dqi:
           cd ../510-RCX/::main && make dqi
           cd ../511-SPEF2SDF/::main && make dqi
    checkin:
           cd ../510-RCX/::main && make checkin
           cd ../511-SPEF2SDF/::main && make checkin
    rerun: clean run
    design.sdf.gz: A.v design.spef.gz design.v
           cd ../511-SPEF2SDF/::main && make design.sdf.gz
    design.spef.gz: A.v design.def
           cd ../510-RCX/::main && make design.spef.gz注:::main目录为该流程的主要运行目录,流程脚本都位于::main/script目录之下,若脚本中有需要调用其余脚本的话,同样会位于::main/script目录之下,请注意脚本之间的相对路径设置
  5. Execute Ticket: 调用所需的EDA工具执行设计,产出设计输出文档,此阶段也可以搭配设计流程管控工具(DFA Job Manager)实时监控工具执行状态,切换到::main目录下执行以下命令:make run
  6. Checkin Design:将该流程产生的设计数据以及抽取的重要设计资料上传至DVC的设计资料库中心make checkin

5. 核心功能详解

DFA 支持三种主要的流程类型:单一流程(Single Flow层次化流程(Hierarchical Flow动态流程(Dynamic Flow

5.1 单一流程(Single flow)

用于执行单一的 EDA 任务,如综合(Synthesis)或静态时序分析(STA)。单一流程是最基本的流程类型,它包含预检查(PRECHECK)、主流程(EXECUTE)、后检查(POSTCHECK)和生成设计质量指标报告(EXECDQI)等步骤。以下为流程运行时各个流程脚本间运行时的流程图:

make_run.png
  • 预检查(PRE_CHECK):检查用户输入到ticket内的输入文件以及参数是否存在以及是否合理。
  • 主流程(EXEC):读取Flow定义与用户设定的Ticket的内容,产生EDA工作环境并执行EDA
  • 后检查(POST_CHECK):当EDA执行结束后对EDA结果进行复查,确保EDA正常结束工作
  • 生成 DQI 报告(EXECDQI):抽取执行EDA后产出的报告中的重要项目并归纳成DQI报告

5.2 层次化流程(Hierarchical Flow)

将多个单一流程组合起来,形成更复杂的流程。层次化流程可以用于处理多步骤的设计任务,如先进行综合,再进行布局布线(Place and Route),最后进行时序分析。DFA 会根据子流程的输入文件和输出文件的关系,自动生成 Makefile 文件,控制子流程的执行顺序。

5.3 动态流程(Dynamic Flow)

用于处理规模大且会变动的流程,如多模式多角(MMMC)流程。动态流程可以根据用户指定的参数动态生成多个子流程,DFA 会自动管理这些子流程的执行。


6. 高级功能与技巧

6.1 流程开发步骤

流程设计工程师主要是设计流程,以下是用户使用DFA设计流程的基本操作步骤 ,以single flow为例: 操作步骤

  1. 确认Flow编号名创建流程目录:确认flow的分类以及编号名,然后在DFA中心资料库建立flow的文件夹,即在DFA中心资料库建立flow/<flow_stage_id>/<flow_ref_id>目录 。ex.flow/500-TIMING/510_RCX
  2. 准备Definition文件: 在flow/<flow_stage_id>/<flow_ref_id>下准备<flow_ref_id>.dfd文件,definition文件需要严格遵守前文提到的格式。ex.510_RCX.dfd
  3. 准备Ticket文件:准备T<FLOW_ID>.ticket放在DFA中心资料库的ticket文件夹下,ticket文件需要严格遵守前文提到的格式,且此文档面向使用者作设定,因此需要给每个参数填写完整的注释,说明该参数的意义与可接受的设定为何
  4. flow/<flow_stage_id>/<flow_ref_id>下准备run_precheck,run_execute,run_postcheck,run_flowclean脚本
    • run_precheck:检查用户输入到ticket内的输入文件以及参数是否存在以及是否合理,需要按顺序先后source dfd.tcl以及ticket.tcl这两份档案, 将DFA的参数传递给流程脚本中。其中有错误则exit1跳出脚本,没有则exit 0继续运行。可参考以下示例文件:#!/usr/bin/tclsh
      source ../.dfa/dfd.tcl        
      source ../.dfa/ticket.tcl    #需要按顺序先后source这两个tcl文件,传递DFA flow的参数      

      if {[info exists NETLIST_FILE]} {
       if {$NETLIST_FILE eq “”} {
         puts “\[Error 5C0_STA\] please assign for I_NETLIST_FILE in ticket file”
         exit 1
      } else {
         if {[file exist $NETLIST_FILE] == 0} {
           puts “\[Error 5C0_STA\] file($I_NETLIST_FILE) isn’t existed”
           exit 1
        }
      }
      } else {
       puts “\[Error 5C0_STA\] NETLIST_FILE is required in ticket file”
       exit 1
      }
      if {[info exists SPEF_FILE]} {
       if {$SPEF_FILE eq “”} {
         puts “\[Error 5C0_STA\] please assign for SPEF_FILE in ticket file”
         exit 1
      } else {
         if {[file exist $I_SPEF_FILE] == 0} {
           puts “\[Error 5C0_STA\] file($I_SPEF_FILE) isn’t existed”
           exit 1
        }
      }
      } else {
       puts “\[Error 5C0_STA\] I_SPEF is required in ticket file”
       exit 1
      }
      after 5000
      exit 0
       
    • run_execute:读取Flow定义与用户设定的Ticket的内容,产生EDA工作环境并执行EDA ,同样需要按顺序先后source dfd.tcl以及ticket.tcl这两份档案, 将DFA的参数传递给流程脚本中。可参考以下示例文件:#!/usr/bin/env tclsh

      source ../.dfa/dfd.tcl
      source ../.dfa/ticket.tcl

      set template_file “script/clp.tcl”
      set output_file “clp.tcl”


      if {![file exists $template_file]} {
         error “Template file ‘$template_file’ does not exist!”
      }

      set f [open $template_file r]
      set content [read $f]
      close $f

      set replacements [list \
         “<tech_file>” $TECH_FILE \
         “<netlist_file>” $NETLIST_FILE \
         “<upf_file>” $UPF_FILE \
         “<analysis_style>” $ANALYSIS_STYLE \
         “<clp_rpt>” $CLP_RPT \
      ]
      set content [string map $replacements $content]
      set out [open $output_file w]
      puts -nonewline $out $content
      close $out

      exec echo “#!/usr/bin/csh” >run.csh
      exec echo “module load $TOOL$TOOL_OPTION” >>run.csh
      exec echo “lec -lpgxl -lp -verify -nogui -dofile clp.tcl” >>run.csh
      exec chmod 755 ./run.csh

      exec ./run.csh

      exit 0
    • run_postcheck:当EDA执行结束后对EDA结果进行复查,确保EDA正常结束工作,其中脚本检测到有错则exit 1 跳出脚本,没有则exit 0,可参考以下示例文件:#!/bin/tcsh
       
      # read EDA tool report
      set hit = `grep Failed ./PTSI*.log`
      if (“$hit” != “”) then
       echo “[Error 5C0_STA] Post Check Failed, reason: $hit”
       exit 1
      endif

      exit 0
    • run_flowclean:此脚本用于用户希望重新运行此流程时,删除上一次运行此流程在::main目录下所产出的文件,可参考以下示例文件:#!/usr/bin/tclsh
       
      source ../.dfa/dfd.tcl
      source ../.dfa/ticket.tcl

      # delete all files generated by this flow
      exec rm -rf slurm* run* clp.tcl clp2html dfa* .dqi dqi*
  5. flow/<flow_stage_id>/<flow_ref_id>下准备dqi_ext.spec文件或run_execudqi文件dqi_ext.spec文件中需要描述如何从各类 EDA 报告中抽取数据,其格式如下:
    • 每一行代表一个待提取的 DQI 条目。
    • 使用 Tab (\t) 作为字段分隔符。
    • # 开头为注释行,将被忽略。
    字段定义序号字段名描述1<category>/<DQI_ID>类别和DQI_ID,用于输出路径和文件的名字。ex.510-RCX/RCX-0012Report_path所需提取dqi的文件的路径,可以使用ticket和dfd文件中的变量3Simple_regex用于提取值的正值表达式4Only_extract_first< true | false >,用于判断是否只提取第一个匹配项5Default_value如果找不到匹配项则使用这个默认值6Complex_match_script当某个dqi value难以用正则表达式提取时,可以使用脚本提取value值,此项为脚本的路径填写栏位dqi_ext.spec文件示例# <category>/<DQI_ID>\tReport_path\tSimple_regex\tOnly_extract_first\tDefault_value\tComplex_match_script
    361-SCAN_DC/SCAN_DC_INSERT_0001 REPORT/$RPT /^Total number of test points : (\d+)/ true   0   none
    361-SCAN_DC/SCAN_DC_INSERT_0002 REPORT/$RPT /^Number of Autofix test points: (\d+)/ false   0   nonedqi_ext.spec文件中的每一行都会提取出一份.val文件到::main/.dqi目录下,.val文件记录每个DQI指标的实际输出结果,其命名格式为<DQI_ID>.val,其文件内容格式如下: <VALUE>   <DATE_TIME>         <PATH>           <ATTACHMENT>
    ex.5616   20250610_141306   /path/to/report:10     none字段说明字段名描述VALUE数值字段,系统只读取第一行的该值进行条件判断DATE_TIME时间戳,格式为 YYYYMMDD_HHMMSS,可选PATH原始报告路径及行号信息,可选ATTACHMENT附件说明、备注或比对来源信息,可选注意事项
    1. 系统只读取 .val 文件的第一行 VALUE 字段;
    2. 如果文件缺失,系统将报错并中止;
    3. 如果无法将 VALUE 转换为数值类型,则该条件自动判定为不满足;
    4. .val 的数值类型需与 .dqi 中的 DATA_TYPE 一致:
      • real: float,如 123.45
      • integer: int,如 100
      • bool: "true" or "false"(暂不推荐)
      • string: 任意文本(暂不支持参与运算)
    如果不使用dqi_ext.spec去抽取生成.val文件的话,flow designer可以自行准备run_execdqi脚本去抽取此flow的所有的.val文件,只要抽取出.val文件遵循以上格式要求即可,run_execdqi脚本可参考下面脚本:#!/usr/bin/tclsh

    source ../.dfa/dfd.tcl
    source ../.dfa/ticket.tcl

    exec ./script/CLP2HTML

    set error_count 0
    set warning_count 0
    set total_severity 0

    if {[file exists “1801.rpt”]} {
       set file_handle [open “1801.rpt” r]
       while {[gets $file_handle line] >= 0} {
           if {[regexp {Severity:\s*Error\y} $line]} {
               incr error_count
          } elseif {[regexp {Severity:\s*Warning\y} $line]} {
               incr warning_count
          }
      }
       close $file_handle
    } else {
       puts stderr “[Error] 1801.rpt is not exist”
       exit 1
    }

    set total_count [expr {$error_count + $warning_count}]

    set timestamp [clock format [clock seconds] -format “%Y%m%d_%H%M%S”]
    set rpt_path [file normalize “1801.rpt”]
    set clp2html_path “[file normalize “clp2html”]/clp2html.html”

    exec mkdir -p “.dqi/4A0_CLP”
    set output_file [open “.dqi/4A0_CLP/CLP_001.val” w]
    puts $output_file “$total_count\t$timestamp\t$rpt_path\t$clp2html_path”
    close $output_file
  6. dfa/dqi_def/<flow_stage_id>/<category>下准备<DQI_ID>.dqi文件<DQI_ID>.dqi文件中定义了各种状态条件(STATUS_NAME 与 CRITERIA),每个 .dqi 文件对应一个设计质量指标(DQI),定义其取值、单位及各个状态(如 Pass、Fail)的判断条件,以下为其文件结构(此文件同dqi_ext.spec相同,只能通过Tab作为分隔):[DQI_ID.dqi]
    DQI_ID         <unique identifier>
    TITLE           <short title>

    DATA_TYPE       <integer | real | bool | string>
    DATA_UINT       <unit, e.g., %, mm2, count>
    DESCRIPTION     <description>
    REFERENCE       <document link or reference>

    STATUS_NAME     <optional internal name>
    STATUS     <Pass | Fail | Warning>
    @CRITERIA = <expression>
    ;

    … more status blocks …

    DQI_END字段说明字段名说明DQI_ID指标代号,应与文件名一致TITLE简短标题DATA_TYPE数据类型:integerrealboolstringDATA_UNIT数据单位,如 %countmm2DESCRIPTION详细描述REFERENCE外部文件或网页参考状态判断区类别运算符示例比较运算==, !=, <, >, <=, >=$FOO > 100逻辑运算&&, ||, !$A > 0 && $B == 0算术运算+, -, *, /($X + $Y) / 2 > 5括号(,)($A > 10)注意事项:
    1. 表达式中的所有变量应为$<DQI_ID>,系统回自动从.val文件中读取值
    2. 每个状态区块必须以分号 ; 结束
    3. 若使用多个变量,系统将分别查找对应的 .val 文件
    4. 若找不到某变量的 .val 文件,系统将中止并报错
    5. .val 存在但内容非法或不可转为数字,该条件视为不匹配
    6. 系统将返回 首个满足条件的 STATUS 字段值
    示例如下单变量示例:
    DQI_ID         AREA
    TITLE           Cell Area
    DATA_TYPE       real
    DATA_UINT       mm2
    DESCRIPTION     Total standard cell area
    REFERENCE       http://…

    STATUS_NAME     pass_cond
    STATUS     Pass
    @CRITERIA = $AREA < 100.0
    ;

    STATUS_NAME     fail_cond
    STATUS     Fail
    @CRITERIA = $AREA >= 100.0
    ;

    DQI_END


    多变量示例:
    STATUS_NAME     ok
    STATUS     Pass
    @CRITERIA = $TP1 == 0 && $TP2 == 0
    ;

    STATUS_NAME     ng
    STATUS     Fail
    @CRITERIA = $TP1 > 0 || $TP2 > 0
    ;

    DQI_END
  7. flow/<flow_stage_id>/<flow_ref_id>/下准备run_flow_checkin脚本以及在dop/dvc/stage/<stage_name>/下准备STG_REQ_FILE_LIST文件此阶段为决定将此流程所需要checkin到DVC数据中心的数据,首先需要在dop/dvc/stage/<stage_name>/下准备STG_REQ_FILE_LIST文件,此文件为DVC中确保本流程已经将所需的文件已经checkin到DVC指定路径之中的一个文件清单,流程设计师在定义此文件的时候需同项目负责人(PM/PL)或主管商定此流程中所需checkin的文件清单,然后再将此清单制作成STG_REQ_FILE_LIST文件置于dop/dvc/stage/<stage_name>/目录下,用于后续DVC对其对应版本的设计文件进行校验,此文件格式如下: …其中每一行表示一个设计文件类型的检查规则,以下为其语法规则说明:
    • <design_file_item>:逻辑名称,用于标识一类设计文件,如 VERILOG_FILESYMBOL_TABLE
    • <operator>
      • +=必要项,必须至少存在一个文件符合任一表达式;
      • *=可选项,目录中可以没有,但若有文件存在,则必须符合任一表达式。
    • <expression>:使用 /.../ 包裹的正则表达式,用于匹配文件路径。
    其示例如下:# 注释与空行将被忽略
    VERILOG_FILE   += /.*\.v/ /.*\.gv/
    VERILOG_TOP     *= /.*_top\.v/
    SYMBOL_TABLE   += /.*\.tbl/run_flow_checkin脚本为将此流程中产生的设计数据以及报告checkin到DVC之中,主要依赖于dvc local creat以及dvc local put这两个dvc命令,先通过dvc local creat在DVC中创建出DVC_DST这一层目录,再通过dvc local put这一命令将目标文件checkin到DVC中,此脚本可参考以下示例做法:#!/usr/bin/tclsh
    source ../.dfa/dfd.tcl
    source ../.dfa/ticket.tcl

    exec dvc local create $DVC_DST
    exec dvc local put $DVC_DST dqi_rpt.json

    exit 0注意事项
    • 该脚本需要先后source dfd.tcl和ticket.tcl这两份tcl文档传递流程的参数
    • 若使用此模板,即需更改26行的local put后的参数,改为STG_REQ_FILE_LIST清单中所定义的文件即可
  8. 建立test case并通过QA

6.2 层次化流程(Hierarchical Flow)开发

Hierarchical flow开发需要额外在Definition文件中定义依赖关系的配置:

在Definition文件中定义子流程实例及其输入输出依赖,Sub-flow instance的相依关系是根据sub-flow的input file与其他sub-flow的output file的关系来做判断依据。DFA System会依据这个关系来决定sub-flow instance的先后执行顺序并描述在Makefile里:

STEP step_name step_id
> step-input = $input_file
< step_output = $output_file
+ param_name = $param_value
;
SUBFLOW flow_name flow_id
> step-input = $input_file
< step_output = $output_file
+ param_name = $param_value
;

6.3 动态流程(Dynamic Flow)

前面介绍的single flow与hierarchical flow都是pre-defined的,当flow规模不定的时候,Flow开发就需要写程序来产生definition文件与ticket,以MMMC flow为例子,用户需要把Flow/etc/5M0_MMMC_non_criticalSI/timing_view.yaml.sample拷贝到自己的工作目录下,在其内指定所需做STA的 Lib corner, RC corner, Constraint Mode等等之后再执行以下命令,产生Definition文件以及ticket文件:

gen_5M0_MMMC_non_criticalSI.py ./timing_view.yaml.sample 

7. 故障处理与维护

DFA 在以下阶段会有报错,以下为对应阶段报错原因以及处理

7.1票据展开阶段:

报错原因:如果票据文件中的参数填写错误,可能会导致票据展开失败。

报错处理:检查票据文件中的参数是否正确填写,确保所有必填参数都已填写,并且格式正确。查看 DFA 生成的日志文件,定位具体的报错信息。

7.2预检查阶段 :

报错原因:输入文档或参数验证失败。

报错处理:检查输入文档是否完整且格式正确,确保所有参数都符合预定义的要求。查看日志文件中的具体报错信息,进行相应的调整。

7.3主流程阶段 :

报错原因:EDA 工具执行失败。

报错处理:检查 EDA 工具的设置文件是否正确生成,确保 EDA 工具的执行环境配置正确。查看 EDA 工具的日志文件,定位具体的报错信息。

7.4后检查阶段 :

报错原因:EDA 工具的结果验证失败。

报错处理:检查 EDA 工具的输出文件是否完整且格式正确,确保所有关键指标都符合预期。查看日志文件中的具体报错信息,进行相应的调整。

7.5生成 DQI 报告阶段 :

报错原因:DQI 报告生成失败。

报错处理:检查 EDA 工具的结果文件是否完整且格式正确,确保 DQI 报告生成脚本配置正确。查看日志文件中的具体报错信息,进行相应的调整。


8. 案例分析与实战演练

8.1 build ticket案例:

使用dop ticket checkout T510_RCXT.ticket将ticket checkout到本地工作目录,修改ticket内容

[HEADER]
## DESCRIPTION : flow name & run directory
## ARGUMENT   : < flow_name:run_dir_name >, ex. 510_RCX:rcxt_spef
FLOW_ID = 510-RCX:rcxt

## DESCRIPTION : techlib confilg file from TLM
## ARGUMENT   : < techlib config file name >, ex.dfalib.cfg
TECHLIB = dfalib.cfg

## DESCRIPTION : source path from DVC
## ARGUMENT   : < source path >, ex.phase/block/stage/v1
DVC_SRC = phase/block/stage/v1

## DESCRIPTION : destination path from DVC
## ARGUMENT   : < destination path >, ex.phase/block/stage/v2
DVC_DST = phase/block/stage/v2

## DESCRIPTION : top module name
## ARGUMENT   : < top module name >, ex.design
DESIGN = design


[INPUT]

## DESCRIPTION : input file of this flow
## ARGUMENT   : < path | file_name >, ex. netlist.v
TOP_DEF_FILE = design.full_chip.def.gz
METAL_FILL_GDS_FILE = design_Dummy_BE.gds


[OUTPUT]

## DESCRIPTION : output file of this flow
## ARGUMENT   : < output file_name >, ex. netlist.v
COUPLING_REPORT_FILE = couplingreport.rep
NETLIST_FILE =${DESIGN}.spef.gz


[PARAMETER]

## DESCRIPTION : PARAMETER of this flow
## ARGUMENT   : < path | parameter >, ex. Typ_85c
MAPPING_FILE = /path/to/layers.map
CORNERS_FILE = ./script/corners.smc
GDS_LAYER_MAP_FILE = ./script/dummy_gds.map
SELECTED_CORNERS =Typ_85c

## DESCRIPTION : Script path of EDA tool
## ARGUMENT   : <eda_tool_path_script>, ex. encounter
TOOL = synopsys_starrc_shell_U

## DESCRIPTION : Set tool option
## ARGUMENT   : <eda_tool_options> ex. tool version, ...
TOOL_OPTION = -2022.12-SP5-2

## DESCRIPTION : Specify queue name
## ARGUMENT   : [Local | BE | FE ]
## if QUEUE = Local, only run job in local machine
QUEUE = BE

## DESCRIPTION: Set queue option
## ARGMENT   : <queue_options>   #ex. slurm's options
QUEUE_OPTION = --mem=64G -c 4

修改完ticket后执行以下命令,建立flow环境

dop ticket build T510_RCXT.ticket

建立出如下的目录结构:

rcxt/
├── .design -> $DVC_HOME/P1-trial/CPU/500-TIMING/2025_0101_RCX
├── .script -> DFA/flow/500-TIMING
├── .techlib -> $TLM_HOME/20250101.cfg
├── .inpTOP_DEF_FILE -> .design/design.full_chip.def.gz
├── .inpMETAL_FILL_GDS_FILE -> .design/design_Dummy_BE.gds
├── .outNETLIST_FILE -> ::main/design.spef.gz
├── .outCOUPLING_REPORT_FILE -> ::main/couplingreport.rep
└── ::main
  ├── design.full_chip.def.gz -> ../.inpTOP_DEF_FILE
  ├── design_Dummy_BE.gds -> ../.inpMETAL_FILL_GDS_FILE
  ├── script -> ../.script/510-RCXT
  └── Makefile -> script/Makefile

进入::main目录,执行以下命令开始运行EDA工作:

make run

确认无误后将流程所产生的设计数据以及抽取的重要设计资料上传至DVC的设计资料库中心

make checkin

8.2 Flow 开发案例:

在DFA中心资料库的flow目录下创建目录

flow/
└── 500-TIMING
  └── 510-RCXT

在flow目录下准备.dfd文件,run_precheck,run_exec,run_postcheck,run_flow_checkin,dqi_ext.spec/run_execdqi脚本

flow/
└── 500-TIMING
  └── 510_RCXT
  ├──510_RCXT.dfd
  ├──run_precheck
  ├──run_exec
  ├──run_postcheck
  ├──run_flow_checkin
  ├──run_flowclean
  └──dqi_ext.spec/run_execdqi

在dqi_def目录下准备.dqi文件

dqi_def/
└── 500-TIMING
  └── 510_RCXT
  ├──RCX_001.dqi
  ├──RCX_002.dqi
  ├──RCX_003.dqi
  ├──RCX_004.dqi
  └──RCX_005.dqi

在DFA中心资料库的ticket目录下准备ticket文件

ticket/
└── T510_RCXT.sft

trial run能正常运行后再通过QA即可将此flow上传至git


9. 附录

9.1 命令速查表

功能命令
查看DFA中心资料库可用ticketdop ticket query
将DFA中心资料库中的ticket checkout到本地dop ticket checkout <ticket file name>
构建EDA工作环境dop ticket build <ticket file name>
执行EDA工作make run
将修改过的Ticket文档以及长处的重要设计资料上传至DVC的设计资料库中心make checkin