手动配置太麻烦?教你用 PDK 初始化文件自动加载!

修改PDK初始化SKILL脚本文件,来实现自动加载「LVS验证的 include File」、「Spectre模型文件」和「Layout EAD工具的参数配置文件」。

兔二思
兔二思
技术博主

距离上次写环境配置的系列文章已经好久啦…

最近空闲了些,打算把剩下的几篇都补上✍️

系列文章目录:

  1. 修改 CIW & Library Manager 默认窗口大小
  2. 修改 Layout & Schematic 默认窗口大小
  3. 调整字体大小
  4. 修正大字体导致表单文本重叠的问题
  5. CIW 窗口集成 oaScan 菜单
  6. 设置日志文件的保存位置
  7. 调整窗口标题栏的显示样式
  8. 设置 Palette(LSW) 面板显示样式
  9. 自定义 CellView 的启动偏好
  10. PDK 初始化设置( libInitCustomExit.il ) - 本篇
    • LVS 验证时自动 include file
    • 自动加载 Layout EAD 的配置文件
    • 自动加载 Spectre 模型文件
  11. 项目的初始化设置
  12. 特定工具 - Library Manager( cdsLibMgr.il )
  13. 特定工具 - Layout L / XL
  14. 特定工具 - Layout EAD

这次的环境变量配置实例重点围绕 PDK(工艺设计套件)展开,主要涉及libInit.illibInitCustomExit.il 这两份 SKILL 脚本文件。

1️⃣ libInit.il是什么?

这是 PDK 的初始化文件,通常位于 PDK 的根目录下。每当你在 Virtuoso 里首次打开一个库,系统就会自动加载这个文件,帮你搭建好 PDK 所需的运行环境。这个过程涵盖了「加载 PCell 编译文件」、「PDK 专用环境配置文件 .cdsenv 的设置」以及「初始化图层显示文件 display.drf 」等操作。

2️⃣ libInitCustomExit.il 又是干嘛的?

简单来说,它和 libInit.il 是“搭档“关系,也在同一目录中。它会在 libInit.il 执行过程中被调用,主要负责一些定制化的配置操作。比如设置仿真模型路径,添加自定义菜单、挂载一些实用的小工具等等,更多是“锦上添花”的功能。

( 首次访问工艺库时,CIW 窗口的输出内容展示)

🏷️这两份文件通常由厂商通过 Cadence 的 PAS 开发工具自动生成,但具体怎么用,不同厂家的实现方式有所不同。比如有的 PDK 只提供一个 libInit.il,所有功能都塞在里面,没有单独的 libInitCustomExit.il。所以,如果我们有一些 PDK 相关的个性化需求,可以根据实际情况修改这两个文件中的任意一个。

下面分享几个我在实际工作中常用的配置示例,希望对你有启发~

实现 LVS 验证时自动 include file

我之前在《如何解决”LVS验证时Source端网表未定义SUBCKT”的问题》一文中介绍过,设置自动加载 source.added 文件的几种方法。现在,我们可以进一步优化这个流程,把自动加载 source.added 文件的功能直接集成到 PDK 初始化文件中。这样一来,团队中的每位成员在使用此工艺进行 LVS 验证时都能自动加载文件,不用重复手动设置。

以下是实现此功能的脚本内容:

; libInitCustomExit.il: Calibre LVS to auto load source.added

let( ( libName libId libPath )
  libName = "<Tech_LibName>"
  libId = ddGetObj(libName)

  if(ddIsId(libId) then
    libPath = ddGetObjReadPath(libId)  ;;获取PDK库路径

  filePath = getShellEnvVar("calibre_source_added_place")  
  if (!filePath then
     filePath = strcat(libPath "/<Source_filePath>")
  )
 )
)

实际使用时,请把占位符替换成对应的实际值:

<Tech_LibName> 替换成你的techLib名称,如 "gpdk045"

<Source_filePath> 替换成source文件相对于PDK库的路径。如果PDK目录为”/pdk/gpdk045”,source文件位于它的上一级目录”/pdk/lvs”验证目录中,应填写成 "/../lvs/source.added"

设置Layout EAD工具从自定义路径加载配置文件

大家还记得用 Layout EAD 工具设置一堆参数的流程吗?很复杂对吧……每个用户使用都得自己折腾一遍,耗时费力不说还容易导致配置不一致。所以,有没有更好的方式,实现配置集中管理呢?当然有!现在,我们可以把配置文件存放在PDK的专用目录下,再通过PDK初始化文件实现自动加载。这样大家都能用上统一的设置,一劳永逸。

在介绍实现方法之前,我们先来回顾一下 EAD 配置文件都有哪些。

配置文件主要分为两类:与工艺相关的 <process_name>.ini 和与设置相关的 <setup_name>.ini。默认情况下,EAD 工具会在以下两个地方找这些配置文件:

  • [当前工作目录]/.cadence/dfII/EAD/1/process

  • [当前工作目录]/.cadence/dfII/EAD/1/setup

要让工具直接从 PDK 目录加载统一的配置文件,我们可以通过 layoutEAD 工具的环境变量来指向 PDK 目录。

下面附上一段 GPDK045 工艺关于 EAD 设置的参考示例:

; libInitCustomExit.il: EAD setup

let( (libId pdkPath )
 when( ( libId = ddGetObj( libName) ) 

   pdkPath = simplifyFilename( strcat( ddGetObjReadPath(libId) "/.." ) ) ;;获取PDK库路径的上级目录
   setShellEnvVar( strcat("GPDK045_PDK_PATH=" pdkPath ) ) ;;将PDK路径设置为系统环境变量

   when( isFile(strcat(pdkPath "/ead/gpdk045.ini") ) 
               printf( "\tInitializing EAD\n")
    envSetVal("layoutEAD" "useSetup" 'string "$GPDK045_PDK_PATH/ead/gpdk045.ini")
    envSetVal("layoutEAD" "useCorner" 'string "<corner_name>")
  )      
 ) 
)

✅同样在实际应用时,要将示例中的文件路径和corner名称替换成你工艺中的实际值。

自动加载Spectre模型文件

我们在使用 Virtuoso ADE 进行电路仿真时,首要步骤之一就是确认 Model Library 中的工艺角(Corner)配置是否正确。对于一些成熟的 PDK,这通常不是问题——模型文件路径、section 定义、默认加载脚本等都已预设好,“开箱”即用。但现实是,遇到“简配版”PDK的情况并不少见。某些 Foundry 提供的库文件中不仅缺少默认的工艺角设置,甚至连基本的模型文件路径都没定义清楚🙊。

这对于新手尤其容易踩坑——“同样是用 ADE,为什么别人家的工艺仿真直接跑,我这边却报一堆找不到模型的错?” 可能并不是你哪里没操作对,而是你拿到的那套 PDK 没替你做好自动化这一步。

在介绍自动加载之前,我们需要先理解 ADE 中是如何管理和调用工艺模型的。简单来说,能够在仿真环境中顺利切换工艺角,依赖于三个关键要素的协同:

✅模型描述文件(.scs)

✅工艺角 section 的定义

✅PDK 初始化脚本的加载机制

先说模型文件的结构,大多数 PDK 会采用以下方式来组织这些文件:

  1. 先按器件类型(如MOS、BJT、Diode)划分模型文件,比如 bjt.scsmos.scs 等;

  2. 再用一个顶层模型文件整合这些器件模型,通过多个 section 来分别对应 ttffss 等工艺角。

( 模型文件结构示意 )

📌其中,模型文件主要通过 section ... endsection 语法明确划分不同的结构块。另外,不同 PDK 的模型文件的组织方式和 section 的命名没有一个统一标准,需要你根据实际工艺进行改写。

在模型和 section 都定义清楚后,再通过 PDK 初始化文件引用这一份顶层模型文件,便可在 ADE 中通过切换 section 名称轻松完成工艺角转换。

( ADE >> Model Library Setup 界面 )

我们来看一个具体的定义脚本示例:

;; libInitCustomExit.il: Set the Simulator Spectre Model Paths

if(isContextLoaded("schView") then
    envSetVal("asimenv.startup" "simulator" 'string "spectre")
    
    asiSetEnvOptionVal(asiGetTool('spectre) "modelFiles"
        list(
           list(strcat( libPath "/../models/spectre/gpdk045.scs") "tt")
        )
    )
)

✅ 还是一样,要记得替换示例中的路径和实际的section名称。


以上这些内容都可以放在工艺库的初始化文件中,这样每次加载工艺库时都会自动执行这些设置。

欢迎在评论区聊聊你对PDK配置的理解和使用经验~ 或者你踩过的坑~

🔔下篇文章分享项目相关的初始化设置:)

⋅ END ⋅