VHDL 2008 can';t使用外部名称的别名驱动信号

VHDL 2008 can';t使用外部名称的别名驱动信号,vhdl,modelsim,questasim,Vhdl,Modelsim,Questasim,请看下面的代码,特别是结尾的3行注释。我用Questasim 10.6c模拟了这一点: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity alias_extname_driving_signal is port( clk : in std_logic ); end alias_extname_driving_signal; architecture primary of alias_ex

请看下面的代码,特别是结尾的3行注释。我用Questasim 10.6c模拟了这一点:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity alias_extname_driving_signal is
port(
  clk : in std_logic
);
end alias_extname_driving_signal;

architecture primary of alias_extname_driving_signal is

  signal buried_control_vector16 : std_logic_vector(15 downto 0) := (others => '0');

begin

 buried_control_vector16 <= std_logic_vector(unsigned(buried_control_vector16) + 1) when rising_edge(clk);

end architecture primary;




library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity alias_extname_driving_signal_tb is
end alias_extname_driving_signal_tb;

architecture primary of alias_extname_driving_signal_tb is

  signal clk : std_logic := '0';
  signal control_vector16 : std_logic_vector(15 downto 0) := (others => '0');
  alias control_vector16_alias is control_vector16;
  alias buried_control_vector16_alias is << signal .alias_extname_driving_signal_tb.uut.buried_control_vector16 : std_logic_vector(15 downto 0) >>;
  signal vector16 : std_logic_vector(15 downto 0);

begin

  clk <= not clk after 10 ns;

  control_vector16 <= std_logic_vector(unsigned(control_vector16) + 1) when rising_edge(clk);

  uut : entity work.alias_extname_driving_signal
  port map(
    clk => clk
  );

  -- vector16 <= << signal .alias_extname_driving_signal_tb.uut.buried_control_vector16 : std_logic_vector(15 downto 0) >>; -- this statement works
  -- vector16 <= control_vector16_alias; -- this statement works
  -- vector16 <= buried_control_vector16_alias; -- vector16 remains perpetually undefined with this statement

end architecture primary;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体别名\u extname\u驱动信号为
港口(
时钟:在标准逻辑中
);
结束别名\外部名称\驱动\信号;
alias_extname_驱动信号的主要架构是
信号埋置控制向量16:std逻辑向量(15到0):=(其他=>“0”);
开始
埋入式_控制_矢量16'0');
别名control_vector16_别名是control_vector16;
别名埋置\控制\向量16\别名为>;
信号向量16:std_逻辑_向量(15向下至0);
开始

clk外部名称只能在详细说明所引用的对象之后才能声明

VHDL从测试台开始详细阐述。首先阐述了申报区域。然后依次阐述了代码区域。如果它找到一个组件,它将详细说明它和任何子组件。当它完成对组件(以及任何子组件)的详细描述后,它将在它停止的测试台上开始详细描述

因此,您需要将别名声明移动到块语句或进程中。block语句的代码如下所示。注:带block语句的标签是必需的

architecture primary of alias_extname_driving_signal_tb is

  signal clk : std_logic := '0';
  signal control_vector16 : std_logic_vector(15 downto 0) := (others => '0');
  alias control_vector16_alias is control_vector16;
  signal vector16 : std_logic_vector(15 downto 0);

begin

  clk <= not clk after 10 ns;

  control_vector16 <= std_logic_vector(unsigned(control_vector16) + 1) when rising_edge(clk);

  uut : entity work.alias_extname_driving_signal
  port map(
    clk => clk
  );

  myblock : block 
    alias buried_control_vector16_alias is << signal .alias_extname_driving_signal_tb.uut.buried_control_vector16 : std_logic_vector(15 downto 0) >>;
  begin
     vector16 <= << signal .alias_extname_driving_signal_tb.uut.buried_control_vector16 : std_logic_vector(15 downto 0) >>; -- this statement works
     vector16 <= control_vector16_alias; -- this statement works
     vector16 <= buried_control_vector16_alias; -- vector16 remains perpetually undefined with this statement
  end block myblock ; 

end architecture primary;
alias_extname_driving_signal_tb的主要架构是 信号时钟:标准逻辑:='0'; 信号控制向量16:std逻辑向量(15到0):=(其他=>'0'); 别名control_vector16_别名是control_vector16; 信号向量16:std_逻辑_向量(15向下至0); 开始 时钟; 开始 向量16;——这句话很管用
vector16您从不更新外部名称,您总是从中读取。您需要使用强制信号分配:
burned\u control\u vector16\u alias顺便说一句,我认为您的代码不是有效的VHDL代码。需要在详细说明引用的外部名称后声明别名。你分析并运行过你的例子吗?嗯,你的代码让我们的GHDL崩溃吧,我可以把你的代码报告为bug吗?你的force语句的方向是错误的。我不想控制隐藏的控制向量16别名信号。我正在尝试将vector16设置为隐藏的\u控制\u vector16\u别名。不过,我尝试了你建议的相反方向,vector16仍然没有更新。另外,关于武力声明,我认为没有必要。我可以在testbench中实例化另一个组件,将外部名称的别名连接到它的一个输入端口,该输入端口将在模拟中正常更新。我不能在详细阐述了某件事之后再声明。你是说我需要在代码中的其他地方声明我的别名吗?请不要将此代码报告为错误,好吗?我将这段代码一字不差地复制并粘贴到一个空白文件中,然后用Questasim 10.6c编译,模拟得很好。谢谢“创建”是不精确的。请注意IEEE Std 1076-2008 14.2设计层次阐述第202页中的示例,其中第一个示例使用外部名称(
alias DONE_SIG;--legal
标记为外部名称的合法用法,并与OP的用法相匹配。示例前面的最后一段给出了两个标准,说明了何时需要对外部名称表示的对象进行详细说明。OP的用法不符合这两个标准。(未读取该值,且外部名称不是关联列表中的实际名称)。WRT 14.2,表示“合法”的声明应表示为“非法”,并在正在修订的LRM的ISAC第05版中进行了更正。请参阅:WRT“创建”对于使用英语同义词进行思考,我深表歉意。我是否可以在体系结构的声明区域声明外部名称的别名,或者至少可以在体系结构声明部分的任何位置使用该别名?@MichaelGrover对于一个简单的测试台,您可以在其中使用uut实例和代码,您可以包装除了块语句中的uut之外的所有内容—或者将别名放在进程中(但只有该进程才能看到它)。对于刺激位于测序器组件中的更高级别结构化测试台,请在测试台架构中最后一个实例测序器组件,并首先实例uut。这样,测试测序器可以在uut或验证组件中具有外部名称引用。有关更多信息,请参阅我们的博客和网站。