1 / 37 · 概念
RTL:同時に動作する回路を記述する
ソフトウェアの実行順序と回路の並列構造を区別し、現在状態・次状態・観測時点を規定します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
回路は動作し続けます
RTLは、組合せ論理を通してレジスタ間を値が移動する方法を記述します。モジュールはハードウェアの境界です。二つのインスタンスは相互に接続された構造であり、『一つ目の関数を呼んでから二つ目を呼ぶ』という意味ではありません。回路は入力が変化する間も動作します。
デジタル論理回路で学んだゲート・記憶素子・状態機械を、明確なSystemVerilogインターフェースと再現可能な検証へ移します。実装前に、信号の幅・駆動元・有効時点・リセット動作を説明できるようにしてください。
現在状態と次状態を分けます
この完全なモジュールは、符号なし4ビットsampleを8ビットレジスタへ累算します。resetは同期式でHigh有効、enableより優先します。有効なエッジで加算し、それ以外ではsumを保持します。算術は256を法として循環します。
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
endmodulenext_sumは組合せ結果なので、クロックエッジがなくてもsumやsampleの変化で変わります。sumは状態を保存して立上りエッジで更新します。どちらもlogicという宣言でも役割は同じではありません。クロック付きブロックの最後のelse省略はレジスタ保持です。組合せブロックの代入漏れはラッチを要求する場合があるため、ブロックの種類を先に確認します。
シミュレーション前にエッジ表を計算します
各行はエッジ直前の状態と入力を使い、保存結果はnonblocking更新後に観測します。
| エッジ | rst | enable | sample | 更新前sum | 更新後sum |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 不明 | 0 |
| E1 | 0 | 1 | 3 | 0 | 3 |
| E2 | 0 | 0 | 7 | 3 | 3 |
| E3 | 0 | 1 | 5 | 3 | 8 |
| E4 | 1 | 1 | 15 | 8 | 0 |
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も必要です。
ソース・エッジ表・期待結果を一緒に保存します。受講完了マークは学習記録であり、シミュレータ実行とは別です。