【发布时间】:2016-10-10 15:14:09
【问题描述】:
所以我使用 generate 语句在我一直在研究的测试平台中制作了一些振荡器。
我还有一个名为 OSC_PER 的实数数组,其中数组中的每个元素都是振荡器的周期(以 ns 为单位)。
我一直在尝试让我的测试平台工作,以便我给它一个参数(要测试的设备数量),然后我的测试平台和模拟中的生成语句会输出,实例化模块并将所有内容连接起来。到目前为止,这一切进展顺利,但我认为我在将周期分配给我的振荡器时遇到了困难。
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 循环中分配它?
编辑:我尝试了更多的东西:
如果我将 OSC_PER 的定义移至我的测试台并尝试像这样在生成语句中分配句点的值,我会得到 EXPEND "Expecting keyword 'end'":
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: 期望左括号。
周期是每个 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: Port name 'per' is invalid or has multiple connections。
现在我真的没有想法了。有什么建议吗?
【问题讨论】:
-
per是parameter、reg还是wire?
标签: verilog system-verilog verification