【问题标题】:SystemVerilog assigning values to generated blocksSystemVerilog 为生成的块赋值
【发布时间】: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。

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

【问题讨论】:

  • perparameterreg 还是 wire

标签: verilog system-verilog verification


【解决方案1】:

如果perparameter,推荐的分配方式是:

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 可以分配给defparam。这是不赞成的,因为该功能正在考虑折旧 (IEEE Std 1800-2012 § C.4.1)

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 语句。如果perregintegerreal 等,并且OSC_PER 是一个常量(例如:parameter`define),则使用initial 语句,否则使用@ 987654339@.

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 不是参数并且您希望它是可合成的,则将其添加到端口列表中。这需要修改 osc 模块本身。请注意,浮点(例如real)可以作为 SystemVerilog 中的端口进行模拟,但不可综合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多