繁体   English   中英

在仿真代码中访问 Verilog genvar 生成的实例

[英]Accessing Verilog genvar generated instances in simulation code

这是一个 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 下声明

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

谢谢!

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

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

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

所以我最终不得不:

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

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

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

我找到并使用了另一种解决方案,将其张贴在这里以防有人会觉得它有用。 在 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]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM