Compilation VHDL-条件编译

Compilation VHDL-条件编译,compilation,vhdl,standards,Compilation,Vhdl,Standards,我的VHDL测试台使用了一些特定于VHDL'2008的功能,但是,根据我测试的具体内容或用于模拟的软件,它不能总是在VHDL'2008中编译 为了解决这个问题,我创建了这个测试台的两个版本: 完整版本,在VHDL'2008中编译 轻一号,删除了所有VHDL'2008行,用VHDL'93编译 然而,维护这个测试台的两个几乎相同的版本确实是一件很烦人的事情,所以我想以某种方式合并它们 我最初认为我可以使用泛型和“IF..GENERATE”语句,但这显然不允许我在'93年编译具有'2008年特性的

我的VHDL测试台使用了一些特定于VHDL'2008的功能,但是,根据我测试的具体内容或用于模拟的软件,它不能总是在VHDL'2008中编译

为了解决这个问题,我创建了这个测试台的两个版本:

  • 完整版本,在VHDL'2008中编译
  • 轻一号,删除了所有VHDL'2008行,用VHDL'93编译
然而,维护这个测试台的两个几乎相同的版本确实是一件很烦人的事情,所以我想以某种方式合并它们

我最初认为我可以使用泛型和“IF..GENERATE”语句,但这显然不允许我在'93年编译具有'2008年特性的文件

有没有办法合并这两个文件并仍然使用VHDL'93编译结果?

选项1——Pragmas

如果使用VHDL 2008的代码没有替换其他代码(即,使用VHDL 2008的代码有额外的功能),则可以使用pragmas,例如

vhdl_93_component_u : foo_93 port map ( clk => clk, out => out);
-- rtl_synthesis off
vhdl_2008_component_u : foo_2008 port map ( clk => clk, out => out);
-- rtl_synthesis on
另外,检查您的工具是否接受启用和禁用杂注解释,以及它接受哪些杂注<代码>--rtl_合成开/关就是一个例子

选项2——不同的文件

如果您可以将代码分成3部分(testbench top、VHDL'93代码、VHDL 2008代码),那么您只能编译所需的文件(假设包/体系结构/实体名称相同)



如果您无法重构代码以使用类似的东西,我建议您回顾一下实现测试台的方式。

您是否尝试过预处理器?您可以使用通用的“ifdef”或“else”endif方法。或者你想要一个纯VHDL的解决方案吗?m4预处理器适合这些类型的问题,并且比C预处理器更通用。您可以尝试的另一个选项是将2008特定的代码隔离到它自己的包中,并实现一个93年的等效代码,该代码可以替换为需要它的工具。然后,可以使用库映射来选择哪一个在模拟中处于活动状态。这将避免生成中间文件并将其集成到模拟过程中的麻烦。我更感兴趣的是纯VHDL解决方案。但是,如果我不能这样做,我可以试试前置处理器,谢谢。Kevin Thibedeau:我使用的是分层访问(例如:TEST_SIGNAL;),我无法将它们隔离到它们的包中。我希望在2008年的所有其他功能中都能找到一些东西,但我可能没有在正确的位置搜索,也没有搜索到正确的东西……(迟来的评论,对不起)。Pragmas是可以的,但是我想要一些易于与不同工具兼容的东西。选项2看起来更像它,93和2008代码有90%的共同点,但最好将这10%隔离到不同的文件中(可能在函数/过程中)。总的来说,我认为我设计测试台的方式确实不方便。。