分析相邻走线边沿造成的串扰脉冲
目标
在集总参数电容耦合模型中,分离边沿、耦合电容和受害线电阻各自的影响。
先修知识是 Python 函数、JSON、文件处理以及 RC 时间常数。预计需要 85 分钟,所以请在 60 分钟之前用“+时间”延长(最多 180 分钟)。会话结束时,工作成果会消失。
为什么重要
必须确认,只是把峰值做小的波形,或者只改了配置的报告,是否与真实证据一致。要保留电压的极性和阈值以上的驻留时间,并从观测到的尾部反算衰减。这是理想 R·C 模型的教学性比较,并不是分布参数 NEXT/FEXT,也不是实物电路板认证。
步骤
- 先用 mkdir -p /root/capacitive-crosstalk 开始,把所有函数保存到 /root/capacitive-crosstalk/analyze.py 中。parameters(config) 返回 tau_ns 与 ratio 对象。config 是恰好包含 rise_ns(0.2/1/2)、coupling_pf(0.2/1/2)、victim_ohm(50/200/1000) 三个键的 dict。值是非 bool 的 int/float,错误的输入为 ValueError。Cv 固定为 2pF,tau_ns=Rv*(Cv+Cc)*0.001,ratio=Cc/(Cv+Cc)。不要修改输入,也不要在 import 时输出内容。
- predict(config,t_ns) 按阅读材料中的 g(t−2)−g(t−12) 公式返回受害线电压 V。时间是非 bool 的有限 int/float,范围为 0–60ns,超出范围为 ValueError。上升开始于 2ns,下降开始于 12ns,两个边沿的长度都是 rise_ns。在下降时,也要包括前一次上升的衰减尾部仍然残留的情形。
- extrema(rows) 从时间递增的有效 (ns,攻击线V,受害线V) 元组列表中,返回 positive_v、positive_ns、negative_v、negative_ns 对象。positive 是受害线的最大值,negative 是最小值,并列时选第一个时间。输入非空,且包含 0V 的采样点。不要用绝对值或攻击线列来代替。
- dwell(rows,threshold_v=0.15) 从时间递增的有效 (ns,攻击线V,受害线V) 表中,返回 |受害线V|>threshold_v 的总时间 ns。要对各区间中带有原始符号的电压做线性插值,同时考虑 ± 阈值的两个穿越。与阈值相等的平坦区间要排除。threshold_v 是非 bool 的有限正数,其余为 ValueError。不要只假设间隔均匀。
- infer_tau(t1,v1,t2,v2) 以 ns 返回 (t2−t1)/ln(v1/v2)。全部必须是非 bool 的有限 int/float,并且 t1
- analyze(folder) 读取 config.json 和提供的 simulator.read_trace(folder/trace.tsv),实现下面的返回约定。读取的行以 ns 为单位。把每个时刻的受害线 predict 以及攻击线线性边沿预测,与实际的两个电压比较,求出最大绝对误差。consistent 的条件是误差≤0.002V。观测尾部的两个点是上升结束后 +0.5ns 和 +1.5ns,如果 infer_tau 拒绝则为 None。不要修改原始数据。
- campaign(values,folder) 预先验证由 1–8 个无重复配置 dict 组成的整个 list,然后在新文件夹中调用 simulator.capture(cfg,folder/case-NN) 和 analyze。NN 从 00 开始依次编号。如果观测到的 config 与请求不同,则为 ValueError。返回 results、所有 passed 的逻辑与 all_pass、model=lumped_capacitive_coupling、measured=False,并把相同内容保存到 report.json。已有的文件夹即使为空也要拒绝,输入错误时也不创建文件夹。请保留失败的条件和原始的四个文件。
参考
- 提供的辅助程序 /opt/lab/fixtures/capacitive_crosstalk/simulator.py 是镜像资产,不要修改。执行 import sys; sys.path.insert(0, '/opt/lab/fixtures/capacitive_crosstalk') 之后,用 from simulator import capture, read_trace 来使用。capture(config,新文件夹) 会保存 config.json、circuit.cir、trace.tsv、ngspice.log。read_trace 返回 0–60ns 内以 0.01ns 为间隔的全部 6001 个采样点,被截断的表和非有限值会以 ValueError 拒绝。
- analyze 的返回:config、peaks(extrema 对象)、dwell_ns、inferred_tau_ns、max_error_v、consistent、meets_spec、passed、measured。meets_spec 要求观测最大绝对值≤0.2V,并且 dwell_ns≤1.0ns。只有 consistent 和 meets_spec 都为真时,passed 才为真,并且 measured=False。即使观测波形的符号或攻击线不同,也属于不一致。
- 在批量实验中,请从默认的 (tr=0.2,Cc=1,Rv=200) 出发,分别比较 tr=2、Cc=0.2、Rv=50。如果同时改变三者,就很难分离改善的原因。每次运行文件夹都使用新名称。
用总电容求时间常数
先用 mkdir -p /root/capacitive-crosstalk 开始,把所有函数保存到 /root/capacitive-crosstalk/analyze.py 中。parameters(config) 返回 tau_ns 与 ratio 对象。config 是恰好包含 rise_ns(0.2/1/2)、coupling_pf(0.2/1/2)、victim_ohm(50/200/1000) 三个键的 dict。值是非 bool 的 int/float,错误的输入为 ValueError。Cv 固定为 2pF,tau_ns=Rv*(Cv+Cc)*0.001,ratio=Cc/(Cv+Cc)。不要修改输入,也不要在 import 时输出内容。
受害线的时间常数中也包含耦合电容。请确认把 pF×Ω 换算为 ns 的系数。
保留上升和下降脉冲的符号
predict(config,t_ns) 按阅读材料中的 g(t−2)−g(t−12) 公式返回受害线电压 V。时间是非 bool 的有限 int/float,范围为 0–60ns,超出范围为 ValueError。上升开始于 2ns,下降开始于 12ns,两个边沿的长度都是 rise_ns。在下降时,也要包括前一次上升的衰减尾部仍然残留的情形。
先把一个边沿的响应做成函数,再通过时间平移和符号反转来叠加。下降时不要把状态重置为 0。
分别读取正负极值
extrema(rows) 从时间递增的有效 (ns,攻击线V,受害线V) 元组列表中,返回 positive_v、positive_ns、negative_v、negative_ns 对象。positive 是受害线的最大值,negative 是最小值,并列时选第一个时间。输入非空,且包含 0V 的采样点。不要用绝对值或攻击线列来代替。
不要把下降的负值改成正数。时间常数较大时,两个峰值的大小可能不同。
排除两个阈值之间的时间
dwell(rows,threshold_v=0.15) 从时间递增的有效 (ns,攻击线V,受害线V) 表中,返回 |受害线V|>threshold_v 的总时间 ns。要对各区间中带有原始符号的电压做线性插值,同时考虑 ± 阈值的两个穿越。与阈值相等的平坦区间要排除。threshold_v 是非 bool 的有限正数,其余为 ValueError。不要只假设间隔均匀。
在从负变正的区间中,中间部分可能低于阈值。如果在插值之前就应用 abs,这一部分就会消失。
从观测尾部反算时间常数
infer_tau(t1,v1,t2,v2) 以 ns 返回 (t2−t1)/ln(v1/v2)。全部必须是非 bool 的有限 int/float,并且 t1
使用自然对数和时间之差。即使改变电压倍率和时间原点,也应得到相同的值。
把真实波形与模型进行比对
analyze(folder) 读取 config.json 和提供的 simulator.read_trace(folder/trace.tsv),实现下面的返回约定。读取的行以 ns 为单位。把每个时刻的受害线 predict 以及攻击线线性边沿预测,与实际的两个电压比较,求出最大绝对误差。consistent 的条件是误差≤0.002V。观测尾部的两个点是上升结束后 +0.5ns 和 +1.5ns,如果 infer_tau 拒绝则为 None。不要修改原始数据。
观测峰值和驻留从表中求得,预期波形从配置中求得。即使是满足规范的伪造 0V 波形,证据检查也必须失败。
为各种缓解方法留下证据报告
campaign(values,folder) 预先验证由 1–8 个无重复配置 dict 组成的整个 list,然后在新文件夹中调用 simulator.capture(cfg,folder/case-NN) 和 analyze。NN 从 00 开始依次编号。如果观测到的 config 与请求不同,则为 ValueError。返回 results、所有 passed 的逻辑与 all_pass、model=lumped_capacitive_coupling、measured=False,并把相同内容保存到 report.json。已有的文件夹即使为空也要拒绝,输入错误时也不创建文件夹。请保留失败的条件和原始的四个文件。
在基准条件下,逐一改变边沿、耦合 C、电阻,比较原因。失败的结果也不要删除,要保留下来。