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

问题描述 投票:0回答:4

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

有什么方法可以访问模拟中自动生成的值吗?

谢谢!

simulation verilog hdl synthesis
4个回答
2
投票

向生成的实例写入分层引用是合法的。 IEEE Verilog 标准的 2.7.2 和 12.1.3 节描述了该功能。但是,实例下标必须是常量,这样才能在编译时解析。


2
投票

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


1
投票

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

我最近在制作可参数化的测试平台监视器时遇到了类似的问题。我根据

parameter
实例化了可变数量的子块。在此范围内,我需要有一个顶级
.start()
任务,该任务调用每个实例化模块中的
.start()
任务。由于 OOMR 问题,我无法使用
for
循环来执行此操作。

所以我最终不得不:

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

如果您确实需要查看您的

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


0
投票

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

步骤:

  1. in tb:声明您需要打印的所有数据(声明电线)

    例如:对于

    Sys_Modules[0..N-1]
    ,如果您想要
    Sys_Modules[i].xmod.dataY
    ,请声明

wire [0:N-1][`DATA_SIZE-1:0] tb_Sys_Modules_dataY;
  1. 使用生成块生成所有连接

    例如:(

    N
    应该是定义/参数)

for(i = 0; i < N; i = i + 1)
    assign tb_Sys_Modules_dataY[i] = Sys_Modules[i].xmod.dataY;
  1. $display
    来自 tb 的电线:

    例如:

$display("%d",tb_Sys_Modules_dataY[i]);
© www.soinside.com 2019 - 2024. All rights reserved.