我正在尝试编写一个 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;
VHDL 设计处理分多个步骤完成,首先进行分析,然后进行 详细阐述。分析检查所有单独的语法和语义 设计单位。精化通过结合不同的元素来创建整个设计 根据层次结构将各个单元设计成一个大的设计。
正是在细化过程中,外部名称才具有层次结构 参考,检查并连接到参考信号等。VHDL 细化规则指定设计是深度优先细化的 从上到下的顺序。当在阐述过程中遇到外部名称时 步骤,必须能够确定位置,这要求 外部名称引用的位置已经详细说明。
如果你尝试制作一个带有信号的包,那么包中的外部名称 包在测试平台模块的开始部分进行了详细说明,因此在 DUT 很复杂,因此无法解析外部 当时的名称,这就是错误消息的内容:
错误“无法引用信号......在详细说明之前。”
所以解决方案是将外部名称引用放在进程或块中 DUT 实例化后。
您还可以找到相关讨论 这里。
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;
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;