Altifigence Academy

19 / 37 · 概念

parameter・localparam・$clog2と境界設定

動作中の入力と静的設定を分け、N=1や2の累乗でないカウンタの幅と終了動作を設計します。

パラメータはelaboration時に固定されます

ポートは動作中に変化する入力です。parameterはシミュレーションや合成が構造を作る前の設定、localparamは呼出側が変更しない派生定数です。毎サイクル変えるソフトウェア変数ではありません。

modulo-Nの有効状態は0からN−1です。N≥2では必要幅は$clog2(N)。N=1では$clog2(1)=0なので最小1ビットにします。N=0は契約外です。

有効エッジで終了を決めます

このモジュールはenable=1のエッジで元のcountがN−1から0へ戻ると登録pulseを出します。無効エッジはcountを保持してpulseを消します。resetは両方を消し、enableより優先します。Nは実装の整数範囲内の正整数です。

SystemVerilog
module modulo_tick #(
  parameter integer N = 5,
  parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
  input  logic          clk, rst, enable,
  output logic [CW-1:0] count,
  output logic          pulse
);
  localparam logic [CW-1:0] LAST = CW'(N-1);
  always_ff @(posedge clk) begin
    if (rst) begin
      count <= '0;
      pulse <= 1'b0;
    end else begin
      pulse <= 1'b0;
      if (enable) begin
        if (count >= LAST) begin
          count <= '0;
          pulse <= 1'b1;
        end else count <= count + 1'b1;
      end
    end
  end
endmodule

CWはポートに使うため外部設定です。既定値を維持するかmax(1,$clog2(N))以上にしてください。小さい値はLASTを切り捨て契約を破ります。大きい値は未使用コードを増やしますが、>=比較により有効エッジで0へ回復します。CW'(N-1)は定数サイズ変換で、無効設定を修正するものではありません。elaboration前に設定を検証し、実行時assertionで不正宣言を修復しようとしないでください。

設定行列を検査します

N既定CWreset後の有効エッジのcountエッジ後pulse
110,0,01,1,1
211,0,10,1,0
531,2,3,4,00,0,0,0,1
831,2,3,4,5,6,7,00,0,0,0,0,0,0,1

記憶ビットが1でもN=1の状態は0一つです。N=5で通常5,6,7を訪れてはいけません。2の累乗だけの検査では明示的なwrap比較の欠落を見逃します。

実習・動作と無効設定の拒否

N=1,2,5,8を個別に作り、二周期以上実行します。終了countで無効エッジを入れ、resetとenableを同時に立てます。最終値だけでなく中間countとpulseを確認します。

整数参照モデルはresetでcount=0,pulse=0、それ以外はpulse=0から始め、enable時にmodulo N増加とwrapを計算します。DUTのCWや状態符号に依存しないようにします。N=0と不足CWが設定検証で拒否されることも検査してください。再利用可能なのは規定して検査したパラメータ範囲であり、既定一例の通過は全設定の証明ではありません。

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