☰
tsmc18rf工艺库在Cadence Virtuoso中安装配置全攻略
2026/10/5 8:57:52 网站建设 项目流程

先说个很多新手都容易撞上的场景:你把 tsmc18rf 工艺库压缩包拷到 Linux 机器里,解压一看,几十个文件夹和文件,名字又长又像,cds.lib、display.drf、tsmc18rf.tf、models、calibre……当下就懵了。好一点的情况是网上搜到一段 cds.lib 写法,填进去还是打不开;差一点的情况是 Virtuoso 里库列表全是灰的,或者 DRC/LVS 菜单根本没加载出来。这些话听着很耳熟吧?这篇东西就把 tsmc18rf 工艺库安装这件事从头到尾讲清楚,包括每个文件是干什么的、为什么要那样配置、报错之后按什么顺序排查,以及我这些年踩过之后觉得最值得写下来的几个坑。

需要先说清楚,tsmc18rf 是 0.18um RF CMOS 工艺的 PDK,主要用在 Cadence Virtuoso 环境下做射频/模拟电路设计,也会有部分人在 ADS 里用到它的模型。安装它本身不复杂,但流程里的细节非常多,而且很多问题跟硬件无关,纯粹是文件路径、库格式、显示资源这些基础配置没对齐。下面按实际操作的顺序来。

1. 拿到 PDK 后先不要急着解压:环境和文件清单确认

1.1 tsmc18rf 压缩包里通常有哪些内容

tsmc18rf 的发行包常见命名是tsmc18rf_xxx.tar.gz或tsmc18rf_xxx.zip,不同版本、不同渠道拿到的包内容会有一点差异,但核心目录基本一致。解压之后一般会看到这些:

目录/文件用途
cds.libCadence 库路径定义文件,声明了库名到目录的映射
tsmc18rf.tfTechnology File,版图层次、layer number、电学规则都靠它
display.drf显示资源文件,决定版图里每一层用什么颜色、线型、填充图案
layers.mapGDSII 导入/导出时用的图层映射表
cdslib/或cdslib/里面放着 tsmc18rf、tsmc18rfAnalog、tsmc18rf_RF 等可加载的设计库
models/仿真模型,通常再分 spectre、hspice、ads 几个子目录
calibre/Calibre 规则文件,DRC/LVS/PEX 相关
skill/或tsmc18rf.ilPcell 和菜单用的 Skill 脚本
docs/工艺文档、模型说明、安装说明

你不需要全部看懂,但至少要能在里面找到两个东西:一是tsmc18rf.tf,二是包含tsmc18rf目录的库文件夹。后续配置都是围绕这两个核心展开的。

不同发行包的库名可能略有不同,比如有的叫tsmc18rfDig_6M,有的叫tsmc18rfDig_6M_4X,还有tsmc18rf_RF、tsmc18rf_RF2这种区分。不要死记名字,安装的时候要以你实际解压出来的目录名为准。

1.2 检查 Cadence 工具版本与库格式

很多人在这一步跳过去,直接配 cds.lib,结果库列表里全是灰色,或者提示 “Unable to open technology library”,回过来查半天,其实根子在库格式上。

tsmc18rf 是个老资历 PDK,最早的版本面向 IC5141、IC610 这一代工具设计,库格式可能是 CDBA,也可能是 OpenAccess(OA)。在 IC6.1.8、IC23.1 这些较新的 Virtuoso 里,默认启动模式是 OA,如果库本身是 CDBA,就需要用virtuoso -cdba方式启动,或者在 OA 模式下先做库格式转换。

启动 Virtuoso 之前,可以在终端确认一下版本:

which virtuoso virtuoso -version

如果是老版本指令icfb,对应的启动命令可能是:

icfb -cdba

新版本 Cadence 通常已经移到virtuoso指令下,启动参数大同小异。检查库格式可以直接看压缩包里有没有oa开头的目录或.cdslib标记。更直接的办法是解压后看cdslib/tsmc18rf目录下有没有tech.db这种 OA 文件,如果有说明是 OA 库;如果是一堆cell、layer目录且没有 OA 标记,大多就是 CDBA。

这步不确认,后边会反复踩坑。我自己装过不下五次 tsmc18rf,至少两次卡在这个库格式问题上,所以多说一句:启动 Virtuoso 时的库模式必须和 PDK 库格式匹配,否则加载阶段就断了。

1.3 安装目录规划的三条原则

安装目录的选择直接关系到后续几个月、几年里会不会频繁出问题。总结三条原则:

  1. 路径不要有中文、不要有空格。很多学生用户 home 目录是/home/张三,Virtuoso 这种老牌 EDA 工具对非 ASCII 路径支持很差,可能在加载 Pcell 时莫名失败。建议统一放到类似/data/EDA/PDK/tsmc18rf这种纯英文路径下。
  2. 固定在一个所有设计项目都能访问的位置。不要解压到某个临时目录,也不要跟着某个项目走。PDK 是基础设施,不是项目资源。
  3. 如果多人共用,处理好权限。建议解压后统一chmod -R 755,保证其他成员可读可执行。如果之后还要跑 Calibre 这类外部工具,要确保工具有权限读取规则文件。

规划完目录,才开始正式安装。

2. 正式安装:解压、放置、注册库定义

2.1 解压并固定安装路径

这里给出一个我习惯用的标准步骤,假设你拿到的压缩包叫tsmc18rf_PDK.tar.gz,最终安装目录是/data/EDA/PDK/tsmc18rf。

mkdir -p /data/EDA/PDK cp tsmc18rf_PDK.tar.gz /data/EDA/PDK/ cd /data/EDA/PDK tar -xzvf tsmc18rf_PDK.tar.gz ls -l

如果是 zip 格式,就用:

unzip tsmc18rf_PDK.zip -d /data/EDA/PDK/

解压之后,先把权限处理一下:

chmod -R 755 /data/EDA/PDK/tsmc18rf

这里解释一下为什么要chmod -R 755:PDK 里有很多 Skill 脚本、模型文件、规则文件,Virtuoso 进程需要读它们,Calibre 需要执行某些脚本。755 表示文件所有者可读写执行,同组和其他用户可读执行,既满足共享需求,又不会让所有人都能改你的 PDK。如果你用 root 解压过,记得用chown -R 你的用户名:你的组把属主改回来,否则普通用户启动 Virtuoso 会碰到权限报错。

这一步完成之后,可以先用tree或者find快速看一下实际目录结构,记下几个关键路径:

  • 工艺文件路径(通常叫tsmc18rf.tf)
  • 库目录路径(通常是cdslib/tsmc18rf)
  • 模型文件路径(可能在models/spectre/下)
  • Skill 脚本路径(通常叫tsmc18rf.il,有时候是skill/目录)

2.2 在 cds.lib 里写入库定义(可直接复制)

Cadence 不认识系统里自动安装的 PDK,它只认cds.lib里定义的库名和路径。每个 Virtuoso 工程目录下都需要有一个cds.lib,启动时被读取并加载。如果你在某个目录下启动 Virtuoso,它首先在当前目录找cds.lib,找不到就找用户 home 下的~/.cdsinit(这是后话),再找不到就只剩自带库。

把下面的内容手动写进你自己的cds.lib,注意路径改成你实际的:

DEFINE tsmc18rf /data/EDA/PDK/tsmc18rf/cdslib/tsmc18rf DEFINE tsmc18rfAnalog /data/EDA/PDK/tsmc18rf/cdslib/tsmc18rfAnalog DEFINE tsmc18rfDig_6M /data/EDA/PDK/tsmc18rf/cdslib/tsmc18rfDig_6M DEFINE tsmc18rf_RF /data/EDA/PDK/tsmc18rf/cdslib/tsmc18rf_RF DEFINE tsmc18rf_RF2 /data/EDA/PDK/tsmc18rf/cdslib/tsmc18rf_RF2

如果发行包里自带cds.lib,也可以直接用INCLUDE:

INCLUDE /data/EDA/PDK/tsmc18rf/cds.lib

但我要提醒你,很多版本的 PDK 自带cds.lib内部写的是DEFINE tsmc18rf ./cdslib/tsmc18rf这种相对路径。这种相对路径只有在当前工作目录恰好是 PDK 根目录时才有效,一旦你在项目目录启动 Virtuoso,就全废了。所以我的建议是:优先用手动DEFINE绝对路径,不要过度依赖INCLUDE。

另外,DEFINE后面跟的库名要和 Library Manager 里显示的名字一致,大小写也要一致。Linux 区分大小写,tsmc18rf和Tsmc18rf是两个完全不同的名字,报错时最容易忽略的就是这里。

写完cds.lib后再检查一件事:确保里面对应的目录真实存在。可以用:

ls /data/EDA/PDK/tsmc18rf/cdslib/

如果你的版本里目录名不同,比如多了个tsmc18rf_RF3,就一并加上。

2.3 启动 Virtuoso 并确认库能打开

准备工作做完,进入你的工程目录,启动:

cd /data/EDA/work virtuoso &

如果前面判断出库是 CDBA 格式,而你的工具是 IC6 以上版本,启动时加上-cdba:

virtuoso -cdba &

启动后,CIW(Command Interpreter Window)会刷一堆日志,正常情况下能看到类似:

Loading tsmc18rf.cxt tsmc18rf menu loaded

接着打开 Library Manager,如果cds.lib写对了,应该能看到tsmc18rf、tsmc18rfAnalog等库。可以双击展开一个库,比如打开tsmc18rfAnalog里的nmos_rfcell,如果能弹出 cellview,说明最基本的库注册成功了。

到这里只完成了 60%,剩下的显示文件、仿真模型、Skill 菜单配置如果没做,版图和仿真依然会出问题。继续往下看。

3. 显示文件和其他 PDK 资源的加载:版图工具才不闹脾气

3.1 display.drf 与 tf 文件的关系

很多刚接触版图的人分不清tsmc18rf.tf和display.drf,以为两个文件都是“图层配置”,其实分工完全不同。

tsmc18rf.tf是 Technology File,定义的是版图工具底层的工艺信息:layer number、purpose pair、电学规则、via 定义、设计规则约束等。它决定你这个库能画哪些层、这些层之间有什么关系。display.drf是显示资源文件,决定的是视觉呈现:每一层用什么颜色、线型、填充图案、是否可被选中。

只加载 tf 不加载 display.drf,最典型的表现是版图编辑器能打开,但所有图层看起来都一样,或者很多层是灰的、不可选择的,画一个矩形甚至分不清画在哪一层。所以安装 PDK 时,这两个文件必须配套加载。

在 Virtuoso 里,图层显示并不是全局自动生效的。如果你启动后发现版图里 layer 全是默认的青色方块,那大概率就是 display.drf 没有自动加载。

3.2 通过 .cdsinit 与环境变量自动加载

最省事也最稳定的方案,是在用户 home 目录或工程目录下维护一个.cdsinit文件,启动 Virtuoso 时它会自动执行。在.cdsinit里加上 display.drf 的加载语句:

load("/data/EDA/PDK/tsmc18rf/display.drf")

这样每次启动 Virtuoso,CIW 日志里会出现类似:

Loading display resource file /data/EDA/PDK/tsmc18rf/display.drf

如果你不想用.cdsinit,也可以把display.drf复制到启动 Virtuoso 的工作目录。Cadence 默认会读取当前目录下的display.drf,但我不推荐这个方式:多项目切换时每个目录都放一份,后面 PDK 升级了你得挨个项目替换,极易出现新旧显示文件混乱。

另一个容易混淆的点是DISPLAY环境变量。在 Linux 里DISPLAY通常指向 X Server,例如:0.0,它跟版图显示文件没有直接关系。所以网上有些帖子说“设置 DISPLAY 环境变量指向 display.drf”,这种说法会误导人,至少不能让它覆盖原有的 X 显示配置。

正确的自动加载方式就是.cdsinit里的load,或者使用envSetVal把 layout 显示的默认文件指定好:

envSetVal("layout" "display" 'string "/data/EDA/PDK/tsmc18rf/display.drf")

两种方法都可以,我通常会把load和envSetVal同时写上,双保险。注意.cdsinit里如果已经加载了别的工艺库 display 文件,后加载的会覆盖先加载的同名 layer 设置,所以多个 PDK 并存时要留意顺序。

加载完成后,你可以打开一个版图 cellview,按E进入 display options,随便点几个 layer 看看颜色和 fill pattern 是否分得开。如果还是全长得差不多,就在 CIW 里手动执行一次:

load("/data/EDA/PDK/tsmc18rf/display.drf")

然后选择需要更新的图层,基本就能恢复正常。

3.3 layers.map 在 GDS 导入导出里的作用

layers.map是另一个容易被人忽略的文件。它的作用是把 GDSII 文件里的层号和 Virtuoso 里的层名对应起来。比如流片时掩膜厂给的 GDS 里layer 31是 M1,而 Virtuoso 里 M1 的 layer number 也是 31,但有时候因为不同 PDK 定义不同,GDS 导入后图层会错位,M1 变成 M2,或者 via 跑到 metall 上去了。

layers.map通常在启动 Virtuoso 后,执行File -> Import -> GDS时,在 Layer Map 那一栏选择。也有一些版本支持在.cdsinit里预先设置。如果只是画版图和做 LVS,这个文件不紧急;但如果你要从外部拿 GDS 进来做比对,或者自己导 GDS 给加工厂,一定要确认它被正确指定。常见的做法是把 PDK 里的layers.map作为模板,再按项目需要微调。

4. 仿真模型文件配置:不止是要把路径填进去

4.1 模型文件分布在 models 目录下的规律

库能打开只是第一步,真正跑仿真时,你还会遇到“找不到模型”的报错。原因往往出在模型文件没加载或者 section 选错。

tsmc18rf 的模型文件一般放在models/spectre/、models/hspice/、models/ads/这些子目录里,文件名带工艺角信息,常见的是:

  • crn18rf_3v3_6lm.scs或.pm:Spectre 格式模型
  • crn18rf_3v3_6lm.lib:HSpice 格式模型库
  • 个别版本还带.ahdl文件用于某些射频器件

.scs和.lib这类文件里通常用.section或.lib定义多个工艺角(corner),比如typical、ss、ff。安装时不要只把整个文件路径填进去,还得把 section 名选对,否则你会得到一组默认值或直接报模型不存在。

可以先看一下模型文件里定义了哪些 section:

grep -i "section" /data/EDA/PDK/tsmc18rf/models/spectre/crn18rf_3v3_6lm.scs

以实际版本输出的 section 名为准,不同发行包差异很大。

4.2 Spectre 仿真器下 Model Library 的正确写法

在 Virtuoso 的 ADE L / ADE XL / ADE Explorer 中,添加模型库的路径是固定的:

Setup -> Model Libraries

弹出的表格里通常有两列需要填:Model File 的绝对路径和 Section。以我常见的一个配置为例:

Model File: /data/EDA/PDK/tsmc18rf/models/spectre/crn18rf_3v3_6lm.scs Section: typical_3v3

填完后直接跑一遍 DC 仿真,如果模型正常加载,netlist 里会自动生成类似:

simulator lang=spectre include "/data/EDA/PDK/tsmc18rf/models/spectre/crn18rf_3v3_6lm.scs"

如果你不想通过界面操作,也可以在 netlist 里手动加这段include。不过手动加的时候要注意:spectre 的include路径必须用绝对路径,且不要出现空格。之前有个朋友把 PDK 放在/Users/xxx/My PDK/...里,spectre 每次都在路径带空格那儿卡死,最后把目录改名才解决。

另外,如果库名里带了RF后缀,比如你在 schematic 里用的是tsmc18rf_RF库里的器件,那么对应的射频模型也要加载。有些人只加载了普通 MOS 模型,结果电感、变压器这些器件在仿真里没有任何模型定义,输出结果自然是不对的。检查方法是在 ADE 的 Simulation -> Netlist 里看看生成的网表,确认 RF 器件对应的include文件是否都在。

4.3 在 HSpice/ADS 环境里引用模型的补充说明

部分人会把它用在 HSpice 或 ADS 里。HSpice 的模型库引用方式比较传统,网表顶部加:

.lib '/data/EDA/PDK/tsmc18rf/models/hspice/crn18rf_3v3_6lm.lib' tt

这里tt是工艺角名,具体叫什么要以文件里的.lib行定义为准。HSpice 对路径同样敏感,建议用加引号的绝对路径。

ADS 的用法会麻烦一点,因为 ADS 本身不是基于 Cadence 的 PDK 体系,tsmc18rf 的模型在 ADS 里要用的话,通常是在 Schematic 里用类似pspice或spectre的模型组件,或者直接导入模型文件到 Workspace。这个流程不同 ADS 版本差异较大,如果你主要用 Cadence,可以先跳过这块;如果你就是要在 ADS 里用,建议重点查一下模型文件里有没有ads子目录,有的话优先用那个目录下的版本,而不是拿 Cadence 的.scs硬套,函数支持和参数映射都会有差别。

5. 安装过程中最常见的报错和逐条排查链路

5.1 库是灰的/打不开:分类检查 cds.lib

遇到最多的问题就是 Library Manager 里tsmc18rf库是灰色的,点开没有 cell,或者报 “The library 'tsmc18rf' does not exist in the library search path”。先别急着怀疑压缩包坏了,绝大多数是路径问题。

按这个顺序排查:

  1. 确认cds.lib里DEFINE的库名和你 Library Manager 里看到的库名完全一致,包括大小写。
  2. 确认DEFINE后面的路径是绝对路径,且目录真实存在。用ls验证,不要相信压缩包里的提示。
  3. 确认你启动 Virtuoso 时所在的目录,确实读到了这份cds.lib。CIW 窗口底部会显示Loading cds.lib file ...的路径,看一下是不是你想的那份。
  4. 确认目录权限。执行ls -l /data/EDA/PDK/tsmc18rf/cdslib/看用户能否进入目录。

如果库图标是灰色的但能展开,那更可能是库格式或 Pcell 加载问题。右键库 -> Properties,看看库类型是不是cdb。如果是,而在 IC6 的 OA 模式下打不开,回到启动命令加-cdba,或者做 OA 转换。这里不推荐立刻做转换,因为 tsmc18rf 的某些老 Pcell 在转换后可能出现参数框错乱,先用-cdba启动最简单。

5.2 Skill 脚本报错或菜单不出现:版本兼容性

有的 PDK 解压后,库能打开,但 Virtuoso 菜单栏里没有出现 tsmc18rf 相关的菜单,或者打开 Pcell 时提示:

*Error* load: can't access file "/data/EDA/PDK/tsmc18rf/skill/tsmc18rf.il"

这种情况十有八九是.cdsinit里没有加载 Skill 脚本。tsmc18rf 的菜单、部分 Pcell 回调函数都写在 Skill 脚本里,没有加载这些脚本,库里的 cell 能显示但行为不完整。

在.cdsinit里补上:

load("/data/EDA/PDK/tsmc18rf/tsmc18rf.il")

如果发行包的 Skill 脚本在子目录,比如skill/tsmc18rf.il,就把路径写成对应的。

还有一类情况是 IC 版本太新,老 PDK 的 Skill 脚本有不兼容调用了。报错可能是一堆*Error* undefined function。这种要具体看报错信息,优先检查是否有针对新版 Cadence 的补丁脚本。如果找不到,一个无奈但有效的方案是用虚拟机装一个旧版 Cadence 来跑这套 PDK,这也是为什么很多学校实验室里 IC6.1.8 还在一线服役的原因。

5.3 启动时报 Cannot open display resource file

CIW 启动日志里出现:

WARNING: Cannot open display resource file "/users/xxx/display.drf"

这个警告说明 Virtuoso 没能在当前工作目录找到 display 文件,或者显示环境配置指向了不存在的路径。它不会让 Virtuoso 崩溃,但会让你的版图体验很差。

解决方法就是在.cdsinit里用绝对路径加载 PDK 自己的display.drf,或者把display.drf软链接到你的类库目录:

ln -s /data/EDA/PDK/tsmc18rf/display.drf /data/EDA/work/display.drf

软链接比复制好维护。以后再更新 PDK,只要指向不变,新内容会自动生效。

5.4 仿真提示 model 未定义

仿真报错类型很多,比如 Spectre 提示:

ERROR (SFE-23): The model 'n18' is not defined in the model file.

或者:

WARNING (SPECTRE-16922): The model 'n_rf' does not exist in the model file.

先别急着怀疑 PDK 坏了,按这个思路检查:

  1. Model Library 里添加的路径是否正确,尤其是文件名后缀。有的版本是.scs,有的版本把.scs和.pm混着放,填错了文件自然找不到模型。
  2. Section 是否选对。很多网表里模型名是n18,但只有typicalsection 下才定义它,如果你的 section 写成了ss,模型定义名可能变成了n18_ss之类,自然找不到。
  3. 确认你要用的器件到底属于哪个库。tsmc18rfAnalog和tsmc18rf_RF下同名的器件可能对应不同的模型,比如普通 MOS 和 RF MOS,它们的模型名和加载路径都不一样。

排查时可以打开模型文件直接搜索:

grep -n "^subckt n18" /data/EDA/PDK/tsmc18rf/models/spectre/crn18rf_3v3_6lm.scs grep -n "n18" /data/EDA/PDK/tsmc18rf/models/spectre/crn18rf_3v3_6lm.scs | head -20

看到真实的模型定义名,再跟刚才报错提示里的名字对比,基本就能定位。

6. 安装完成后的收尾与多项目使用技巧

6.1 把常用设置写进 .cdsinit 和 .bashrc

安装成功不是终点,而是起点。我见过太多人装完当天能打开库,第二天换个终端、换个工程又起不来了。原因就是所有配置只在“当时那个终端”或“当时那个目录”生效,没有固化下来。

建议在~/.cdsinit里把以下东西固定住:

let(( ) load("/data/EDA/PDK/tsmc18rf/tsmc18rf.il") load("/data/EDA/PDK/tsmc18rf/display.drf") )

再把启动流程写进~/.bashrc:

alias cds18='/opt/cadence/IC6.1.8/tools/bin/virtuoso -cdba' export PDK_ROOT=/data/EDA/PDK/tsmc18rf

以后每次进 Virtuoso 直接敲cds18,在当前目录生成或者在工程目录里维护一份cds.lib,不需要每次手动输一大串启动参数。这种“一条命令进入设计环境”的习惯,在多项目并发时尤其省事。

6.2 多版本工艺库共存时的管理方法

很多设计环境里不止一套 PDK。有的项目用 tsmc18rf,有的项目用 tsmc180,还有 65nm、40nm 的库。如果所有这些库都写进同一个全局cds.lib,很容易出现同名冲突。比如两套 PDK 都定义了一个叫analogLib的库名,后加载的会把先加载的顶掉,最终 Library Manager 里只显示其中一个,甚至两个都异常。

我的做法是:每个项目目录维护各自的cds.lib,不搞“一份 cds.lib 全局通吃”。项目需要哪套 PDK,就在该项目的cds.lib里DEFINE那几套库。这样不会互相污染,也好管理。

如果确实需要在一个环境里同时用多套 PDK,那就用INCLUDE把各自的 cds.lib 引进来,并且注意:

  • 不要重复DEFINE同一个库名
  • 不同 PDK 的 technology file 如果都叫tsmc18rf.tf,在同一个 Virtuoso session 里可能冲突,尽量每个项目单独启动

多个 PDK 同时加载还有一个严重隐患:display.drf会互相覆盖。A 库的 display 文件在后加载,可能把 B 库的图层显示全部改成 A 的风格,最终 B 库的版图看起来一团糟。所以多 PDK 环境下,显示文件也要按库分开管理,使用.cdsinit里按项目切换,或者干脆每个工艺库配套独立的.cdsinit模板。

6.3 验证安装成功的最小测试流程

装完之后不要急着画正式电路,我习惯先跑一个“最小测试”把各个模块都验证一遍,不然等到关键节点才发现 Pcell 参数框是空的,那才叫头疼。

最小测试建议做三步:

  1. 库和 Pcell 验证:在 Library Manager 打开tsmc18rfAnalog,新建一个 schematic cellview,拉一个nmos_rf和一个res进去。双击器件,如果参数框正常弹出,说明 Skill 脚本和 Pcell 回调加载成功。

  2. 版图和显示验证:打开一个 layout cellview,随便画一个 M1 矩形,按shift+f放大看颜色和填充,确认 M1、M2、POLY、NWELL 这些 layer 都能明显区分。再用Create -> Via打一个 via,如果 via 定义齐全,说明 technology file 加载正确。

  3. 仿真验证:在 schematic 里搭一个最简单的 MOS 二极管接法,跑 DC 仿真,确保模型能正常加载,MOS 管工作在预计的饱和区。如果 DC 结果为零或者报 model 未定义,立刻回到第四步检查模型路径。

这三个测试不花多少时间,但能把安装流程中最大的三个坑——库注册、显示文件、仿真模型——全部覆盖到。我个人的习惯是在做完这三步之后,把启动命令、cds.lib和.cdsinit一起备份到项目文档里,下次换电脑、换服务器,照着这份记录十分钟就能把环境重新搭起来。安装 tsmc18rf 这件事本身不难,难的是让它在你的工作流里稳定工作,而稳定工作的前提就是这些平时不起眼的细节都落在实处。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询