20 / 37 · 概念
generate:用循环构建静态电路
用 genvar 与 generate-if 生成具名结构,检查总线 lane 布局。
课时内容可免费阅读,选课后可保存学习进度。
generate 循环生成实例,不是时钟周期
genvar 与 generate 描述静态重复结构,展开器在运行前创建全部实例。always_comb 内的循环描述过程计算,综合确定硬件。两者都不自动表示每拍一轮;串行处理要明确状态和时钟控制器。下面把 packed 输入分成 LANES 个 W 位字,分别算奇偶校验。W 和 LANES 均为正整数。
module lane_parity #(
parameter integer W = 8,
parameter integer LANES = 3
) (
input logic [W*LANES-1:0] data,
output logic [LANES-1:0] parity
);
genvar lane;
generate
for (lane = 0; lane < LANES; lane = lane + 1) begin : g_lane
wire [W-1:0] word_data;
assign word_data = data[lane*W +: W];
assign parity[lane] = ^word_data;
end
endgenerate
endmoduledata[base +: W] 从 base 向较大位号选择 W 位,W 在展开实例中固定。W=8,LANES=3 时 lane 0 取 7:0,1 取 15:8,2 取 23:16。具名 g_lane 提供 g_lane[1].word_data 等可观察层次。
从声明读取 lane 顺序
data=24'h03_01_80 时,从 lane 0 起为 80,01,03,校验位为 1,1,0,显示 parity[2:0]=011。最左十六进制字节是 lane 2,不是 0。区分数值索引、显示次序与传输次序。各 lane 并发,没有注册延迟,增大 LANES 增加组合逻辑而非周期数。物理扇出、布线和时序需另查。
generate-if 选择固定结构
条件必须是展开常量,例如是否包含寄存器的参数。运行时信号应放在组合或时钟块中。注册/不注册也改变有效时刻,要同步修改接口和检查器。不要用 0 来关闭本总线:[−1:0] 不是安全的零宽对象。拒绝不支持配置或用保持外部接口明确的静态分支。
练习:检测 lane 交换
验证给定例子,然后在每个 lane 依次置一位,只有对应校验位改变。一个字置两位时偶校验为 0。所有 lane 输入一样会掩盖切片交换。独立检查器用数值运算提取 lane、统计置位数;测 W=1,8 和 LANES=1,3,覆盖字节宽、层次和最小配置假设。最后尝试注册校验向量,明确 reset/enable,以及对照当前总线还是前一边沿采样值。