Home Articles

SystemVerilog为生成的块分配值

Asked
Viewed 998 times
2

所以我使用了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

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

Related