在Verilog Generate语句中递增多个genvar

12

我正在尝试在Verilog中创建一个多级比较器,但我无法想出如何在单个generate循环中增加多个genvar。我正在尝试以下操作:

genvar i,j;
//Level 1
generate
  j=0;
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    assign ci1[i] = minw(tc[j],tc[j+1]);
    j = j+2;
  end
endgenerate

而且我得到了以下错误:

Error-[SE] Syntax error
  Following verilog source has syntax error :
  "encoder.v", 322: token is '='
    j=0;

有人知道如何在同一个generate语句中递增多个genvar吗?或者至少获得相应的功能?

2个回答

17
有人知道如何在同一generate语句中递增多个genvar吗?
这是不允许的,因为generate循环会为循环变量创建一个隐式的localparam语句,并且仅基于该localparam展开循环中的项。这意味着如果将genvar声明为localparam,则循环内部的任何项都必须在循环外部有效。
genvar i,j;
//Level 1
generate
  j=0;
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    assign ci1[i] = minw(tc[j],tc[j+1]);
    j = j+2;
  end
endgenerate

变成

//Done for each value of i
genvar j;
localparam integer i = i_for_each_iteration;

j=0; //Not valid outside a procedural context so modelsim complains
assign ci1[i] = minw(tc[j],tc[j+1]);
j = j+2; //Also not valid outside a procedural context

在这种情况下,你可以使用循环内的显式参数创建一个依赖于genvar的“常量”值。
genvar i;
//Level 1
generate
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    localparam integer j = i*2;
    assign ci1[i] = minw(tc[j],tc[j+1]);
  end
endgenerate

非常有趣!localparam 在硬件中创建了什么东西吗? - Adam
1
本地参数是用于设计详细化的常量。 - user597225
2
这应该是被接受的答案。被接受的答案可能解决了OP的问题,但这个答案实际上回答了OP的问题。我发现自己有同样的问题,这个帮助了我。谢谢。 - hops
这意味着我们只能使用这个方案来进行两层嵌套循环吗?(我的意思是,生成循环和localparam)。 - Chan Kim

5
假设 ci1 的深度是 tc 的一半,而且你想让ci1[0] = min(tc[0], tc[1])ci[1] = min(tc[2], tc[3])等等,那么以下代码应该可以实现:
module st_genvar();

  int ci1 [0:127];
  int tc [0:255];

  function int minw(int i1, int i2);
      if(i1 < i2 )
        minw = i1;
      else
        minw = i2;
  endfunction

  genvar i;
  //Level 1
  generate
      for (i=0;i<128;i=i+1)
        begin: level1Comp
            assign ci1[i] = minw(tc[i*2],tc[i*2+1]);
        end
  endgenerate

endmodule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接