Altifigence Academy

19 / 37 · 概念

parameter、localparam、$clog2 與邊界配置

區分執行時輸入和靜態配置,設計 N=1 與非二次冪計數器的位元寬度和終止行為。

參數在展開設計時固定

埠在執行中變化,parameter 在模擬或合成建結構前配置例項,localparam 命名不能由呼叫者覆蓋的派生常量,均不是每拍改變的軟體變數。模 N 的狀態是 0 到 N−1。N≥2 用 $clog2(N);N=1 時值為 0,要保證至少一位。N=0 超出契約。

按有致能的時脈邊緣定義完成

舊 count 從 N−1 回到 0 的有致能時脈邊緣產生註冊 pulse。禁用時脈邊緣保持 count 並清 pulse。同步 reset 清兩者且優先。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) 是常量尺寸轉換,不會讓非法配置合法。展開前驗證配置,執行時斷言不能修復錯誤宣告。

驗證配置矩陣

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

存一位不代表 N=1 有兩個有效狀態。N=5 正常執行不能進入 5,6,7。只測二次冪不能暴露遺漏顯式迴繞比較的錯誤。

練習:驗證行為並拒絕錯誤配置

分別建 N=1,2,5,8,跑至少兩個週期,在終值處插入禁用時脈邊緣,並同時 reset/enable。檢查每拍 count/pulse。整數參考在 reset 清零,否則預設清 pulse,有致能時模 N 增加並檢測迴繞,不依賴 DUT 的 CW 或狀態編碼。還要驗證拒絕 N=0 與過小 CW。可重用範圍僅是已明確並測試的範圍,預設一例不證明所有參數。

此選擇適用於本瀏覽器,隨時可從頁尾變更。