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は実装の整数範囲内の正整数です。
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
endmoduleCWはポートに使うため外部設定です。既定値を維持するかmax(1,$clog2(N))以上にしてください。小さい値はLASTを切り捨て契約を破ります。大きい値は未使用コードを増やしますが、>=比較により有効エッジで0へ回復します。CW'(N-1)は定数サイズ変換で、無効設定を修正するものではありません。elaboration前に設定を検証し、実行時assertionで不正宣言を修復しようとしないでください。
設定行列を検査します
| N | 既定CW | reset後の有効エッジのcount | エッジ後pulse |
|---|---|---|---|
| 1 | 1 | 0,0,0 | 1,1,1 |
| 2 | 1 | 1,0,1 | 0,1,0 |
| 5 | 3 | 1,2,3,4,0 | 0,0,0,0,1 |
| 8 | 3 | 1,2,3,4,5,6,7,0 | 0,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が設定検証で拒否されることも検査してください。再利用可能なのは規定して検査したパラメータ範囲であり、既定一例の通過は全設定の証明ではありません。