我正在尝试编写调用外部子程序的VHDL模块,支持VHDL-2008 VHPI接口和Modelsim FLI接口。VHDL-2008标记外部子程序的机制如下:
atrribute foreign of some_subprogram : procedure is "VHPI libname;some_subprogram";
但是Modelsim中的FLI将其定义为:
attribute foreign of some_subprogram : procedure is "some_subprogram libname";
我希望使用相同的实体/结构对,因为所有VHDL都是相同的。唯一不同的是外部子程序属性。我尝试了以下内容:
function get_foreign_attribute_string(func_name : in string; libname : in libname) return string;
attribute foreign of some_subprogram : procedure is get_foreign_attribute_string("some_subprogram", "libname");
然而,Modelsim拒绝了这个操作,说这个外部属性不是一个字符串字面量。
我尝试将函数推入一个包中,并在包体中定义属性,但它要求属性附加到函数声明上。
除了声明两个包并根据工具集进行有选择性的编译,我不确定如何完成此操作。
您有什么想法吗?
编辑:以下是一个样例案例。
library std; -- for foriegn attribute
use std.all;
entity foo is
generic
(
SIMULATOR : integer range 0 to 1 -- 0 = Modelsim FLI, 1 = VHDL-2008 VHPI
);
end entity foo;
architecture test of foo is
function get_foreign_attribute_string(func_name : in string; libname : in string) return string is
begin
case SIMULATOR is
when 0 =>
return func_name & " " & libname;
when 1 =>
return "VHPI " & libname & ";" & func_name;
end case;
end function;
procedure some_subprogram is
begin
report "some_subprogram";
end procedure;
attribute foreign of some_subprogram : procedure is get_foreign_attribute_string("some_subprogram", "libname");
begin
end architecture test;
编辑:以下是我对解决方法的第一次尝试:
library std; -- for foreign attribute
use std.all;
entity foo is
generic
(
SIMULATOR : integer range 0 to 1 -- 0 = Modelsim FLI, 1 = VHDL-2008 VHPI
);
end entity foo;
architecture test of foo is
procedure some_subprogram_mti is
begin
assert false;
end procedure some_subprogram_mti;
attribute foreign of some_subprogram_mti : procedure is "some_subprogram libname";
procedure some_subprogram_vhpi is
begin
assert false;
end procedure some_subprogram_vhpi;
attribute foreign of some_subprogram_vhpi : procedure is "VHPI libname;some_subprogram";
procedure some_subprogram is
begin
case SIMULATOR is
when 0 =>
some_subprogram_mti;
when 1 =>
some_subprogram_vhpi;
end case;
end procedure;
begin
end architecture test;
不幸的是,这也失败了,因为模拟器在精化期间尝试绑定外部函数。而_vhpi
版本将无法绑定。
funcname&"_"&libname
。 - user1818839attribute foreign of some_subprogram : procedure is SOME_SUBPROGRAM_ATTRIBUTE_STRING;
。但它报出相同的错误:** 错误: test.vhd(17): 属性“foreign”不是字符串字面量。
- PlayDough