所以我使用了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
所以这就是我尝试分配值的方式:
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“期待关键字'结束'”:
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:端口名称“per”无效或有多个连接。
现在我真的没有想法。有什么建议吗?
答案 0 :(得分:1)
如果.mm-menu-toggle {
position: relative;
float: right;
margin-top: 20px;
}
是per
,建议的分配方式是:
parameter
或者,可以为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
分配parameter
。由于此功能正在考虑折旧(IEEE Std 1800-2012§C.4.1)
defparam
跨层次边界分配内部值是不可综合的。但它允许进行模拟。
如果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
是内部per
,则应为其分配wire
语句。如果assign
是per
,reg
,integer
等,real
是常量(例如:OSC_PER
,{{1然后使用parameter
语句,否则使用`define
。
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
模块本身。请注意,浮点(例如per
)可以作为SystemVerilog中的端口用于模拟,但不可合成。