这是一个与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 下声明
有什么方法可以访问模拟中自动生成的值吗?
谢谢!
向生成的实例写入分层引用是合法的。 IEEE Verilog 标准的 2.7.2 和 12.1.3 节描述了该功能。但是,实例下标必须是常量,这样才能在编译时解析。
您不能在合成的 Verilog 中使用跨实例分层引用。
我想你运气不好。正如您所发现的那样,模拟器似乎不喜欢指向生成的块的模块外引用(OOMR)。
我最近在制作可参数化的测试平台监视器时遇到了类似的问题。我根据
parameter
实例化了可变数量的子块。在此范围内,我需要有一个顶级 .start()
任务,该任务调用每个实例化模块中的 .start()
任务。由于 OOMR 问题,我无法使用 for
循环来执行此操作。
所以我最终不得不:
reg
任务切换的 .start()
always @
上触发的
reg
generate
部分,以在每个子模块上调用 .start()
。如果您确实需要查看您的
generate
d 模块,也许您可以尝试像上面这样的解决方法?例如,在顶层有一个总线,并使用 generate
语句来查看原始 generate
d 实例,以将有趣的信号复制/分配到该顶层总线上。
我找到并使用了另一个解决方案,将其发布在这里以防有人发现它有用。在 Vivado 2020 为我工作。
步骤:
in tb:声明您需要打印的所有数据(声明电线)
例如:对于
Sys_Modules[0..N-1]
,如果您想要Sys_Modules[i].xmod.dataY
,请声明
wire [0:N-1][`DATA_SIZE-1:0] tb_Sys_Modules_dataY;
使用生成块生成所有连接
例如:(
N
应该是定义/参数)
for(i = 0; i < N; i = i + 1)
assign tb_Sys_Modules_dataY[i] = Sys_Modules[i].xmod.dataY;
$display
来自 tb 的电线:
例如:
$display("%d",tb_Sys_Modules_dataY[i]);