0

这是一个与 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

4 回答 4

2

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

于 2011-09-08T03:03:58.530 回答
1

It is legal to write a hierarchical reference to a generated instance. The functionality is described in sections 2.7.2 and 12.1.3 of the IEEE Verilog standard. However, the instance subscript must be a constant so that it can be resolved at compile time.

于 2011-09-08T02:52:38.263 回答
1

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

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

所以我最终不得不:

  • 定义一个reg顶级.start()任务切换的
  • 写一个always @在此触发的块reg
  • 在这个 always 块中写另一个 generate部分来调用.start()每个子模块。

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

于 2011-09-07T22:04:35.877 回答
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. 使用生成块生成所有连接

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

    for(i = 0 ; i < N ;i = i + 1) 分配 tb_Sys_Modules_dataY[i] = Sys_Modules[i].xmod.dataY;

  3. 来自 tb 的 $display 线:

    前任:

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

于 2020-11-25T08:42:27.140 回答