在模拟代码中访问Verilog genvar生成的实例

时间:2011-09-07 19:46:55

标签: simulation verilog hdl synthesis

这是一个Verilog相关的问题。我正在使用XILINX ISE作为开发环境。

我正在尝试访问使用genvar自动生成的模拟中的变量但我收到以下错误 - > HDLCompiler:71

问题示例:

genvar i;

generate

for(i=0; i < N; i=i+1)

begin:Sys_Modules

  TypeXModule #(.width(10)) xmod(.dataY(dataY)));

end

endgenerate 

当我运行综合或模拟时,我可以看到创建了Sys_Modules [0..N-1] .xmod实例。

当我尝试在访问Sys_Modules数组的模拟中添加一行时:

Sys_Modules [I] .xmod.dataY

我收到以下错误:

HDLCompiler:71 dataY未在前缀xmod

下声明

有没有办法在模拟中访问自动生成的值?

谢谢!

4 个答案:

答案 0 :(得分:2)

您无法在合成的Verilog中使用跨实例分层引用。

答案 1 :(得分:1)

我觉得你运气不好。模拟器似乎不喜欢你发现的指向生成块的模块外引用(OOMR)。

最近在制作可参数化的测试平台监视器时遇到了类似的问题。我根据parameter实例化了可变数量的子块。在此期间,我需要有一个顶级.start()任务,在每个实例化模块中调用.start()任务。由于这个OOMR问题,我无法使用for循环来执行此操作。

所以我最终不得不:

  • 定义reg toplevel .start()任务切换
  • 写一个always @
  • 触发的reg
  • 在此始终阻止中写另一个 generate部分,以便在每个子模块上调用.start()

如果您真的需要查看generate d模块,也许您可​​以尝试上面的解决方法?例如,在顶层有一个总线,并使用generate语句来查看原始generate d实例,以便将有趣的信号复制/分配到此顶层总线上。

答案 2 :(得分:1)

为生成的实例编写分层引用是合法的。该功能在IEEE Verilog标准的2.7.2和12.1.3节中描述。但是,实例下标必须是常量,以便可以在编译时解析它。

答案 3 :(得分:0)

我找到并使用了另一种解决方案,将其发布在此处,以防有人发现它有用。在Vivado 2020中为我工作。

步骤:

  1. 在tb中:声明所有需要打印的数据(声明连线)

    例如:对于Sys_Modules [0..N-1],需要Sys_Modules [i] .xmod.dataY =>

    tb:导线[0:N-1] [`DATA_SIZE-1:0] tb_Sys_Modules_dataY;

  2. 使用generate块生成所有连接

    ex:(N应该是定义/参数)

    for(i = 0; i

  3. $ tb的显示线:

    例如:

    $ display(“%d”,tb_Sys_Modules_dataY [i]);