在Verilog生成语句中增加多个Genvars

Ada*_*dam 10 hardware verilog syntax-error hdl system-verilog

我正在尝试用verilog创建一个多级比较器,我无法弄清楚如何在单个生成循环中增加多个genvars.我正在尝试以下方法:

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
Run Code Online (Sandbox Code Playgroud)

并收到以下错误:

Error-[SE] Syntax error
  Following verilog source has syntax error :
  "encoder.v", 322: token is '='
    j=0;
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何在同一个生成语句中增加多个genvars?或者至少获得相同的功能?

小智 12

任何人都知道如何在同一个生成语句中增加多个genvars?

这是不允许的,因为generate for循环为循环变量创建一个隐式的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
Run Code Online (Sandbox Code Playgroud)

//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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以使用循环内的显式参数创建依赖于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
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。被接受的答案可能已经解决了 OP 的问题,但这个答案实际上回答了 OP 的问题。我发现自己有同样的问题,这对我有帮助。谢谢。 (2认同)

Mar*_*rty 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
Run Code Online (Sandbox Code Playgroud)