如何在verilog中使用loop/generate初始化参数化数组参数?

How to initialize parameterized array parameter using loop/generate in verilog?

我想初始化一个参数化数组参数如下:

parameter n = 4;
parameter [(log2(n)-1):0] state [(n-1):0] = '{2'h3, 2'h2, 2'h1, 2'h0}; // for n=4

如果 n=4,这个分配工作正常。当n=8时,应该初始化为

{3'h7, 3'h6, 3'h5, 3'h4, 3'h3, 3'h2, 3'h1, 3'h0}

我想这样初始化:

for(i=0,i<n,i=i+1)
    state[i] = i;

现在我应该用什么来做这个初始化?我可以用生成来做吗?这里 log2 是一个函数。

首先,您使用的是 SystemVerilog,它是 Verilog 的超集和继承者。 Verilog 不支持数组参数(向量没问题)并且 Verilog 无法分配整个解压缩数组('{} 是 SystemVerilog)。

使用 SystemVerilog,您可以使用以下内容自动缩放 STATE 的值:

parameter N = 4;
parameter [(log2(N)-1):0] STATE [N] = state_val();

typedef logic [(log2(N)-1):0] state_t [N];
function state_t state_val();
  for(int i=0; i<N; i++)
    state_value[i] = i;
endfunction : state_val

注意:大多数编码风格指南建议参数使用大写字母,变量使用小写字母;这使得更容易阅读。这就是为什么我在回答中将 nstate 更改为 NSTATE 的原因。