所以我使用了generate语句在我一直在研究的测试平台上制作一些振荡器 .
我还有一个名为OSC_PER的实数数组,其中数组中的每个元素都是振荡器的ns周期 .
我一直在尝试让我的testbench工作,以便给它一个参数(要测试的设备数量),并在我的测试平台和模拟中生成语句,实例化模块并连接所有内容 . 到目前为止,这一直进展顺利,但我认为我已经碰到了一段时间,将时段分配给我的振荡器 .
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
所以这就是我试图分配值的方式:
foreach(OSC_PER[i])
generate_my_oscillators[i].osc_c_osc.per = OSC_PER[i];
这给了我一个NOTPAR错误;我想在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(无法查找第三个设备的组件名称) .
如果我有值,我想分配给正在生成的振荡器的每个实例,我应该怎么做呢?在这一点上,我有点难过 . 也许我可以在generate-for循环中分配它?
EDIT :我尝试过更多的东西:
如果我将OSC_PER的定义移到我的测试平台并尝试在这样的生成语句中分配句点的值,我会得到EXPEND“Expecting keyword'bend'”:
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 osc_c_osc( .en(osc_en[i]), .out(osc_c[i]));
osc_c_osc.per = OSC_PER[i];
end
endgenerate
......我得到了EXPLA:期待左括号 .
period是每个osc中的内部信号,所以我不能这样放置它:
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
如果我这样做,我得到CUVPOM:端口名称'per'无效或有多个连接 .
现在我真的没有想法 . 有什么建议?
1 Answer
如果
per
是parameter
,建议的分配方式是:或者,
parameter
可以分配defparam
. 由于此功能正在考虑折旧,因此不予考虑(IEEE Std 1800-2012§C.4.1)跨层次边界分配内部值是不可综合的 . 但它允许进行模拟 .
如果
per
是内部wire
,则应为其分配assign
语句 . 如果per
是reg
,integer
,real
等,并且OSC_PER
是常量(例如:parameter
, ``define)则使用
initial语句,否则使用
always @*` .如果
per
不是参数,并且您希望它是可合成的,则将其添加到端口列表中 . 这需要修改osc
模块本身 . 请注意,浮点(例如real
)可以作为SystemVerilog中的端口用于模拟,但不可合成 .