Altifigence Academy

1 / 37 · 概念

RTL:同時に動作する回路を記述する

ソフトウェアの実行順序と回路の並列構造を区別し、現在状態・次状態・観測時点を規定します。

回路は動作し続けます

RTLは、組合せ論理を通してレジスタ間を値が移動する方法を記述します。モジュールはハードウェアの境界です。二つのインスタンスは相互に接続された構造であり、『一つ目の関数を呼んでから二つ目を呼ぶ』という意味ではありません。回路は入力が変化する間も動作します。

デジタル論理回路で学んだゲート・記憶素子・状態機械を、明確なSystemVerilogインターフェースと再現可能な検証へ移します。実装前に、信号の幅・駆動元・有効時点・リセット動作を説明できるようにしてください。

現在状態と次状態を分けます

この完全なモジュールは、符号なし4ビットsampleを8ビットレジスタへ累算します。resetは同期式でHigh有効、enableより優先します。有効なエッジで加算し、それ以外ではsumを保持します。算術は256を法として循環します。

SystemVerilog
module accumulator (
  input  logic       clk, rst, enable,
  input  logic [3:0] sample,
  output logic [7:0] sum
);
  logic [7:0] next_sum;
  assign next_sum = sum + {4'b0000, sample};
  always_ff @(posedge clk) begin
    if (rst) sum <= 8'b0;
    else if (enable) sum <= next_sum;
  end
endmodule

next_sumは組合せ結果なので、クロックエッジがなくてもsumやsampleの変化で変わります。sumは状態を保存して立上りエッジで更新します。どちらもlogicという宣言でも役割は同じではありません。クロック付きブロックの最後のelse省略はレジスタ保持です。組合せブロックの代入漏れはラッチを要求する場合があるため、ブロックの種類を先に確認します。

シミュレーション前にエッジ表を計算します

各行はエッジ直前の状態と入力を使い、保存結果はnonblocking更新後に観測します。

エッジrstenablesample更新前sum更新後sum
E0119不明0
E101303
E200733
E301538
E4111580

E4ではresetが優先し、加算しません。元のsumが250、受理sampleが10なら8ビットの結果は4です。9ビット目を保持するならインターフェースと算術契約を変更する必要があります。

代入順序は局所的、同時性は構造的です

組合せ手続き内のblocking代入=は手続き順に実行されます。別々の手続きと連続代入は同時プロセスとしてスケジュールされます。クロック手続きのnonblocking代入<=は実行時に利用できる値で右辺を計算し、更新を予約します。ソース順序だけではレイテンシを規定できません。

『1クロック待つ』ために累算器へ#10を入れないでください。遅延とクロック生成器は後の汎用シミュレーション用テストベンチに置きます。合成可能な状態遷移はソフトウェアのsleepではなく、エッジと状態で表します。

実習・要求を一つ変える

循環を255での飽和へ変更します。両オペランドを明示的に拡張して9ビット加算し、ビット8が1なら255、それ以外は7:0を保存します。resetとenableの優先順位は保持します。0+0、250+5、250+6、無効エッジ、resetとenableの同時入力を試します。期待結果は0、255、255、状態保持、0です。250+5だけではキャリー消失を検出できないため250+6も必要です。

ソース・エッジ表・期待結果を一緒に保存します。受講完了マークは学習記録であり、シミュレータ実行とは別です。

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