这是一个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
下声明有没有办法在模拟中访问自动生成的值?
谢谢!
答案 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中为我工作。
步骤:
在tb中:声明所有需要打印的数据(声明连线)
例如:对于Sys_Modules [0..N-1],需要Sys_Modules [i] .xmod.dataY =>
tb:导线[0:N-1] [`DATA_SIZE-1:0] tb_Sys_Modules_dataY;
使用generate块生成所有连接
ex:(N应该是定义/参数)
for(i = 0; i
$ tb的显示线:
例如:
$ display(“%d”,tb_Sys_Modules_dataY [i]);