上周帮同事调一个高速连接器的信号完整性模型,卡了整整一天。CST那边跑完仿真,右键就把SPICE模型导了出来,发过来一看是个txt文件。我们这边习惯用LTspice做接入后的快速验证,第一反应是把后缀改成.cir,结果一跑满屏都是红字。折腾到下午我打开那个txt逐行看,才发现从txt到cir的路根本不是改一个后缀那么简单,中间藏着不少文件格式和语法语义的门道。
这篇内容适合谁?你在用CST Studio Suite做无源结构(连接器、滤波器、过孔、封装引线)的高频仿真,拿到了一堆SPICE模型的txt导出文件,希望在LTspice、HSPICE或PSpice里直接跑仿真,那这篇指南就是给你准备的。我会按实际处理顺序,从CST导出SPICE模型的场景讲起,再到txt文件内部结构、三种转换路线、转换后的仿真验证,最后把我踩过的五类典型报错和排查链路完整写出来,可以直接对照排查。
1. 为什么需要"txt到cir"这一步:CST导出SPICE模型的真实场景
1.1 CST什么时候会导出SPICE模型
很多刚接触CST的工程师有个误解,以为CST的SPICE模型导出是在三维微波工作室里随便点两下就完成的。实际不是。我用的比较多的是CST的Design Studio(设计工作室),也就是CST专门做电路级协同仿真的环境。你在三维模块里把结构仿真完,拿到的是S参数、场分布这些结果;如果要进一步放到电路级仿真器里和驱动芯片、端接电阻、接收机一起做协同验证,这时候才需要把无源结构的行为用SPICE模型表达出来。
常见路径是这样的:把三维仿真结果作为模块放进Design Studio的Schematic,然后在结果输出端使用SPICE等效电路提取功能,软件会对频响曲线做有理函数拟合,最终生成一个由R、L、C和受控源构成的宽带SPICE模型。这个模型默认会落到工作目录里,后缀可能是.txt、.dat,有时候也是.sp。模型覆盖的频带、极点阶数、误差阈值等等参数,在提取时都可以设置。不同版本CST的菜单入口略有差异,但思路统一:把频域行为变成可以在SPICE里求解的等效电路。
还有一种情况是,你手里没有现成的SPICE模型,只有一个.s2p或者其他格式的S参数文件。这时候有些人会拿第三方工具去拟合,但CST自己也能做。步骤上都是在Design Studio里加载S参数结果,再执行SPICE模型提取。这也是"从CST导出SPICE模型"最常见的工作流。
1.2 导出的txt和可仿真的cir到底差在哪
我用一张表把这两者的核心差异列出来,看完你就能理解,为什么很多同事直接改后缀会失败。
| 对比项 | CST导出的SPICE txt | 可直接运行的SPICE cir |
|---|---|---|
| 文件后缀 | .txt / .dat / .sp | .cir |
| 顶层结构 | 通常只有.SUBCKT/.ENDS子电路定义 | 必须有标题行、元件、激励源、负载、分析指令、.END |
| 是否包含.END | 多数不包含,因为它是个"模型库文件" | 仿真主文件必须包含 |
| 是否包含激励/负载 | 不包含,那是调用方的事 | 需要显式写上源和负载 |
| 注释规范 | 可能带时间戳、中文、全角符号 | 建议只用*开头ASCII注释 |
| 数值格式 | 常见1.25E-12这种指数写法 | 依赖具体仿真器,LTspice基本兼容但也要检查 |
| 节点命名 | 可能有GND、n_1、net1这类节点名 | 地节点必须是0,节点名尽量只用字母数字 |
这个表格反映了一个核心问题:CST导出的txt本质上是一个"子电路模型库文件",它描述的是这个无源结构的等效电路长什么样,但它不是一个可以直接运行的"仿真工程文件"。cir文件则应该是一份完整的、能独立求解的网表。所谓"txt到cir",就是把裸模型包装成一个带激励源、带负载、带分析指令、带结束语句的完整可执行文件。
1.3 为什么"直接改后缀"行不通
很多工程师的第一反应就是"我直接重命名成.cir不就行了吗?"表面看文件后缀变了,但SPICE类仿真器在解析时,关注的不是后缀,而是文件里的每一行指令。
举个例子,CST导出的txt通常以一堆*开头的注释行开始,然后是一个.SUBCKT声明。你把后缀改成.cir,打开 LTspice 一仿真,它发现自己找不到任何激励源,也没有负载,更别说.TRAN、.AC这些分析指令。LTspice可能会报"no analysis specified",也可能直接忽略你的子电路,因为根本没地方调用它。这不是文件坏了,而是你给仿真器喂了一个"零件库",却没告诉它要把这个零件装在哪、加多大电压、看什么波形。
另一个常见坑是隐藏字符。CST在Windows环境下导出,txt文件可能是CRLF行尾、UTF-8 BOM编码,有些版本甚至会在文件末尾带上不可见的控制字符。这些在记事本里完全看不见,但LTspice、HSPICE这类解析器是非常严格的逐行逐字符处理,一个BOM字符放在.SUBCKT前面,轻则警告,重则直接拒绝识别整个子电路。后面第5章我会专门讲这个坑。
所以在动手转换之前,必须先搞清楚CST导出的txt文件里到底写了什么。下一章我把内部结构逐行拆开讲。
2. 摸清CST导出txt的内部结构:读懂每一行网表
2.1 一段典型的CST导出SPICE文本长什么样
为了讲清楚结构,我简化了一个真实模型。实际CST导出的文件可能比这个长几十倍,规则是一致的,不会变。下面这个例子模拟的是某个两端口无源结构提取出来的宽带SPICE模型:
* CST Studio Suite SPICE Model Export * Extract Time: 2025-01-12 14:32:06 * Original project: HDMI_Connector_CST .SUBCKT HDMI_PIN1 P1 P2 0 * node P1, P2, 0 C1 P1 n_1 1.2537E-12 C2 n_1 0 1.0329E-12 R1 n_1 n_2 45.6273 L1 P2 n_2 0.8325E-9 G1 P1 0 n_2 0 2.31524E-3 .ENDS HDMI_PIN1逐行看。
第一行到第三行都是注释,以*开头。第一行会注明这是CST Studio Suite的SPICE模型导出结果,第二行是时间戳,第三行是原始项目名。这些注释对人有用,对仿真器来说直接忽略,但前提是它们必须是合法的ASCII字符。
第四行.SUBCKT HDMI_PIN1 P1 P2 0,声明了一个名为HDMI_PIN1的子电路。P1、P2是对外端口,0是全局地。这一行的最后一个节点通常就是参考地,CST导出时一般会直接写成0,但有些老版本会写成GND或者VSS,这就要人工干预。
接着是一些元件行。C1 P1 n_1 1.2537E-12表示一个1.2537皮法的电容,跨接在P1和内部节点n_1之间。R1是45.6273欧姆的电阻,L1是0.8325纳亨的电感。这些RLC元件组合起来,模拟结构的寄生效应。
G1 P1 0 n_2 0 2.31524E-3这一行是电压控制电流源。CST在拟合高频互连结构时非常依赖G元素,因为耦合、串扰、传输系数等效应用纯RLC很难精确表达,电压控制电流源可以很好地把某个节点的电压转成另一个节点上的电流。这也是CST宽带SPICE模型最核心的部分。
最后一行.ENDS HDMI_PIN1结束子电路。注意,这里没有.END,没有V1,没有.TRAN,什么都没有。这就是我说"它是个模型库文件"的原因。
2.2 数字格式、单位后缀与节点命名里的坑
CST导出txt里的数值格式,不同版本跨度很大。我见过三种:1.2537E-12、1.2537e-012、0.8325E-9。前两种LTspice都能识别,HSPICE也没问题,但如果遇到1.2537D-12这种,就要小心了。D在Fortran风格里代表双精度指数,SPICE标准不认。如果你在文件里搜到D+00、D-12这种,最好的办法是用正则把所有D统一替换成E,或者直接改写成带单位后缀的形式,比如1.2537p。
单位后缀这块,最大的坑是M。在SPICE体系里,后缀M代表毫(milli),不是兆(mega)。兆要用Meg。如果CST导出的txt里出现1M的电阻,LTspice解析出来是1毫欧不是1兆欧,量级直接差出9个数量级。后面我会专门讲这个换算导致的诡异现象。
节点命名也要检查。CST喜欢生成n_1、net_27这类内部节点名,大多数现代SPICE仿真器都支持下划线,但个别老版本解析器遇到下划线就罢工。更麻烦的是如果节点名里出现#、@这些特殊字符,LTspice在解析时可能把后面一部分吃掉。所以我处理的时候都会用正则把#@$[]这类非字母数字字符统一替换成下划线。
还有一个所有SPICE仿真器都严格遵守的规则:节点名0是全局地,在SPICE里是独一无二的,代表参考电位零点。任何连接到地的元件引脚,要么直接接0,要么通过显式的接地符号表示。CST如果导出GND这个节点名,很多仿真器会把它当成普通网络名而不是地,导致整个电路没有直流路径,后面一仿真就是奇异矩阵报错。
2.3 预处理:先把"脏文本"洗干净
我拿到CST导出的txt之后,不会马上转格式,而是先做三件预处理的事,这都是实测下来避免踩坑的关键动作。
第一,用Notepad++或者VS Code打开txt,打开"显示所有字符"功能,检查行尾符、BOM、零宽空格。一旦发现文件开头有EF BB BF这样的BOM字节,另存为UTF-8无BOM格式;如果行尾符是CRLF,按需求统一成LF。有人觉得这是洁癖,但SPICE解析器对不可见字符的容忍度极低,一个小BOM就能让.SUBCKT整体失效。
第二,用正则搜索.SUBCKT和.ENDS,检查它们是否成对出现、名字是否一致。最简单的办法是直接在编辑器里搜\.ENDS,看它在文件里的个数和位置。如果.ENDS缺失,大概率是导出时文件被截断或者复制时漏了行。
第三,把所有非ASCII字符清理掉。CST如果是在中文系统环境下导出的,注释里经常混入全角冒号、中文括号,这些字符在一些HSPICE旧版本里会直接导致解析报错。清理时注意只过滤注释行,不要动.SUBCKT后的模型名和端口名。
预处理干净之后,才能进入正式的转换环节。下面这章我给你完整列出三种转换路线,从手工到脚本,按需选择。
3. 实现txt到cir的三种实战路线
3.1 手工包一层:适合一次性修改的经典做法
如果你手头只有一个模型,又不想为了它专门维护脚本,手工转换是最直接的。操作步骤如下。
第一步,用文本编辑器打开CST导出的txt,复制里面的全部内容,新建一个.cir文件粘贴进去。第二步,确认.SUBCKT这一行是否正确,端口顺序和地节点是否符合你的仿真需求。比如我用的是LTspice,我会把.SUBCKT HDMI_PIN1 P1 P2 0保留成原样,因为后面调用子电路时,节点顺序必须和这一行一一对应。第三步,在.SUBCKT之前补上一个标题行,注意标题行不能以*开头,要直接写文字,比如HDMI_PIN1 Simulation,这是SPICE文件第一行必须存在的"标题行"。第四步,在文件末尾添加激励源、负载、分析指令和.END。
一个完整的手工转换结果长这样:
HDMI_PIN1 Simulation .include HDMI_PIN1.txt VIN IN 0 PULSE(0 1 0 50p 50p 2n 4n) R1 IN P1 50 R2 P2 0 50 X1 P1 P2 0 HDMI_PIN1 .TRAN 10p 5n .PROBE .END这里我用了.include把原始txt文件包含进来,而不是直接复制所有模型行。好处是原始txt保持不动,出错时你随时能对比。X1这一行是调用名为HDMI_PIN1的子电路,它的节点顺序P1 P2 0必须和.SUBCKT声明保持一致。R1 IN P1 50是源端50欧姆阻抗,R2 P2 0 50是负载端50欧姆,这样整个网络才有完整的信号通路和直流路径。
手工转换适合偶发需求,但要注意,手动敲控制指令时最容易漏掉的就是.END前的.PROBE或者.PRINT。没写探针语句不代表仿真器不存波形,但至少在很多SPICE变体里,你拿不到想要的那个电压节点数据。我的习惯是宁可多写一行也不省。
3.2 Python脚本批量转换:一次处理几十个模型
如果你的设计里有二十个过孔模型、八根差分线要转,手工就不现实了。这种批量场景直接用Python脚本,几分钟跑完。
下面是我一直保存在本地的转换脚本,针对CST导出的txt做了专门处理,你直接把文件名改一改就能用:
import re from pathlib import Path src = Path("cst_spice_model.txt") dst = Path("cst_spice_model.cir") lines = src.read_text(encoding="utf-8").splitlines() # 1. 统一行尾,处理SPICE续行符 merged = [] for line in lines: stripped = line.strip() if not stripped: continue if stripped.startswith("+") and merged: merged[-1] += " " + stripped.lstrip("+").strip() else: merged.append(stripped) # 2. 清洗节点名和非ASCII字符 cleaned = [] for line in merged: if line.startswith("*"): cleaned.append(line) continue line = re.sub(r"\bGND\b", "0", line, flags=re.IGNORECASE) line = re.sub(r"[#@$\[\]]", "_", line) line = re.sub(r"[^\x00-\x7F]+", " ", line) cleaned.append(line) # 3. 检查并补全 .SUBCKT / .ENDS has_subckt = any(l.upper().startswith(".SUBCKT") for l in cleaned) has_ends = any(l.upper().startswith(".ENDS") for l in cleaned) if not has_subckt: cleaned.insert(0, ".SUBCKT CST_MODEL P1 P2 0") if not has_ends: cleaned.append(".ENDS CST_MODEL") # 4. 写出模型文件(这里刻意不加 .END,因为它是子电路库文件) dst.write_text("\n".join(cleaned) + "\n", encoding="utf-8") print(f"[OK] {dst}")脚本做了四件事:把以+开头的续行拼接成完整一行;把GND统一替换成0;把特殊字符和非ASCII字符清理掉;检查.SUBCKT/.ENDS配对并自动补全。最后写出的文件是纯模型文件,没有加.END,因为还需要另一个仿真主文件去调用它。
如果要连仿真主文件一起生成,可以在脚本末尾再补一段,按你的激励和分析需求拼接出sim.cir。脚本的价值不是省那一次两次手工,而是保证所有模型都经过同一套清洗规则,不会出现这个模型过了、另一个模型因为某个隐藏字符又挂了的情况。
3.3 include方案:模型文件和仿真文件分离
第三种方案是我个人最推荐的工作模式,尤其在模型还需要回传给别组工程师的时候。它的核心思路很简单:CST导出的txt模型文件,经过最小限度清洗后保存为.cir模型库文件;仿真主文件单独写,用.include把模型包含进来。结构上就像C语言里的头文件和源文件分离一样。
目录结构可以这样组织:
C:/project/ models/HDMI_PIN1.cir sim/HDMI_PIN1_sim.cir模型文件只包含子电路定义和注释,不包含激励、负载、分析指令。仿真主文件专门负责"你要跑什么仿真、加多少激励、看哪个节点"。这样做的好处有三点:第一,模型文件可以在多个仿真工程里复用;第二,修改激励参数时不用动模型;第三,如果LTspice报错,你可以立刻定位是模型的问题还是仿真设置的问题,排查范围小很多。
仿真主文件示例:
HDMI_PIN1 Simulation .include ../models/HDMI_PIN1.cir VIN IN 0 PULSE(0 1 0 50p 50p 2n 4n) R1 IN P1 50 R2 P2 0 50 X1 P1 P2 0 HDMI_PIN1 .TRAN 10p 5n .END注意.include后面的路径,我习惯用正斜杠,Windows下LTspice也能正常解析。路径和文件名尽量不要有中文和空格,否则解析器容易抽风。.SUBCKT后的模型名HDMI_PIN1必须和.include文件里的.SUBCKT HDMI_PIN1完全一致,包括大小写。在SPICE里大小写敏感这个问题,不同仿真器行为不一样,最稳妥的方法是全部统一成大写。
3.4 三种方案怎么选
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 手工包一层 | 单个模型、应急验证 | 零依赖,改动直观 | 容易漏控制语句,不适合批量 |
| Python脚本 | 几十个模型批量处理 | 清洗规则一致,可重复执行 | 需要维护脚本和路径 |
| include分离 | 模型复用、跨部门协作 | 模型与仿真独立,排查快 | 对文件路径和命名要求高 |
没有绝对的最好,只有最适合当下场景的。我的做法是:临时看看波形,用手工包一层;正式项目或要交付给其他团队,用include分离;一旦发现要转换的模型超过五个,立刻写脚本。
4. 转换完成后的电路仿真验证流程
4.1 在LTspice中加载转换后的cir
转换不是终点,验证才是。把转好的cir文件用LTspice打开,直接点Run,如果能看到波形,说明语法上基本通过了,但这只代表"能跑",不代表"跑对了"。一定要做个完整的验证流程,确认转换后的SPICE模型行为和CST原仿真的频响、时域特性一致。
LTspice加载cir有两种方式。一种是用文字界面直接运行网表,也就是你把cir文件拖进LTspice的schematic窗口,它会弹出一个文本编辑器,你点Simulate按钮就行。另一种是在原理图里通过.include指令和X元件引用子电路。如果你更喜欢画原理图,就在原理图里放一个通用子电路符号,把model name填成HDMI_PIN1,然后把节点连线连到P1、P2和地上。
我第一次用LTspice跑CST模型时,遇到一个让我困惑很久的现象:不加负载直接看端口电压,波形正常;加了负载之后,波形幅度掉很多。后来想明白了,CST的SPICE模型只是一个等效网络,它本身不知道外面接了多少阻抗。你必须在外部把源端和负载端的参考阻抗加上,它才能给出和矢量网络分析仪一致的响应。所以验证时一定不要省略R1和R2这两个50欧姆端接电阻。
4.2 从AC分析里读出S参数的探针技巧
很多工程师跑完AC分析之后,不知道怎么看这个模型的S参数。其实在LTspice里,只要在网表里做两个小动作,就能把S11和S21直接画出来,不需要额外工具。
原理一句话讲清楚:我们给输入端接理想电压源VIN AC 1,串联50欧姆源阻抗R1;输出端接50欧姆负载R2。在完全匹配的情况下,输入节点的电压等于入射波加反射波的电压,入射波幅度等于源电压的一半,也就是0.5V。所以反射系数S11可以写成2 * V(IN) - 1;输出端电压V(P2)等于入射波乘以传输系数再乘以0.5,所以S21等于2 * V(P2)。
在LTspice里用行为源B1来算这两个表达式:
V1 IN 0 AC 1 R1 IN P1 50 R2 P2 0 50 X1 P1 P2 0 HDMI_PIN1 B_S21 OUT21 0 V = 2*V(P2) B_S11 OUT11 0 V = 2*V(IN)-1 .AC DEC 100 100meg 10g .END这样在仿真结果里,V(out21)就是S21的幅度和相位,V(out11)就是S11,单位都是线性值,转成dB后就能和CST的S参数曲线直接叠加对比。我这个方法在多个模型上验证过,和CST以及实测结果都能对得上,误差主要来自模型本身的拟合精度,而不是转换过程。
4.3 和CST原始仿真结果对比
拿到LTspice的AC结果后,要把它和CST原始仿真结果放在同一张图里对比。我一般用Python的matplotlib同时读两个CSV,一条画CST的S21,一条画LTspice的S21。对比时重点看三个地方:一是S21的过零点和谐振点位置,偏差建议控制在5%以内;二是通带内的纹波趋势,方向要一致;三是阻带衰减的斜率,如果趋势都变了,说明转换后的等效电路阶数不够或者模型本身拟合残差太大。
频率点对比的同时,还要跑一次时域验证。给输入端加一个阶跃或者脉冲源,观察输出端的上升时间、振铃和过冲。时域波形容易暴露频域对比看不到的问题,比如某个极点没有拟合好,频域曲线肉眼看不出来,时域上却可能出现明显振铃振荡。
判断转换成功的标准不是两条曲线完全重合。宽带SPICE模型本质是对S参数的等效逼近,一定会在某些频点上出现偏差,尤其是靠近模型频带边沿的位置。我自己的工程经验是:关键谐振点偏差在5%以内,通带趋势一致,时域阶跃响应无异常振荡,就可以认为这次转换是成功的。如果偏差过大,问题通常出在CST模型提取时的设置,而不是txt转cir的过程中。
5. 我踩过的坑:转换过程中最常见的五类报错
5.1 "Missing .ENDS":不是文件截断,而是隐藏字符
有一次同事把CST导出的txt转成cir后,LTspice直接报Fatal Error: Missing .ENDS。当时第一反应是文件被截断了,检查了半天发现文件字符数是完整的,最后一行确有.ENDS。后来我用Notepad++打开"显示所有字符",才看到文件末尾其实藏着一个UTF-8 BOM和一个零宽空格。解析器在读那行时,实际内容被零宽空格隔断,.ENDS没有被正确识别成子电路结束语句。
排查链路是这样:先看报错信息指向的行号,在编辑器里跳到文件末尾,打开显示所有字符,找BOM、零宽空格、行尾符。解决方案很简单,把所有不可见字符清除,另存成UTF-8无BOM格式,重新跑一次就好了。这个坑教会我,任何从CST导出的txt,第一步永远是预处理,不是转格式。
5.2 "Subcircuit not found":子电路名对不上
Subcircuit not found这类报错,绝大部分原因是调用处的模型名和.SUBCKT后面的模型名不一致。CST导出的子电路名可能很长,比如HDMI_PIN1_model_V2,你在X元件实例化时图省事,写成了HDMI_PIN1_model,那LTspice肯定找不到。
排查方法是搜索.SUBCKT那一行,复制完整的模型名,再去检查所有X实例化行的最后一个字段是否一致。这里还要注意大小写,CST导出的模型名有时是混合大小写,而LTspice在某些版本里对子电路名是区分大小写的。我踩过一次HDMI_PIN1和hdmi_pin1对不上导致的报错。建议在所有文件里统一采用大写模型名,省得后面自找麻烦。
5.3 "Singular matrix":悬空节点和负值元件的锅
跑时域仿真时报Singular matrix或no DC path to ground,第一反应不是去调求解器,而是回头查模型文件。SPICE在做直流工作点求解时,要求每个节点至少有一条到地的直流通路。CST拟合出来的等效电路里,受控源G常常充当信号通路,但它本身未必提供直流路径,尤其在端口之间只有电容耦合的情况下,整条直流通路就是断的。
排查方法:先在每个外部端口上并联一个1G欧姆的大电阻到0,跳过DC求解问题,看能不能收敛。如果能收敛,说明是直流路径缺失,可以用一个合理的大电阻补上;如果依然报奇异矩阵,就要检查模型里是否有负值元件。CST拟合时为了扩展带宽,可能生成负电容或负电感,这在频域里合法,但在时域里容易导致振荡或者矩阵奇异。你可以在转换脚本里加入对负值元件的警告,一旦发现就打印出来。
5.4 量级偏差:单位后缀把兆当毫
这个坑最隐蔽,因为它不报错,只是曲线整体偏移好几个数量级。我遇到过输出波形完全正常,但S21插入损耗凭空多了30dB的情况,最后抓着脚本翻半天,才意识到模型里有个电阻写成了1M,在LTspice里被解析成1毫欧而不是1兆欧。
SPICE的规则是:后缀M或m默认表示毫(milli),只有Meg才表示兆(mega)。这和我们很多工程软件里M表示兆的习惯完全相反。所以转换后务必用正则搜索一下有没有[0-9.]M($|[^A-Za-z])这种模式,一旦发现,把它替换成[数字]Meg。类似问题还有K,好在SPICE对K的千比较宽容,大小写都认,但严谨起见我也会统一替换。
5.5 中文注释带来的乱码与解析错误
CST如果是以中文界面或者中文路径导出,txt的注释行里很可能出现全角冒号、中文括号、以及一些非ASCII字符。LTspice对注释行的容忍度相对高,但HSPICE等老牌仿真器对非ASCII字符很敏感,轻则乱码,重则该注释行的下一行解析失败。
排查时看报错行号,往前翻一行,十有八九是注释行出了问题。解决方案我在预处理阶段就讲过:用正则re.sub(r"[^\x00-\x7F]+", " ", line)把所有非ASCII字符替换成空格。注意这个操作只对注释行做,.SUBCKT后的模型名如果包含了特殊字符,你不能简单替换,建议手动改成纯ASCII的名字。
最后聊一个我自己的习惯。CST导出后我不会立刻修改原始txt,而是先复制一份再操作,保留干干净净的原始备份。脚本转换也只在副本上跑,绝不原地覆盖。这样一旦仿真器报错,我能立刻回到源头对比,判断问题到底是模型本身带来的,还是转换过程中引入的语法错误。如果你只是临时验证,用include方案会更稳妥,模型文件和仿真文件分离,排查问题的时候连备份都不用找。希望这篇把txt到cir的流程讲透了,祝你们在CST和电路仿真器之间少折腾几个夜晚。