verilog:如何操作参数化大小的数组

时间:2013-01-17 22:31:07

标签: verilog

我对多个阵列的操作有疑问。下面的代码适用于固定数量的数组

wire [size-1:0] data [0:3];
wire [size-1:0] result;

assign result = data[0]&data[1]&data[2]&data[3];

但是如何处理像

这样的参数化数字数组呢?
wire [size-1:0] data [0:num-1];
wire [size-1:0] result;

assign result = ????

任何想法或建议,希望你们有一些简单的答案。

2 个答案:

答案 0 :(得分:0)

我能想到的最好的事情如下:

always @* begin
  result = 0;
  for (i=0; i<num; i=i+1) begin
    result = result & data[i];
  end    
end

然而,这有两个潜在的问题:

  1. 在verilog的敏感列表中使用数组在技术上是不合法的。我已经读过大多数模拟器/综合工具会按照您的敏感度列表执行您所期望的操作,但其中一些可能没有。

  2. 根据数组的大小,这可能是也可能不是可合成的。大型阵列通常被实现为RAM,并且通常每个时钟周期只能读出一个数组的值,因此您无法将它们全部归为and

    < / LI>

答案 1 :(得分:0)

wire [size-1:0] data[0:num-1];
wire [size-1:0] data_tmp[0:num-1];
wire [size-1:0] result;

generate
    genvar i;
    for (i=0; i < num; i=i+1) begin
        if (i == 0)
            assign data_tmp[i] = data[i];
        else if (i == num-1)
            assign result = data_tmp[i-1] & data[i];
        else
            assign data_tmp[i] = data_tmp[i-1] & data[i];
    end
endgenerate