Verilog,生成/循环参数化数组声明

时间:2016-08-29 23:59:37

标签: arrays verilog system-verilog hdl

我试图在参数化数组中找到最大值,我正在查看此post并遇到了forloop-generate。我想要做的唯一改变是将显式数组的方法改为参数化数组,但我遇到了genvar赋值问题。

   reg [$clog2(LENGTH)-1:0] arr [0:LENGTH-1];

   wire [$clog2(LENGTH)-1:0] value_l1[0:LENGTH-2];
   wire [$clog2(LENGTH)-1:0] index_l1[0:LENGTH-2];

   genvar gen_i, gen_j, gen_k;
   generate
      for(gen_i = 0; gen_i < LENGTH; gen_i = gen_i + 2) begin : loop1
         Compare cmp1(.A(arr[i])
                     ,.B(arr[i+1])
                     ,.indexA(i)
                     ,.indexB(i+1)
                     ,.value(value_l1[i/2])
                     ,.index(index_l1[i/2])
                     );
      end

      gen_k = 0;
      for(gen_i = 1; gen_i < $clog2(LENGTH); gen_i = gen_i + 1) begin : loop2_1
         for(gen_j = 0; gen_j < LENGTH / (2*gen_i); gen_j = gen_j + 2) begin : loop2_2
            Compare cmp2(.A(value_l1[gen_k + gen_j])
                        ,.B(value_l1[gen_k + gen_j+1])
                        ,.indexA(index_l1[gen_k + gen_j])
                        ,.indexB(index_l1[gen_k + gen_j+1])
                        ,.value(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
                        ,.index(index_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
                        );
         end
         //gen_k = gen_j; // <--------- problem here
      end
   endgenerate

我的方法是获得比较元素的列表,然后比较该列表并将结果写回同一列表。例如:

original array : 0 1 2 3 4 5 6 7

会导致

compare array : 1 3 5 7 | 3 7 | 7
                          ^     ^
                          |     |
                          |     largest element
                          |
                          gen_k + gen_j 

然后输出7作为最大元素,但我不能gen_k = gen_j来保存索引(偏移到比较数组的第二部分)。是否可以将generate与参数化数组一起使用?如果是这样,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使用中间参数执行此操作。

  for(gen_i = 1; gen_i < $clog2(LENGTH); gen_i = gen_i + 1) begin : loop2_1
         parameter param_k = LENGTH / (2*gen_i) + 1; 
         for(gen_j = 0; gen_j < LENGTH / (2*gen_i); gen_j = gen_j + 2) begin : loop2_2
            Compare cmp2(.A(value_l1[param_k + gen_j])
                        ,.B(value_l1[param_k + gen_j+1])
                        ,.indexA(index_l1[param_k + gen_j])
                        ,.indexB(index_l1[param_k + gen_j+1])
                        ,.value(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
                        ,.index(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
                        );
         end
      end