使用verilog中参数定义的大小初始化数组

使用verilog中参数定义的大小初始化数组,verilog,Verilog,我们可以使用参数在verilog中定义大小来初始化数组吗 比如我想要 parameter max_neigh=8 , size = 72; reg [0:8*max_neigh-1]neighbors = size'h010203040304050607; //or as reg [0:8*max_neigh-1]neighbors = (8*max_neigh-1)'h010203040304050607; 它给出错误:“h附近的语法错误”。 任何帮助都将不胜感激 关于声明已参数化的数组不会

我们可以使用参数在verilog中定义大小来初始化数组吗 比如我想要

parameter max_neigh=8 , size = 72;
reg [0:8*max_neigh-1]neighbors = size'h010203040304050607;
//or as
reg [0:8*max_neigh-1]neighbors = (8*max_neigh-1)'h010203040304050607;
它给出错误:“h附近的语法错误”。
任何帮助都将不胜感激

关于

声明已参数化的数组不会产生任何问题。
但是,据我所知,不能将参数化大小用于值赋值。 您可以将“大小”字段保留为空

它看起来像:

reg[0:8*max_neigh-1]邻居='h0102030403004050607

如果您确实想使用
大小
参数,可以执行以下操作:

reg[0:8*max_neigh-1]邻居={size{1'b0}

这将复制数组中的
1'b0
size
,相当于
72'h000000000000000000

奖金

请注意,此类分配无法合成。 这比这更糟糕事实上,合成工具不会报告错误,可能是警告,而只是忽略该赋值。 要初始化寄存器,应使用进程

例如,同步过程将使用clk时钟输入和nrst复位信号,该信号在低电平上激活:

reg [0:8*max_neigh-1]neighbors;
wire [0:8*max_neigh-1]next_neighbors_value;
always@(posedge clk or negedge nrst)
    if(~nrst)
        neighbors <= {72{1'b0}};
    else
        neighbors <= next_neighbors_value;
reg[0:8*max_neigh-1]邻居;
导线[0:8*max_neigh-1]下一个_值;
始终@(posedge clk或negedge nrst)
如果(~nrst)

邻居无需在十六进制(或任何基数)数字上加上大小,只要您只关心它被扩展为零,而不会在实际大小重要的位置(h1不是一个好主意)使用它。

感谢您的快速回复和奖励!但是初始化为'h010203040304050607'只需要数字的最后32位。{size{1'b0}}初始化为零。相反,我想用所需的数字来初始化它。对不起,乘法错误。我在发布我的问题后意识到了这一点。一个大胆的方法是选择一个巨大的手写值1024位。如果你不写所有的位,它们将被0替换,这将给你一些空间来指定你的值,而不会在寄存器中产生Xs的风险。我想到了另一个解决方案:如果初始值中有一个模式,可以使用一些for/while循环,就像在软件编程中一样。但它通常不能被合成。。。