第4章 Touchstone 文件格式详解
做信号完整性仿真,天天跟文件打交道。其中一种文件,你几乎绕不开——Touchstone 文件,也就是 .sNp 文件。
说白了,这就是 S 参数的“容器”。你把网络分析仪测好的数据导出来,或者从电磁仿真软件里跑出来,最后都存在这个文件里。其它工具,比如 ADS、SystemVue、HyperLynx,再把它读进去做仿真。
我最早接触这个东西,还是个新人。那时候导师丢给我一个 .s2p 文件,让我跑个差分线仿真。我看着那一堆数字,头都大了。到底哪个是差分的?哪个是共模的?顺序怎么排的?后来啃了两天文档才弄明白。今天我就把这些经验掰开揉碎了讲给你。
4.1 文件版本:1.0 还是 2.0?
Touchstone 有两个主流版本。1.0 是老爷车,但够用。2.0 加了更多花活。
怎么区分?看文件头。
| 版本 | 文件头示例 | 特点 |
|---|---|---|
| 1.0 | # GHz S MA R 50 |
简单直接,只支持 S 参数 |
| 2.0 | # GHz S MA R 50<Version 2.0> |
可以混着存 Y、Z、S 参数,还能保留端口名 |
我建议你:除非你需要存端口名称,否则用 1.0 就够了。兼容性最好,几乎所有工具都能读。2.0 虽然功能多,但有些老版本工具会报错。
4.2 数据行的秘密:每一列代表什么?
这是新手最容易搞错的地方。一个标准的 .s2p 文件,数据行长这样:
# GHz S MA R 50
! 频率(GHz) S11幅度 S11相位 S21幅度 S21相位 S12幅度 S12相位 S22幅度 S22相位
1.0000 0.8944 45.00 0.4472 90.00 0.4472 90.00 0.8944 45.00
2.0000 0.7800 60.00 0.5678 75.00 0.5678 75.00 0.7800 60.00
这里面有个坑:顺序是固定的。N 端口网络,数据列的排列规律是先固定 1 端口,再扫其它端口。
具体来说,对于 2 端口网络(.s2p),数据顺序是:
- 频率
- S11(幅度 + 相位)
- S21(幅度 + 相位): 从端口1到端口2
- S12(幅度 + 相位): 从端口2到端口1
- S22(幅度 + 相位)
你想想看,有没有发现规律?是“行索引固定,列索引变化”。Smn 里的 m 是响应端口,n 是激励端口。先固定 m=1,然后 n 从 1 跑到 N;然后再固定 m=2,n 从 1 跑到 N……直到 m=N。
核心规则:对于 .s4p 文件,数据顺序是 S11, S21, S31, S41, S12, S22, ..., S44。
4.3 Option 行:那几个字符到底啥意思?
文件头的 # GHz S MA R 50,每个字段都有讲究。我当年就吃过一次亏:把 MA 写成了 DB,结果仿真结果全偏了。
| 字段 | 可选值 | 含义 |
|---|---|---|
| 频率单位 | GHz / MHz / kHz / Hz | 数据文件中所有频率的单位 |
| 参数格式 | MA / DB / RI | MA: 幅度+相位(度) / DB: dB+相位(度) / RI: 实部+虚部 |
| 参数类型 | S / Y / Z | 文件中存的是哪种参数。90% 的情况是 S |
| 归一化阻抗 | R 50 / R 75 / R 100 | 系统参考阻抗,通常是 50 欧姆 |
我曾经犯过一个低级错误:仿真中需要 50 欧姆的差分线,结果文件里写的是 R 100。读进去之后,所有 S 参数都被归一化到了 100 欧姆系统里,结果完全对不上。花了我一上午才找到原因。
4.4 注释和命名:不只是用来好看的
Touchstone 1.0 的注释行以 ! 开头。2.0 版本多了 # 开头的关键字行,用来定义端口名、混合模式等。
比如,一个差分对的 .s4p 文件,可以用 ! 行标记端口关系:
! Port 1: P_1 (正极)
! Port 2: N_1 (负极)
! Port 3: P_2
! Port 4: N_2
我个人习惯,在文件最前面加个“文件头部信息”区块:
!
! 文件: PCIe_Gen5_Tx.s4p
! 创建:2024-03-15
! 来源:HFSS 仿真,设计 rev 1.2
! 描述:PCIe Gen5 发射端差分S参数,50欧姆系统
!
# GHz S MA R 50
嗯,这里面有个现实问题:很多EDA工具,比如ADS,读入文件后会自动丢弃注释行。所以注释里的信息,只能给人看,工具是“看不见”的。真正需要工具识别的信息,比如端口映射,得用2.0的 <PortMap> 语法。
4.5 混合模式:差分信号怎么存?
差分信号仿真,你得把单端S参数转成混合模式S参数。Touchstone 2.0 直接支持在文件里定义。
一个典型的混合模式 .s4p 文件头:
# GHz S MA R 50
<Version 2.0>
<NumberOfPorts 4>
<PortMap 1 1 2> ! 差分对1: 物理端口1为正,端口2为负
<PortMap 2 3 4> ! 差分对2: 物理端口3为正,端口4为负
注意,这里 PortMap 后面的“1”和“2”是逻辑差分端口号,后面的“1 2”和“3 4”是物理单端端口号。这个顺序不能搞反。
我建议你:用工具做转换,别手写。比如 ADS 的 SNP2SNP 组件,或者 Python 的 skrf 库,都支持一键转换混合模式。手写太容易写错了。
4.6 文件命名:一个不太起眼的坑
Touchstone 文件的扩展名是 .sNp,其中 N 是端口数。2 端口就是 .s2p,4 端口就是 .s4p。
但有一些软件(比如 Ansys 的 Circuit),对文件名有严格要求:
- 不要有空格:
My File.s4p可能会被读成My和File.s4p。 - 不要有中文或特殊字符:Windows 下还好,Linux 服务器上会崩。
- 不要用大写 .SNP:虽然大部分工具不区分,但有些脚本是大小写敏感的。
安全命名规则:project_design_rev_parameter.sNp。比如 pcie_gen5_tx_v12_100ohm.s4p。
4.7 一个完整的 .s2p 文件示例
把前面讲的整合起来,给你看一个完完整整的、符合规范的 .s2p 文件:
!
! 微带线 S 参数,50欧姆系统
! 频率范围: 1 GHz 到 10 GHz, 步长 1 GHz
!
# GHz S MA R 50
1.0000 0.8000 45.00 0.5000 90.00 0.5000 90.00 0.8000 45.00
2.0000 0.7000 60.00 0.6000 80.00 0.6000 80.00 0.7000 60.00
3.0000 0.6500 75.00 0.6500 70.00 0.6500 70.00 0.6500 75.00
4.0000 0.6000 90.00 0.7000 60.00 0.7000 60.00 0.6000 90.00
5.0000 0.5500 105.00 0.7500 50.00 0.7500 50.00 0.5500 105.00
6.0000 0.5000 120.00 0.8000 40.00 0.8000 40.00 0.5000 120.00
7.0000 0.4500 135.00 0.8500 30.00 0.8500 30.00 0.4500 135.00
8.0000 0.4000 150.00 0.9000 20.00 0.9000 20.00 0.4000 150.00
9.0000 0.3500 165.00 0.9500 10.00 0.9500 10.00 0.3500 165.00
10.0000 0.3000 180.00 1.0000 0.00 1.0000 0.00 0.3000 180.00
这个文件里,频率、S11、S21、S12、S22 一一对应。你用 ADS 的 S_Parameters 控件,或者用 read_touchstone 函数,直接就能读进去,不会报错。
4.8 知识结构总览
我把这一章的核心知识点整理成了一张图,你可以对照着把脉络理清楚。
从这张图你可以看到,一个 .sNp 文件虽然看起来就是一串数字,但它背后藏着版本、格式、数据排列、混合模式、命名规范这几大块内容。哪个环节出问题,仿真结果都不对。
嗯,今天就到这儿。你把文件格式搞懂了,后面不管是用网络分析仪抓数据,还是从仿真软件导出文件,心里都有底。