我可以在SystemVerilog的初始化中使用generate-endgenerate块吗?

时间:2016-03-26 05:24:30

标签: verilog system-verilog

例如

initial
begin

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

end //initial

我在使用QuestaSim时遇到错误。 &#34;近生成:语法错误,意外生成&#34;

1 个答案:

答案 0 :(得分:4)

详细时间期间评估

否。 generate块。虽然initialalways和其他程序块从零模拟时间开始,即运行时。参考Systemverilog IEEE 1800-2012

  

在详细设计期间评估生成方案。   虽然生成方案使用类似于行为的语法   声明,重要的是要认识到他们不执行   模拟时间

     

他们在精心制作时评估,并且   结果在模拟开始之前确定。所以,一切   生成方案中的表达式应为常量表达式,   确定性 详细时间

在Verilog中,实例化模块意味着将额外硬件添加到主板。

必须在模拟开始之前添加此硬件(即在编译时)。您在运行时无法添加/删除硬件。您可以有条件地实例化模块或乘法实例化它,但绝不能在运行时。

请参阅generate block syntax error问题,了解您的错误。另请参阅this question for generate and genvar understanding。有关详情,请参阅IEEE 1800-2012第27章。

编辑

要创建并传递多个接口实例,接口实例的总数必须由某些参数宏<管理< / em>的。您可以在for块的generate循环中使用此参数来创建不同的实例,并使用不同的键设置每个参数,如下所示:

  // 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链接处创建了一个完整的示例。可以从this question引用创建多个实例。