SystemVerilog为生成的块

时间:2016-06-09 19:45:57

标签: verilog system-verilog verification

所以我使用了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”无效或有多个连接。

现在我真的没有想法。有什么建议吗?

1 个答案:

答案 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语句。如果assignperreginteger等,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中的端口用于模拟,但不可合成。