是否可以在系统Verilog中有条件地生成for循环?

是否可以在系统Verilog中有条件地生成for循环?,verilog,system-verilog,Verilog,System Verilog,当前,当我尝试有条件地生成for循环时,我得到一个编译错误,声明我“无法嵌套生成区域” 我正在尝试做的示例: generate if (x == 0) begin for (genvar i = 0; i < 16; i++) begin *some code here* end end else begin for (genvar k = 0; k < 16; k++) begin *s

当前,当我尝试有条件地生成for循环时,我得到一个编译错误,声明我“无法嵌套生成区域”

我正在尝试做的示例:

generate 
   if (x == 0) begin
      for (genvar i = 0; i < 16; i++) begin
          *some code here*
      end
   end
   else begin
      for (genvar k = 0; k < 16; k++) begin
          *some code here*
   end
endgenerate
生成
如果(x==0)开始
对于(genvar i=0;i<16;i++)开始
*这里有一些代码*
结束
结束
否则开始
对于(genvar k=0;k<16;k++)开始
*这里有一些代码*
结束
最终生成
编辑: 谢谢大家的回复和帮助,但我发现了问题所在。感谢Greg提醒我不能在另一个generate中使用generate

这是给我带来问题的最小可重复性示例

module test ();
  parameter x = 1;
  parameter y = 1;
  if (y == 1) begin
    generate 
     if (x == 1) begin
        for (genvar i = 0; i < 16; i++) begin
            test_inner test_inner1();
        end
     end
     else begin
        for (genvar k = 0; k < 16; k++) begin
            test_inner test_inner2();
        end
     end
    endgenerate
  end

endmodule
模块测试();
参数x=1;
参数y=1;
如果(y==1)开始
生成
如果(x==1)开始
对于(genvar i=0;i<16;i++)开始
test_inner test_inner 1();
结束
结束
否则开始
对于(genvar k=0;k<16;k++)开始
test_inner test_inner 2();
结束
结束
最终生成
结束
端模
如您所见,我在另一个条件语句中嵌套了一个条件语句。因为我没有在外部条件中使用generate关键字,所以我没有意识到它在另一个generate中算作generate

为了解决这个问题,我将generate移动到外部条件,如下所示:

module test ();
  parameter x = 1;
  parameter y = 1;
  generate 
  if (y == 1) begin
     if (x == 1) begin
        for (genvar i = 0; i < 16; i++) begin
            test_inner test_inner1();
        end
     end
     else begin
        for (genvar k = 0; k < 16; k++) begin
            test_inner test_inner2();
        end
     end
  end
  endgenerate

endmodule
模块测试();
参数x=1;
参数y=1;
生成
如果(y==1)开始
如果(x==1)开始
对于(genvar i=0;i<16;i++)开始
test_inner test_inner 1();
结束
结束
否则开始
对于(genvar k=0;k<16;k++)开始
test_inner test_inner 2();
结束
结束
结束
最终生成
端模

关键字
生成
在系统verilog中是可选的。如果使用,它将启动一个新的生成块。此类生成块不能嵌套

但是,如果对不带
generate
关键字的
语句使用generate
if
,编译器将为您处理正确的生成块边界

在您的情况下#1您缺少
end
关键字,因此无法对其进行编译

在您的例子#2中,您使用
if(y==1)begin
来启动生成块。然后在已经启动的块中使用关键字
generate
。它使它们嵌套

情况#3是正确使用生成块

您没有case#4,但如果您只是摆脱或同时使用
generate
endgenerate
,它的工作方式应该与#3相同

为了控制生成的实例名,最好给生成的块命名。像这样:

module test ();
  parameter x = 1;
  parameter y = 1;
  if (y == 1) begin: y1
     if (x == 1) begin: x1
        for (genvar i = 0; i < 16; i++) begin: x1_loop
            test_inner test_inner1();
        end
     end
     else begin
        for (genvar k = 0; k < 16; k++) begin: x2_loop
            test_inner test_inner2();
        end
     end
  end 
endmodule
模块测试();
参数x=1;
参数y=1;
如果(y==1)开始:y1
如果(x==1)开始:x1
对于(genvar i=0;i<16;i++)开始:x1_循环
test_inner test_inner 1();
结束
结束
否则开始
对于(genvar k=0;k<16;k++)开始:x2_循环
test_inner test_inner 2();
结束
结束
结束
端模

假设
x
是一个参数,它看起来是合法的。我怀疑密码在别的地方。仅供参考:您不能在另一个
generate
块(甚至是推断的generate块)中使用
generate
关键字。请分享一个