localparameters 使代码通用以支持不同的数据宽度

localparameters to make code generic to support different data widths

我目前正在设计通用的 Verilog 逻辑,以便我可以根据作为输入传递给模块的参数修改寄存器的宽度。参数为 RWIDTHBWIDTH。目前我正在测试两种情况

RWIDTH=16, BWIDTH=16

RWIDTH=20, BWIDTH=16

我在使代码适应不同宽度时遇到了一些问题。下面是一小部分代码。

localparam DIFF = RWIDTH-BWIDTH;
localparam BYTE_LENGTH = 8
localparam ROUND_2_BYTE = BYTE_LENGTH-DIFF;

RWIDTH=16, BWIDTH=16 时,我希望 ROUND_2_BYTE 等于 0

但是当 RWIDTH=20, BWIDTH=16 时,我希望 ROUND_2_BYTE 等于 4

请注意,ROUND_2_BYTE 将用于计算为简单起见我没有显示的更多参数。

如何使用本地参数或 Verilog 中的任何其他方式实现此目的?我也有兴趣了解可以实现上述目标的其他方法。

使用条件运算符。变化:

localparam ROUND_2_BYTE = BYTE_LENGTH-DIFF;

至:

localparam ROUND_2_BYTE = (DIFF == 0) ? 0 : BYTE_LENGTH-DIFF;

如果您不能将它放入单个方程式,您可以使用函数调用来放置设置参数所需的任何代码。函数输入参数必须全部为常量或其他参数

function integer R2B(integer R,B);
  case (1)
  R==16 && B==16: R2B = 0;
  R==20 && B==16: R2B = 4;
  endcase
endfunction

localparam ROUND_2_BYTE = R2B(RWIDTH, BWIDTH);