Altifigence Academy

40 / 63 · 実習

実習:シリアルデータの移動とビット順の検証

ビット列と整数参照モデルを併用し、方向・失われるビット・リセット後の遅延を検証します。

実験対象と観測条件

立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るごとに、以前の q の下位二ビットが左へ移り、din が bit 0 に入ります。1、0、1、1 を順に入れ、移動を比べてください。

始める前に

Digital Design Studio の Desktop プロジェクトと正常な実行権限を用意します。各例は別フォルダの rtl/top.sv に保存してください。

SystemVerilog ソース

SystemVerilog
module top (
    input logic clk,
    input logic rst,
    input logic din,
    output logic [2:0] q
);
    // Old q[1:0] and din are captured together at each rising edge.
    always_ff @(posedge clk)
        if (rst) q <= 3'b000;
        else q <= {q[1:0], din};
endmodule

実行方法

New analysis で Two-state single-clock v1 を選びます。Clock port は clk、周期は 1000ps です。次の設定で Preflight と Run RTL simulation を実行し、結果を比較します。

設定値
初期レジスタ値(LSB から)[false,false,false]
Reset portrst · Active high · 1 cycle
Maximum cycles / time5 / 5000ps

入力刺激

json
[
  {
    "inputs": {
      "din": [
        false
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  },
  {
    "inputs": {
      "din": [
        false
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  }
]

下の各列は立上りエッジの記録です。入力はエッジ直前、「更新後」の状態は更新直後です。並びはサンプル順で、物理的な伝搬遅延伝搬遅延 入力が変わってから、出力が正しい値に安定するまでの時間です。論理式の等価性と時間特性は別の性質です。 詳しく見るではありません。最初の列はリセットリセット 状態を仕様で定めた初期値に戻す制御です。同期式か非同期式か、他の制御より優先されるかを合わせて定めます。 詳しく見るのエッジで、din=0 は記憶データとして数えません。その後の四入力を JSON の順と比べてください。

入力刺激と 3 ビットの状態移動
波形データを表示
波形データ:各文字は一つの区間、ドットは前の状態の保持、p はクロック 1 周期を表します。
信号波形バスの値
エッジ23452E0 → E1 → E2 → E3 → E4
reset10...
din0101.
更新後 q23452000 → 001 → 010 → 101 → 011

結果の比較

5 cycles · q=011。立上りエッジごとに 000 → 001 → 010 → 101 → 011 となります。

この実習は 0/1 の単一クロック RTL を使い、#delay・initial・X/Z のテストベンチは含みません。学習完了の表示は学習記録であり、実際のシミュレーション結果ではありません。

連結演算を独立した式で確認する

RTL と同じ連結演算連結演算 ビット列を横につなげる演算です。結果幅はオペランド幅の合計で、数値の足し算とは異なります。 詳しく見るをテストの正解にコピーすると、同じ間違いを両方に入れる場合があります。unsignedunsigned ビット列を非負整数として解釈する規則です。n ビットの範囲は 0 から 2^n−1 で、同じビット列の signed 解釈と異なる場合があります。 詳しく見る 整数として解釈する参照モデルを使ってみます。

Qk+1=(2Qk+dk) mod 8Q_{k+1}=(2Q_k+d_k)\bmod 8

リセット後の入力 1、0、1、1 では、0→1→2→5→30\to1\to2\to5\to3 です。3 ビット二進数で書けば実習の波形と一致するはずです。最後は 2⋅5+1=112\cdot5+1=11 で、下位 3 ビットだけ残すので 3 になります。

受信ビット数入力エッジ後の q整数値
0リセット0000
110011
200102
311015
410113

reset=0、enable=1 で din を 1,0,1,1 と選び、毎回クロックを進めます。q は 001,010,101,011 です。この実習で一段階ずつ予測してから、実際の RTL 結果と比較してください。enable は、次の発展課題の停止動作も試すために含まれています。

RTL 実行前にビット順を予測

同期 reset は enable より優先されます。enable=0 なら保持中の値を維持します。 q=000; q_next = (2q + din) mod 8

一ビットを追い、方向を検証する

リセット後、1 を一回、0 を三回入れます。状態は 001 → 010 → 100 → 000 です。最初の 1 が bit 0、bit 1、bit 2 を通り、その後消える必要があります。全 0、全 1 だけでは移動方向の誤りを見逃します。

3 段レジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見るで最初に入力を記憶したエッジを kk とすると、最上位 bit 2 には k+2k+2 のエッジ後に届きます。外部送信レジスタがデータを出したエッジから数えると基準点が変わるため、報告には出発点と到達点を明示します。

発展課題:有効な入力だけを移動する

入力に valid を加えるとします。valid=0 で q を保持する設計と、毎サイクル移動して別の valid ビットも伝えるパイプラインは異なります。前者は受信ビット数、後者は経過クロック数に従って移動します。同じ期待状態列で両方を検証してはいけません。

自分で考えてみましょう

リセット後、valid=1 のビットが 1、0、1 と届きます。第 2 ビットの前後に valid=0 のサイクルが一つずつあり、invalid では q を保持します。最後の q と、最初の 1 が bit 2 に届く時点を説明してください。

解説を見る

有効入力三回だけが状態を変えるので、最後の q は 101 です。最初の 1 は第 3 有効入力を記憶するエッジで bit 2 に届きます。最初の取込み後に二回の追加移動が必要で、間の invalid 二サイクル分だけ実時間が延びます。

Lesson files

shift-top.sv ↓shift-inputs.json ↓

選択はこのブラウザに適用されます。フッターからいつでも変更できます。