差動ペアのスキューとコモンモード偏差を測定する
目標
2つの相補信号の到着の差を求め、コモンモードの偏差・差動のしきい値への到達時刻を、別々に判定します。 前提知識は、前のシグナルインテグリティのラボと、Pythonの関数・タプル・JSON・ファイル処理です。 目安は85分です。基本の60分が終わる前に、+時間で延長してください(最大180分)。 セッションが終了するとファイルは消えます。ソースと報告書を、別に保管してください。
なぜ重要なのか
最終的な差動電圧が同じでも、コモンモードと受信時間は異なることがあります。相対的なスキューと絶対的な伝搬遅延、遅いエッジの利点とコストを、分離してはじめて、設計上の対策の効果を説明できます。 結合のない、理想的な整合した線路2つのモデルです。実物の計測・放射の認証・結合した線路の解析ではありません。
ステップ
- mkdir -p /root/differential-skewでディレクトリを作ったあと、すべての実装を/root/differential-skew/analyze.pyに保存します。predict(config,t_ns)は、(Vp,Vn)のタプルを返します。configは、delay_p_ns=1/1.5、skew_ns=-0.4/-0.2/0/0.2/0.4、rise_ns=0.4/0.8の、ちょうど3つのキーのdictで、各値はboolではないint/floatです。t_nsは、boolではない有限の非負のint/floatです。それ以外はValueErrorです。P=clip((t_ns−2−delay_p_ns)/rise_ns,0,1)、N=1−clip((t_ns−2−delay_p_ns−skew_ns)/rise_ns,0,1)で、入力は保存します。
- modes(rows)は、有効な(秒,Vp,Vn)のタプルのリストを、(ns,Vdiff,Vcm)のタプルのリストに変えます。Vdiff=Vp−Vn、Vcm=(Vp+Vn)/2です。入力は変えず、全体のサンプルと順序を保ちます。
- crossing(points,level,direction)は、時間が厳密に増加している有効な(ns,電圧)の表から、最初の交差の時間を線形補間して返します。directionはrising/fallingだけで、ほかの値はValueErrorです。risingはalevel>=bとなる、隣り合う電圧a,bを探します。交差がなければNoneで、最初からしきい値にとどまっている平らなサンプルは、交差ではありません。
- metrics(rows)は、有効な時間が増加する(秒,Vp,Vn)の表から、skew_ns=Nの0.5Vの立ち下がりの交差−Pの0.5Vの立ち上がりの交差、common_peak_v=すべてのサンプルの|Vcm−0.5|の最大値、received_ns=Vdiffの最初の+0.8Vの立ち上がりの交差またはNone、final_diff_v=最後のVdiffである、オブジェクトを返します。どちらか1つでも50%の交差がなければ、ValueErrorです。サンプルから計算し、入力の設定で代わりに埋めません。
- assess(observed)は、metricsの結果から、common_ok=(common_peak_v<=0.15)、timing_ok=(received_nsがNoneではなく、<=4)、meets_spec=(2つの条件がどちらも真)であるオブジェクトを返します。境界の値は含めます。2つの失敗の理由を、1つにまとめて消してはいけません。
- analyze(folder)は、config.jsonと、simulator.read_waveで読んだwave.tsvを分析します。観測したmetricsとassessの結果を保存し、すべての生のサンプルの両方の電圧をpredictと比べた、最大絶対誤差max_voltage_errorを求めます。誤差<=0.003ならconsistent、passedは、consistentとmeets_specがどちらも真のときです。参考の戻りのキーをすべて含み、measured=Falseです。不一致でも、観測値は残し、生のファイルは変更しません。
- campaign(values,folder)は、重複のない1–8個の設定のlist全体を事前に検証し、新しいフォルダーを作ります。simulator.capture(config,folder/case-NN)で元のデータを生成してから、analyzeします。NNは00からで、結果のconfigが要求と異なればValueErrorです。results、すべてのpassedの論理積all_pass、model=independent_matched_lossless_lines、measured=Falseのオブジェクトを返し、同じreport.jsonを保存します。失敗した条件・元の4つのファイルを保存し、既存のフォルダーは、空でも拒否します。設定のエラーは、フォルダーの作成の前に拒否します。
参考
提供されるヘルパーは、/opt/lab/fixtures/differential_skew/simulator.pyです。インターネット・追加のインストールは 必要ありません。capture(config,新しいフォルダー)は、config.json, circuit.cir, wave.tsv, ngspice.logを 保存して、Pathを返します。read_wave(path)は、ヘッダー・有限の数値・増加する時間と、最大2.1psの サンプル間隔・0–6nsの全体の範囲を確認して、(秒,Vp,Vn)のタプルのリストを返します。途切れた波形はValueErrorです。 ngspiceは、最大2ps間隔の適応的な時間グリッドを使います。サンプルの最大と、連続時間の最高点は、 異なることがあります。sourceのPWLの遷移は2nsに始まり、2本の線路・ソース・終端は、それぞれ50Ωです。
ステップ6の戻りのキー: config, observed(metricsの結果), common_ok, timing_ok, meets_spec, max_voltage_error, consistent, passed, measured。最後の値はFalseです。 すべての生のサンプルの電圧誤差の許容0.003Vと、学習用の規格の0.15V・4nsは、異なる基準です。 一般的な関数の数値の比較の許容誤差は、相対・絶対とも1e-8です。サンプルから実際に求めた値で比べます。 有効な数値の表を受け取ると明記した関数に、別のパーサーを追加する必要はありません。
最後のステップのあと、次の6つの条件を実際に実行します。各条件は、(Pの遅延ns, スキューns, ランプns)です。 正常な報告書も失敗した条件を含むので、all_pass=Falseです。再び実行するときは、新しいフォルダーを使います。
cd /root/differential-skew
PYTHONPATH=/opt/lab/fixtures/differential_skew python3 - <<'PY'
from analyze import campaign
values = [(1,0,.4),(1,.2,.4),(1,.2,.8),(1,.4,.8),(1.5,0,.8),(1,-.2,.4)]
configs = [dict(delay_p_ns=p,skew_ns=s,rise_ns=r) for p,s,r in values]
print(campaign(configs, '/root/differential-skew/run-01'))
PY
ファイルは64KiB以下の通常のファイルで、importのときは出力しません。採点は、独立したサンプルと実際の エンジンの条件を使い、受講生のソースは変えません。検査のプロセスのCPU 12秒・ファイル8MiB・ 全体で35秒の制限は、受講時間とは別の、実行の保護の仕組みです。
相補信号の到着を予測する
mkdir -p /root/differential-skewでディレクトリを作ったあと、すべての実装を/root/differential-skew/analyze.pyに保存します。predict(config,t_ns)は、(Vp,Vn)のタプルを返します。configは、delay_p_ns=1/1.5、skew_ns=-0.4/-0.2/0/0.2/0.4、rise_ns=0.4/0.8の、ちょうど3つのキーのdictで、各値はboolではないint/floatです。t_nsは、boolではない有限の非負のint/floatです。それ以外はValueErrorです。P=clip((t_ns−2−delay_p_ns)/rise_ns,0,1)、N=1−clip((t_ns−2−delay_p_ns−skew_ns)/rise_ns,0,1)で、入力は保存します。
整合した受信の振幅は、ソースの振幅の半分です。2つの遅延を平均せず、N側の遅延にだけスキューを足してください。
差動とコモンモードを分離する
modes(rows)は、有効な(秒,Vp,Vn)のタプルのリストを、(ns,Vdiff,Vcm)のタプルのリストに変えます。Vdiff=Vp−Vn、Vcm=(Vp+Vn)/2です。入力は変えず、全体のサンプルと順序を保ちます。
差動は差で、コモンモードは平均です。波形ファイルの秒を、戻りのオブジェクトではnsに変えます。
方向を持つしきい値の交差を補間する
crossing(points,level,direction)は、時間が厳密に増加している有効な(ns,電圧)の表から、最初の交差の時間を線形補間して返します。directionはrising/fallingだけで、ほかの値はValueErrorです。risingはalevel>=bとなる、隣り合う電圧a,bを探します。交差がなければNoneで、最初からしきい値にとどまっている平らなサンプルは、交差ではありません。
しきい値より大きいか小さい最初のサンプルそのものが、正確な交差の時間ではありません。電圧の比率で、2つの時間の間を補間してください。
観測したスキューとコモンモードの偏差を求める
metrics(rows)は、有効な時間が増加する(秒,Vp,Vn)の表から、skew_ns=Nの0.5Vの立ち下がりの交差−Pの0.5Vの立ち上がりの交差、common_peak_v=すべてのサンプルの|Vcm−0.5|の最大値、received_ns=Vdiffの最初の+0.8Vの立ち上がりの交差またはNone、final_diff_v=最後のVdiffである、オブジェクトを返します。どちらか1つでも50%の交差がなければ、ValueErrorです。サンプルから計算し、入力の設定で代わりに埋めません。
負のスキューはエラーではありません。コモンモードは、基準の0.5Vを引いた偏差の絶対値を、最大にします。
コモンモードと受信時間を別々に判定する
assess(observed)は、metricsの結果から、common_ok=(common_peak_v<=0.15)、timing_ok=(received_nsがNoneではなく、<=4)、meets_spec=(2つの条件がどちらも真)であるオブジェクトを返します。境界の値は含めます。2つの失敗の理由を、1つにまとめて消してはいけません。
スキューが0でも、一緒に遅れれば、時間の規格は失敗します。しきい値への未到達は、0nsではなくNoneです。
2つの電圧の生の証拠とモデルを比べる
analyze(folder)は、config.jsonと、simulator.read_waveで読んだwave.tsvを分析します。観測したmetricsとassessの結果を保存し、すべての生のサンプルの両方の電圧をpredictと比べた、最大絶対誤差max_voltage_errorを求めます。誤差<=0.003ならconsistent、passedは、consistentとmeets_specがどちらも真のときです。参考の戻りのキーをすべて含み、measured=Falseです。不一致でも、観測値は残し、生のファイルは変更しません。
2つの信号に同じオフセットを足すと、差動は同じでも、コモンモードは変わります。差動だけを検算しないでください。
エッジと経路の遅延のトレードオフを比べる
campaign(values,folder)は、重複のない1–8個の設定のlist全体を事前に検証し、新しいフォルダーを作ります。simulator.capture(config,folder/case-NN)で元のデータを生成してから、analyzeします。NNは00からで、結果のconfigが要求と異なればValueErrorです。results、すべてのpassedの論理積all_pass、model=independent_matched_lossless_lines、measured=Falseのオブジェクトを返し、同じreport.jsonを保存します。失敗した条件・元の4つのファイルを保存し、既存のフォルダーは、空でも拒否します。設定のエラーは、フォルダーの作成の前に拒否します。
エッジを遅くすると、コモンモードの偏差は減りますが、時間の余裕も減ります。良い結果だけを残してはいけません。