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