单个genarte中有两个genvar用于循环?

时间:2018-08-14 08:49:28

标签: verilog system-verilog

以下这种生成循环在系统Verilog中有效。

genvar i,j;

for (i=0,j=5; i<5 && j<10; i++,j++) begin:M1

    integer t;

    initial begin

    t = i*j;

end

endgenerate

2 个答案:

答案 0 :(得分:0)

不。我什至不确定这段代码的行为是什么,或者它们以什么顺序执行。

genvar i,j;
for (i = 0; i <5; i++) begin
    for (j = 5; j < 10; j++) begin
        $display("%d", i*j);
    end
end

您最终不需要'endgenerate'。

答案 1 :(得分:0)

在示例中,您不能对genvar做很多事情。

以下代码模仿了您的要求,但可能不适用于所有模拟器。它适用于synopsys vcs,但不适用于icarus。

module g;
   genvar i;
   for (i=0; i<5; i++) begin:M
      if (i == 0) begin:B
         parameter j = 5;
      end
      else begin:B
         parameter j = g.M[i-1].B.j + 1;
      end

      integer t;
      initial begin
         t = i*B.j;
         $display(i, B.j, t);
      end
   end // block: M
endmodule // g

想法是在generate循环内声明参数j,以便其值是上一次迭代中声明的值的增量。您需要添加一个命名块'B'来有条件地声明。