[英]Can I use generate-endgenerate block inside initial in SystemVerilog?
例如
initial
begin
generate
for(genvar i; i < 4; i++)
//Code
endgenerate
end //initial
使用QuestaSim和该概念时出现错误。 “临近生成:语法错误,意外生成”
号 generate
中阐述时间块进行评估。 当initial
, always
和其他过程块在零模拟时间 (即运行时)开始时。 参考Systemverilog IEEE 1800-2012 :
生成方案在设计详细过程中进行评估 。 尽管生成方案使用的语法类似于行为声明,但重要的是要认识到它们不会在仿真时 执行 。
在精心设计的时候对它们进行评估,并在仿真开始之前确定结果 。 因此,生成方案中的所有表达式都应为常量表达式 ,并在详细说明时 确定 。
在Verilog中, 实例化模块意味着在板上添加了额外的硬件 。
必须在仿真开始之前 (即在编译时)添加此硬件。 您不能在运行时添加/删除硬件 。 您可以有条件地实例化模块或乘以实例化模块,但决不能在运行时。
有关错误的想法,请参考“ 生成块语法错误”问题。 另外,请参考此问题以了解生成和genvar 。 有关更多信息,请参考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多接口链接中创建了一个完整的示例。 从这个问题可以参考创建多个实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.