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。可复用范围仅是已明确并测试的范围,默认一例不证明所有参数。

你的选择适用于此浏览器,可随时在页脚更改。