Altifigence Academy

20 / 37 · 概念

generate:用循环构建静态电路

用 genvar 与 generate-if 生成具名结构,检查总线 lane 布局。

generate 循环生成实例,不是时钟周期

genvar 与 generate 描述静态重复结构,展开器在运行前创建全部实例。always_comb 内的循环描述过程计算,综合确定硬件。两者都不自动表示每拍一轮;串行处理要明确状态和时钟控制器。下面把 packed 输入分成 LANES 个 W 位字,分别算奇偶校验。W 和 LANES 均为正整数。

SystemVerilog
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
endmodule

data[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,以及对照当前总线还是前一边沿采样值。

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