Altifigence Academy

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は正数です。

SystemVerilog
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。入力はエッジ前、出力は更新後です。

エッジrstenablesample更新後pulse更新後total
E011900
E101200
E201400
E301710
E400907
E501107
E601307
E701517
E8111500

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アカウント実行の証明ではありません。

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