前两天写了个操作 DDR4 IP 核的代码,准备用 DDR4 的 example design 仿真文件验证一下。结果在编译 top 文件 sim_tb_top 时,TCL 控制台直接甩出两个错误:
'arch_package' is not declared
'_8G' is not declared
说人话就是:包没声明,编译器完全不认识。网上搜了一圈,没找到能对症下药的解答,只能自己动手试。结果还真给试出来了。
解决方法其实不复杂。第一步,先确认 arch_package.sv 这个文件确实已经包含在工程里了:

第二步,打开 Compile Order 选单,切到 Simulation 窗口,把 arch_package.sv 这个文件拖到 sim_tb_top.sv 的上面:

调整完之后,文件顺序应该变成下面这种状态:

原理不复杂:sim_tb_top.sv 在编译时需要引用 arch_package 里定义的参数或类型,而 Vivado 默认的编译顺序可能把这个包排在了后面。SystemVerilog 的 package 必须先编译、后引用,顺序一反,编译器自然就报 is not declared 了。手动调整编译顺序,让包定义先于使用它的模块,问题就解决了。
调整之后应该就能正常编译并启动仿真了。如果你仿真的是别的 IP 核,遇到类似的包未声明问题,大概率也能用同样的方式解决——核心思路就是检查编译顺序,确保被引用的 package 先编译。
这类编译顺序导致的报错在 FPGA 仿真中其实很常见,尤其是手动往工程里添加文件的时候。遇到 is not declared 别急着改代码,先看看 Compile Order 往往能省不少时间。
|