我可以在 SystemVerilog 的 initial 中使用 generate-endgenerate 块吗?

Can I use generate-endgenerate block inside initial in SystemVerilog?

例如

initial
begin

generate
for(genvar i; i < 4; i++)
//Code
endgenerate

end //initial

我在使用带有概念的 QuestaSim 时遇到错误。 "Near generate: syntax error, unexpected generate "

No. generate 个块在 精化时间 期间被评估。而 initialalways 和其他程序块从 零模拟时间 开始,即 运行 时间。参考 Systemverilog IEEE 1800-2012 :

Generate schemes are evaluated during elaboration of the design. Although generate schemes use syntax that is similar to behavioral statements, it is important to recognize that they do not execute at simulation time.

They are evaluated at elaboration time, and the result is determined before simulation begins. Therefore, all expressions in generate schemes shall be constant expressions, deterministic at elaboration time.

在 Verilog 中,实例化 模块意味着向电路板添加额外硬件

必须在仿真开始前添加此硬件(即在编译时)。在 运行 时间内,您 无法 add/remove 硬件 。您可以有条件地 实例化 模块或 乘以 实例化它,但永远不要在 运行 时间

有关详细信息,请参阅 question for an idea about your error. Also, refer this question for generate and genvar understanding. Referring IEEE 1800-2012 第 27 章。


编辑

要创建和传递多个接口实例,接口实例的总数必须由一些参数控制。您可以在 generate 块中的 for 循环中使用此参数来创建 不同的实例 并使用不同的键设置每个实例,如下所示:

  // Generate multiple instances of interface
  genvar i;
  generate
    for(i=0;i<NUM_OF_INTERFACES;i++)
    begin
      // Generate clk with different period for each instance
      always #(i+1) clk[i] = ~clk[i];

      inter in(clk[i]);  // Create multiple instances here

    initial
      begin
        // Set each and every instance
        uvm_config_db#(virtual inter)::set(null,"*",$sformatf("in_%0d",i),in);
      end
    end
  endgenerate

完整示例创建于 EDAPlayground Multiple Interface link. Creating multiple instances can be referred from this question