使用verilog

时间:2016-02-09 15:06:15

标签: 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"。
 任何帮助将非常感谢!
此致

2 个答案:

答案 0 :(得分:0)

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

看起来像是:

reg [0:8*max_neigh-1]neighbors = 'h010203040304050607;

如果您绝对想要使用size参数,可以执行以下操作:

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

哪个会复制数组中的1'b0size,这相当于72'h000000000000000000

<强>奖金

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

例如,同步过程将使用clk时钟输入,并且第一个是低电平有效的复位信号:

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;

顺便说一下,8 * 8 = 64而不是72。

答案 1 :(得分:0)

没有必要在十六进制(或任何基数)上放置一个大小,只要你只关心它被零扩展并且不能用于实际大小的逐位表达式中事情(〜&#39; h1不是一个好主意)。