Altifigence Academy

25 / 63 · 実習

実習:MUX の全数検査とレジスタ出力の解析

同じ入力を組合せ経路とレジスタ経路に与え、真理値表とサンプリング時点で結果を検証します。

実験対象と観測条件

sel が 0 なら a、1 なら b が y に出ます。sampled_y はクロックの立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るで y を記憶します。入力が変わっても、次の立上りエッジまで sampled_y は保持されます。

始める前に

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

まず a と b が異なる組合せを作ります。sel=0 で a、sel=1 で b が出力されることを確認し、入力ファイルの各行と照合してください。

選択経路を直接切り替える

y = sel ? b : a

SystemVerilog ソース

SystemVerilog
module top (
    input logic clk,
    input logic a,
    input logic b,
    input logic sel,
    output logic y,
    output logic sampled_y
);
    assign y = sel ? b : a;
    // Explicit observation register: y remains purely combinational.
    // The register makes this design eligible for logic-netlist-1 simulation.
    always_ff @(posedge clk) sampled_y <= y;
endmodule

実行方法

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

設定値
初期レジスタ値(LSB から)[false]
Reset port空欄
Maximum cycles / time8 / 8000ps

下の各列は入力ファイルの一項目です。組合せの y の期待値は 0,0,0,1,1,0,1,1 です。この図は入力順の機能予測であり、sampled_y の更新時刻は含みません。

入力 JSON の八つの組合せを一覧する
波形データを表示
波形データ:各文字は一つの区間、ドットは前の状態の保持、p はクロック 1 周期を表します。
信号波形バスの値
a0...1...
b0.1.0.1.
sel01010101
y の期待値0..1.01.

入力刺激

json
[
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  }
]

結果の比較

8 cycles · y=1 · sampled_y=1。3000ps で y=1、sampled_y=0 になっているか比較してください。

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

まず期待結果を書きます

シミュレータを実行する前に、上の入力順で組合せ出力 yy を自分で計算してください。期待ビット列は 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1 です。これは八つの入力組合せをすべて検査しており、最終値一つの一致より強い根拠になります。

レジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見る出力は入力刺激の変化時ではなく、立上りエッジで更新されます。エッジ直前の組合せ出力と、エッジ直後のレジスタ出力を分けて記録してください。

qk+1=sk‾ak+skbkq_{k+1}=\overline{s_k}a_k+s_kb_k

ここでは kk 番目のエッジでサンプルした入力によって、エッジ後の状態 qk+1q_{k+1} を定義しています。sampled_y はこの状態に当たります。同じ時間座標に表示されても、入力適用とレジスタ更新のイベント順を確認する必要があります。

不具合を区別する三つの検査

  1. 選択の反転:sel ? a : b に変える前に、最初に失敗するベクトルを予測します。a=ba=b のベクトルではこの誤りを検出できません。
  2. 観測点の混同:y ではなく sampled_y を組合せの正解と直ちに比べると、正常な回路も失敗に見える理由を説明します。
  3. 入力の独立性の検査:選ばれていない入力だけを変え、yy が保持されるか確認します。選ばれた入力の変化には yy が追従する必要があります。

エラー報告には、入力・観測時点・期待値・実値を一行ずつ記録します。「波形がおかしい」だけでは、選択論理の誤りと 1 サイクルの遅延を区別できません。

発展課題

データ幅を 4 ビットにすると、組合せ入力空間は 24+4+1=5122^{4+4+1}=512 個です。全数検査はまだ可能ですが、まず 0・最大値・0101・1010・walking-one パターンでビット位置の誤りを素早く見つけます。幅を変えた回路とともに、設定と入力ファイルも更新してください。

自分で考えてみましょう

立上りエッジで a=0,b=1,s=0a=0,b=1,s=0 を記憶した後、次のエッジ前に ss だけを 1 に変えます。論理遅延後の yy と、次の立上りエッジ前後の sampled_y を求めてください。

解説を見る

組合せ出力は y=1y=1 です。sampled_y は次の立上りエッジまで 0 を保持し、そのエッジで 1 を記憶します。入力がサンプリングに必要な時間だけ安定していることを前提とします。

Lesson files

mux-top.sv ↓mux-inputs.json ↓

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