SystemVerilog为生成的块分配值

SystemVerilog为生成的块分配值,verilog,system-verilog,verification,Verilog,System Verilog,Verification,所以我用generate语句在我一直工作的测试台上制作了一些振荡器 我还有一个称为OSC_PER的实数数组,数组中的每个元素都是振荡器的周期,单位为ns 我一直在尝试让我的测试台工作,这样我就给它一个参数(要测试的设备数量),我的测试台和模拟中的generate语句就会出来,实例化模块并连接所有东西。到目前为止,这一切进展顺利,但我想我在给振荡器分配周期方面遇到了麻烦 generate for(i=1; i<=num_duts; i++) begin: generate_my_os

所以我用generate语句在我一直工作的测试台上制作了一些振荡器

我还有一个称为OSC_PER的实数数组,数组中的每个元素都是振荡器的周期,单位为ns

我一直在尝试让我的测试台工作,这样我就给它一个参数(要测试的设备数量),我的测试台和模拟中的generate语句就会出来,实例化模块并连接所有东西。到目前为止,这一切进展顺利,但我想我在给振荡器分配周期方面遇到了麻烦

generate
  for(i=1; i<=num_duts; i++)
  begin: generate_my_oscillators
    osc osc_c_osc( .en(osc_en[i]), .out(osc_c[i]));
  end
endgenerate
这给了我一个不寻常的错误;我想在genvar语句之外尝试并迭代实例号是非法的。好吧,也许我可以很粗暴地用手把一切安排好:

generate_my_oscillators[1].osc_c_osc.per = OSC_PER[1]
if(number_devices >= 2)
generate_my_oscillators[2].osc_c_osc.per = OSC_PER[2]
if(number_devices >= 3)
generate_my_oscillators[3].osc_c_osc.per = OSC_PER[3]
.
.
.
但是,如果我的number_devices=2,那么在第三个条件中,我会得到CUVFGS(对于生成索引无效),后跟CUVUNF(无法查找第三个设备的组件名称)

如果我有我想要分配给每个振荡器实例的值,我应该怎么做呢?在这一点上我有点不知所措。也许我可以在生成for循环中指定它

编辑:我还尝试了其他一些方法:

如果我将OSC_PER的定义移到我的测试台上,并尝试像这样在generate语句中分配时段值,我会得到expense“Expecting keyword'end”:

生成

对于(i=1;i如果
per
是一个
参数
,建议分配它的方法是:

generate
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators
  osc #( .per(OSC_PER[i]) ) osc_c_osc( .en(osc_en[i]), .out(osc_c[i]) );
end
endgenerate
跨层次边界分配内部值是不可合成的,但允许用于模拟

如果
per
是内部
wire
,则应使用
assign
语句对其进行赋值。如果
per
reg
整数
实数
等,并且
OSC\u per
是常量(例如:
参数
定义
)然后使用
initial
语句,否则使用
always@*

generate
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators
  osc osc_c_osc( .en(osc_en[i]), .out(osc_c[i]) );
  // Pick one based on the type of per and OSC_PER
  //assign osc_c_osc.per = OSC_PER[i]; // per is a wire
  //initial osc_c_osc.per = OSC_PER[i]; // per is non-wire and OSC_PER is a constant
  //always @* osc_c_osc.per = OSC_PER[i]; // per & OSC_PER are non-wire variables
end
endgenerate
生成

对于(i=1;iIs
per
a
parameter
reg
wire
generate
  for(i=1; i<=num_duts; i++)
  begin: generate_my_oscillators
    osc osc_c_osc( .en(osc_en[i]), .out(osc_c[i]));
    osc_c_osc.per = OSC_PER[i];
  end
endgenerate
generate
  for(i=1; i<=num_duts; i++)
  begin: generate_my_oscillators
    osc osc_c_osc( .en(osc_en[i]), .out(osc_c[i]), .per(OSC_PER[i]);
  end
endgenerate
generate
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators
  osc #( .per(OSC_PER[i]) ) osc_c_osc( .en(osc_en[i]), .out(osc_c[i]) );
end
endgenerate
generate
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators
  osc osc_c_osc( .en(osc_en[i]), .out(osc_c[i]) );
  defparam osc_c_osc.per = OSC_PER[i];
end
endgenerate
generate
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators
  osc osc_c_osc( .en(osc_en[i]), .out(osc_c[i]) );
  // Pick one based on the type of per and OSC_PER
  //assign osc_c_osc.per = OSC_PER[i]; // per is a wire
  //initial osc_c_osc.per = OSC_PER[i]; // per is non-wire and OSC_PER is a constant
  //always @* osc_c_osc.per = OSC_PER[i]; // per & OSC_PER are non-wire variables
end
endgenerate