隣の配線のエッジが作るクロストーク・パルスを分析する
目標
集中定数の静電容量結合モデルで、エッジ・結合C・ビクティム線の抵抗の影響を分離します。 前提知識は、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)の3つのキーの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、2つのエッジの長さは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)は、(t2−t1)/ln(v1/v2)をnsで返します。すべてboolではない有限のint/floatで、t1
- analyze(folder)は、config.jsonと、提供されるsimulator.read_trace(folder/trace.tsv)を読み、下の戻りの契約を実装します。読んだ行はnsの単位です。各時刻のビクティム線のpredictと、アグレッサー線の線形のエッジの予測を、実際の2つの電圧と比べて、最大絶対誤差を求めます。consistentは、誤差≤0.002Vです。観測した尾の2点は、立ち上がりの終わり+0.5nsと+1.5nsで、infer_tauが拒否したらNoneです。元のデータを修正しません。
- campaign(values,folder)は、重複のない設定dictの1–8個のlist全体を事前に検証し、新しいフォルダーで、simulator.capture(cfg,folder/case-NN)とanalyzeを呼び出します。NNは順番どおりの00からです。観測したconfigが要求と異なればValueErrorです。results、すべてのpassedの論理積all_pass、model=lumped_capacitive_coupling、measured=Falseを返し、同じ内容をreport.jsonに保存します。既存のフォルダーは、空でも拒否し、入力のエラーでは、フォルダーも作りません。失敗した条件と、元の4つのファイルを保存してください。
参考
- 提供されるヘルパー/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です。passedは、consistentとmeets_specの両方が真のときだけ 真で、measured=Falseです。観測した波形の符号やアグレッサー線が異なっても、不一致です。
- キャンペーンでは、既定の(tr=0.2,Cc=1,Rv=200)から、tr=2、Cc=0.2、Rv=50を、それぞれ比べてみてください。 3つを同時に変えると、改善の原因を分離しにくくなります。フォルダーは、実行のたびに新しい名前を使います。
合計の静電容量で時定数を求める
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)の3つのキーのdictです。値はboolではないint/floatで、不正な入力はValueErrorです。Cv=2pFで固定、tau_ns=Rv*(Cv+Cc)*0.001、ratio=Cc/(Cv+Cc)です。入力を変えたり、importのときに出力したりしません。
ビクティム線の時定数にも、結合Cが入ります。pF×Ωをnsに換算する係数を確認してください。
立ち上がりと立ち下がりのパルスの符号を保つ
predict(config,t_ns)は、読み物のg(t−2)−g(t−12)の式で、ビクティム線の電圧Vを返します。時間は、boolではない有限のint/floatで、0–60nsであり、範囲外はValueErrorです。立ち上がりの開始は2ns、立ち下がりの開始は12ns、2つのエッジの長さはrise_nsです。立ち下がりで、前の立ち上がりの減衰の尾が残っている場合も含めてください。
1つのエッジの応答を関数にしてから、時間のシフト・符号の反転で重ね合わせます。立ち下がりのときに、状態を0に初期化してはいけません。
正と負の極値を別々に読む
extrema(rows)は、有効な時間が増加する(ns,アグレッサー線V,ビクティム線V)のタプルのリストから、positive_v, positive_ns, negative_v, negative_nsのオブジェクトを返します。positiveはビクティム線の最大値、negativeは最小値で、同じ値なら最初の時間を選びます。入力は空ではなく、0Vのサンプルを含みます。絶対値やアグレッサー線の列で、代わりにしません。
立ち下がりの負の値を、正に変えてはいけません。時定数が大きいと、2つのピークの大きさが異なることがあります。
2つのしきい値の間の時間を除外する
dwell(rows,threshold_v=0.15)は、有効な時間が増加する(ns,アグレッサー線V,ビクティム線V)の表から、|ビクティム線V|>threshold_vである合計の時間nsを返します。各区間の元の符号付きの電圧を線形補間して、±しきい値の交差の両方を考慮してください。しきい値と同じ平らな区間は除外します。threshold_vは、boolではない有限の正の数で、それ以外はValueErrorです。均一な間隔だけを仮定しません。
負から正に変わる区間の真ん中は、しきい値より下にあることがあります。補間の前にabsを適用すると、その部分が消えます。
観測した尾から時定数を逆算する
infer_tau(t1,v1,t2,v2)は、(t2−t1)/ln(v1/v2)をnsで返します。すべてboolではない有限のint/floatで、t1
自然対数を使い、時間の差を使います。電圧の倍率や時間の原点を変えても、同じ値でなければなりません。
実際の波形とモデルを照合する
analyze(folder)は、config.jsonと、提供されるsimulator.read_trace(folder/trace.tsv)を読み、下の戻りの契約を実装します。読んだ行はnsの単位です。各時刻のビクティム線のpredictと、アグレッサー線の線形のエッジの予測を、実際の2つの電圧と比べて、最大絶対誤差を求めます。consistentは、誤差≤0.002Vです。観測した尾の2点は、立ち上がりの終わり+0.5nsと+1.5nsで、infer_tauが拒否したらNoneです。元のデータを修正しません。
観測したピーク・滞留は表から、予想する波形は設定から求めます。規格に合う偽の0V波形も、証拠の検査では失敗する必要があります。
緩和方法ごとの証拠の報告書を残す
campaign(values,folder)は、重複のない設定dictの1–8個のlist全体を事前に検証し、新しいフォルダーで、simulator.capture(cfg,folder/case-NN)とanalyzeを呼び出します。NNは順番どおりの00からです。観測したconfigが要求と異なればValueErrorです。results、すべてのpassedの論理積all_pass、model=lumped_capacitive_coupling、measured=Falseを返し、同じ内容をreport.jsonに保存します。既存のフォルダーは、空でも拒否し、入力のエラーでは、フォルダーも作りません。失敗した条件と、元の4つのファイルを保存してください。
基準の条件から、エッジ・結合C・抵抗を1つずつ変えて、原因を比べます。失敗した結果も削除せずに保存します。