32 / 37 · 実習
総合実習:周期パルスとenable累算器を接続する
以前の値を使うモジュール間転送を規定し、enable停止・連続パルス・同時resetを参照モデルと比較します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
接続前に契約を決めます
enable=1の立上りごとに符号なし4ビットsampleを受理し、N番目ごとに登録pulseを出します。累算器は次の立上りでそのpulseと保存sampleを消費し、その時enable=0でも消費します。8ビットtotalはmodulo 256で循環します。同期resetは両段を消去し、保留sampleも破棄します。
一エッジ遅延が契約です。累算器は以前のpulseとsaved_sampleを読むので、同じエッジで他段の新しいnonblocking値を読むことはできません。modulo_tick.svと以下のperiodic_accumulator.svを保存してください。Nは正数です。
module periodic_accumulator #(parameter integer N = 3) (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic pulse,
output logic [7:0] total
);
localparam integer CW = (N <= 1) ? 1 : $clog2(N);
wire [CW-1:0] count;
logic [3:0] saved_sample;
modulo_tick #(.N(N)) tick_u (
.clk(clk), .rst(rst), .enable(enable),
.count(count), .pulse(pulse)
);
always_ff @(posedge clk) begin
if (rst) saved_sample <= 4'b0;
else if (enable) saved_sample <= sample;
end
always_ff @(posedge clk) begin
if (rst) total <= 8'b0;
else if (pulse) total <= total + {4'b0, saved_sample};
end
endmoduleデータとイベントを一緒に追跡します
N=3。入力はエッジ前、出力は更新後です。
| エッジ | rst | enable | sample | 更新後pulse | 更新後total |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 0 | 0 |
| E1 | 0 | 1 | 2 | 0 | 0 |
| E2 | 0 | 1 | 4 | 0 | 0 |
| E3 | 0 | 1 | 7 | 1 | 0 |
| E4 | 0 | 0 | 9 | 0 | 7 |
| E5 | 0 | 1 | 1 | 0 | 7 |
| E6 | 0 | 1 | 3 | 0 | 7 |
| E7 | 0 | 1 | 5 | 1 | 7 |
| E8 | 1 | 1 | 15 | 0 | 0 |
E4で加えるのは新入力9ではなく7です。enableは新規受理だけを制御し、保留イベントを取消しません。E8のresetは保留5を破棄してtotalを消します。enable && pulseで消費を制御するとE4を失います。
システム境界に独立モデルを作ります
受理数・任意の保留値・整数totalを保持します。reset以外のエッジではまず以前の保留値をmodulo 256で消費し、次に現在enable/sampleから新しいN番目の保留を決めます。resetは全て消します。tick_u.countやsaved_sampleへ依存しません。立下り刺激と更新後比較で、毎エッジpulseとtotal、保留なしの保持、消費したイベントの除去を検査します。
統合の失敗を網羅します
- N=1の連続pulseでは受理sampleを次のエッジで一度だけ消費します。
- N=3の終端sample前後にenable停止を入れ、全クロックではなく受理エッジを数えます。
- 無効な消費エッジで外部sampleを変え、保存値を使うことを確認します。
- 保留中にresetを行いtotalと保留を破棄します。
- 255を超える累算でmodulo-256のwrapを検査します。
saved_sampleをsampleへ変えるとE4が失敗し、enableで消費を抑えても失敗する必要があります。正常実装へ戻してからPASSを記録します。この単一クロック有限幅の検証は多クロック転送・物理タイミング・無料DDSアカウント実行の証明ではありません。