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 必须为实现支持整数范围内的正整数。
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) 是常量尺寸转换,不会让非法配置合法。展开前验证配置,运行时断言不能修复错误声明。
验证配置矩阵
| 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 |
存一位不代表 N=1 有两个有效状态。N=5 正常运行不能进入 5,6,7。只测二次幂不能暴露遗漏显式回绕比较的错误。
练习:验证行为并拒绝错误配置
分别建 N=1,2,5,8,跑至少两个周期,在终值处插入禁用边沿,并同时 reset/enable。检查每拍 count/pulse。整数参考在 reset 清零,否则默认清 pulse,有使能时模 N 增加并检测回绕,不依赖 DUT 的 CW 或状态编码。还要验证拒绝 N=0 与过小 CW。可复用范围仅是已明确并测试的范围,默认一例不证明所有参数。
✓ 已学习