在SystemVerilog模块中调用VHDL包内函数报错问题咨询
VHDL与SystemVerilog混合仿真问题解答
示例代码
VHDL包文件(my_package.vhd)
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; package my_package is -- Type declarations type my_array is array (0 to 3) of std_logic_vector(7 downto 0); -- Constant declarations constant MY_CONSTANT : std_logic_vector(7 downto 0) := "10101010"; -- Function declarations function add(a, b: std_logic_vector(7 downto 0)) return std_logic_vector; end package my_package; package body my_package is function add(a, b: std_logic_vector(7 downto 0)) return std_logic_vector is variable result : std_logic_vector(7 downto 0); begin result := std_logic_vector(unsigned(a) + unsigned(b)); return result; end function; end package body my_package;
SystemVerilog模块(sv_module.sv)
// Import VHDL package and its contents import my_package::*; module sv_module; logic [7:0] a, b, result; initial begin a = 8'h05; b = 8'h03; result = add(a, b); $display("Result of VHDL add: %h", result); end endmodule
编译命令
vcom -mixedsvvh -work ../my_lib ../vhd_source/my_package.vhd vlog -mixedsvvh -work ../my_lib ../sv_source/sv_module.sv
疑问点
- 为何只有将sv_module.sv编译到与my_package.vhd相同的库
../my_lib时才能成功?否则会报错vlog-13006:无法找到包; - 编译成功后仿真时为何出现报错
vopt-7063:无法在层级名称'add'中找到'add'。
问题解答
问题1:跨库引用VHDL包失败的原因
Questasim中,VHDL包属于编译时指定的目标库,SystemVerilog的import语句默认仅在当前模块所在的库中查找目标包。如果将SV模块编译到与VHDL包不同的库,import my_package::*不会自动搜索其他库中的包。
若要实现跨库引用,需在import时显式指定库名,例如:
import my_lib::my_package::*;
但这种方式需要确保目标库已被工具正确加载,相比之下,将相关文件编译到同一库是更简单可靠的方案,避免跨库引用的兼容性问题。
问题2:仿真时找不到函数add的原因
这是Questasim混合语言仿真的解析限制导致的:虽然使用了import my_package::*导入包成员,但VHDL包中的函数无法直接通过裸名(如add)被仿真优化工具(vopt)正确识别。
解决方法是调用函数时显式添加包名前缀:
result = my_package::add(a, b);
显式限定包名后,工具能明确定位到函数的定义位置,避免优化阶段的解析错误。
内容的提问来源于stack exchange,提问作者Edu Fer
相关产品推荐
相关产品推荐

