包中VHDL外部名称列表

问题描述 投票:0回答:3

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

但是,如果我尝试使用 ModelSim 10.0b 模拟我的测试台,我会在加载设计时遇到错误:

在详细阐述之前,无法引用该信号。

虽然编译顺序是正确的,但是我猜想模拟启动时的加载顺序有问题。所有包都在设计加载之前加载。以后有机会强制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;
package external vhdl modelsim
3个回答
4
投票

VHDL 设计处理分多个步骤完成,首先进行分析,然后进行 详细阐述。分析检查所有单独的语法和语义 设计单位。精化通过结合不同的元素来创建整个设计 根据层次结构将各个单元设计成一个大的设计。

正是在细化过程中,外部名称才具有层次结构 参考,检查并连接到参考信号等。VHDL 细化规则指定设计是深度优先细化的 从上到下的顺序。当在阐述过程中遇到外部名称时 步骤,必须能够确定位置,这要求 外部名称引用的位置已经详细说明。

如果你尝试制作一个带有信号的包,那么包中的外部名称 包在测试平台模块的开始部分进行了详细说明,因此在 DUT 很复杂,因此无法解析外部 当时的名称,这就是错误消息的内容:

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

所以解决方案是将外部名称引用放在进程或块中 DUT 实例化后。

您还可以找到相关讨论 这里


2
投票

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;

0
投票

2023 年 Questasim 最新版本 2023.3_1 仍然如此。阳光下无新鲜事。

但我有一个可行的解决方案。请参阅下面的答案。

您需要的是双重声明。保持您的初始包声明与别名一样。

然后只需在同一包中添加一个不带参数的额外过程,第二次重新声明相同的别名。

然后仅在测试平台模拟的 0 ns 时调用该过程一次。

令人惊讶的是,这个双重声明并没有冒犯编译器。

-- assignement after elaboration   
procedure get_external_nets is
     alias signal1 is << signal .tb_top_cfg.TB_TOP_E_INST.DUT.signal1 : std_logic >>;    
begin
     report "reloading external names after whole elaboration";   
end procedure get_external_nets;
© www.soinside.com 2019 - 2024. All rights reserved.