0

我正在尝试编写一个 VHDL 包来创建一个外部名称列表,以便在我的测试台中使用它们。我不确定是否可以在包中声明外部名称,但编译器不会抛出错误。

但是,如果我尝试使用 ModelSim 10.0bi 模拟我的测试台,则会通过加载设计得到错误:

在详细说明之前无法引用信号。

虽然编译顺序是正确的,但我猜在模拟启动期间加载顺序存在问题。在加载设计之前加载所有包。以后有没有机会强制ModelSim加载外部名称包?

从注释中插入@user3099274 的代码以提高可读性:

package external_name_package is
  alias signal1 is << signal .tb_top_cfg.TB_TOP_E_INST.DUT.signal1 : std_logic >>;
  alias signal2 is << signal .tb_top_cfg.TB_TOP_E_INST.DUT.signal2 : std_logic >>;
end package external_name_package;
4

2 回答 2

3

VHDL 设计处理分多个步骤完成,首先是分析,然后是细化。分析检查所有独立设计单元的语法和语义。细化通过将不同的设计单元组合成一个基于层次结构的大型设计来创建整个设计。

在细化过程中,检查具有层次结构引用的外部名称并将其连接到所引用的信号等。VHDL 的细化规则指定以深度优先自上而下的顺序细化设计。当在细化步骤中遇到外部名称时,必须能够确定位置,这要求外部名称引用的位置已经被细化。

如果你尝试用信号制作一个包,那么包中的外部名称在测试台模块的开头就详细说明了,因此在详细说明DUT之前,因此当时无法解析外部名称,这就是错误消息的内容:

错误“在详细说明之前无法引用信号......”。

因此,一种解决方案是在 DUT 实例化后将外部名称引用放置在进程或块中。

您还可以 在此处找到相关讨论。

于 2014-01-26T18:28:36.120 回答
1

图书馆 ieee;使用 ieee.std_logic_1164.all;

我在 vhdl 2008 中有类似的工作,除了我将分层信号别名放在包体中定义的过程中。然后在程序内部驱动其中一个别名信号时,我使用了“强制输入”,例如:

package pkgx is
  procedure write( addr : inout std_logic_Vector(7 downto 0);
end package;

package body pkgx is

  procedure write( addr : inout std_logic_Vector(7 downto 0) is
    alias tap is <<signal .tb.signal3 : std_logic>>;
  begin


    tap <= force in '1';
    wait for 0 ns;
  end procedure;

end package body;
于 2014-10-13T20:04:22.817 回答