错误:Libero SoC 11.9 VHDL编译“区域中已经声明了hread的同形异义词”

时间:2018-08-31 14:41:31

标签: vhdl

我是VHDL的新手。我收到以下编译错误:

  • 该区域已存在hread的同形异物
  • 该区域已存在hread的同形异物
  • 该区域的hwrite同形异义词已经存在

出现错误的位置就像Libero 编译没有告诉Std_ULogic_Vector和Std_Logic_Vector之间的区别。任何见解都是有帮助的。

Slyswine

   --pragma translate_off
    library  Std;
    use      Std.Standard.all;
    use      Std.TextIO.all;

    library  ieee;
    use      ieee.std_logic_1164.all;

    --pragma translate_on

    package StdIO is

    --pragma translate_off
       procedure HRead(
          variable L:          inout Line;
          variable VALUE:      out   Std_ULogic_Vector;
          variable GOOD:       out   Boolean);

       procedure HRead(
          variable L:          inout Line;
          variable VALUE:      out   Std_ULogic_Vector);

       procedure HRead(
          variable L:          inout Line;
          variable VALUE:      out   bit_vector);

       procedure HRead(                         -- "Error occurs on this line"
          variable L:          inout Line;
          variable VALUE:      out   Std_Logic_Vector;
          variable GOOD:       out   Boolean);

       procedure HRead(                          --  "and this line"
          variable L:          inout Line;             
          variable VALUE:      out   Std_Logic_Vector);

       procedure HWrite(
          variable L:          inout Line;
          constant VALUE:      in    Std_ULogic_Vector;
          constant JUSTIFIED:  in    SIDE  := RIGHT;
          constant FIELD:      in    WIDTH := 0);

       procedure HWrite(                          --   "and this line"
          variable L:          inout Line;
          constant VALUE:      in    Std_Logic_Vector;
          constant JUSTIFIED:  in    SIDE  := RIGHT;
          constant FIELD:      in    WIDTH := 0);

       procedure Write(
          variable L:          inout Line;
          constant VALUE:      in    Std_ULogic;
          constant JUSTIFIED:  in    SIDE  := RIGHT;
          constant FIELD:      in    WIDTH := 0);
    --pragma translate_on

    end package StdIO;

1 个答案:

答案 0 :(得分:1)

TL; DR 答案

所有这些子程序声明都已包含在与std_logic_1164兼容的IEEE Std 1076-2008修订版工具包中。同样在-2008年n中,STD_LOGIC_VECTOR是STD_ULOGIC_VECTOR的子类型,这意味着基本类型(STD_ULOGIC_VECTOR)相同,并且它们的错误是同形图(此处不在同一声明性区域中)。

除非使用-2008软件包,否则不需要StdIO(此处显示声明),除非子程序规范中存在行为差异。

因为在STD_LOG_1164软件包中STD_LOGIC_VECTOR被声明为单独的类型,所以可以在符合VHDL标准早期版本的工具中正确分析软件包的声明。

长答案

错误

12.3可见性

  

...当且仅当两个声明具有相同的指示符,并且它们表示不同的命名实体,并且允许重载时,才将两个声明中的每个声明为另一个的同形文字。最多为两个声明之一,或者两个声明都允许重载,并且它们具有相同的参数和结果类型配置文件(请参见4.5.1)。

4.5子程序重载
4.5.1常规

  

两个形式参数列表,只要且仅当它们具有相同数量的参数,并且在每个参数位置处对应的参数具有相同的基本类型时,才称为具有相同的参数类型配置文件。当且仅当两个子程序具有相同的参数类型配置文件,并且两个子程序都是具有相同结果基类型的函数,或者两个都不是时,才说这两个子程序具有相同的参数和结果类型配置文件一个功能。

procedure HRead(
          variable L:          inout Line;
          variable VALUE:      out   Std_ULogic_Vector;
          variable GOOD:       out   Boolean);

   procedure HRead(                         -- "Error occurs on this line"
      variable L:          inout Line;
      variable VALUE:      out   Std_Logic_Vector;
      variable GOOD:       out   Boolean);

一样被视为同形异义词
   procedure HRead(
      variable L:          inout Line;
      variable VALUE:      out   Std_ULogic_Vector);

   procedure HRead(                          --  "and this line"
      variable L:          inout Line;             
      variable VALUE:      out   Std_Logic_Vector);

以及

   procedure HWrite(
      variable L:          inout Line;
      constant VALUE:      in    Std_ULogic_Vector; 
      constant JUSTIFIED:  in    SIDE  := RIGHT;
      constant FIELD:      in    WIDTH := 0);

   procedure HWrite(                          --   "and this line"
      variable L:          inout Line;
      constant VALUE:      in    Std_Logic_Vector;
      constant JUSTIFIED:  in    SIDE  := RIGHT;
      constant FIELD:      in    WIDTH := 0);

12.3可见性

  

...
  除了组件实例所隐含的块的声明区域或等效于包实例或子程序实例的通用映射包或子程序的声明区以外,在同一个声明区域中立即发生的两个声明不应是同形异义词,除非其中之一是预定义操作的隐式声明或该隐式声明的隐式别名。在这种情况下,预定义的操作或其别名总是被另一个同形异义词隐藏。如果以这种方式隐藏,则隐式声明将隐藏在另一个声明的整个范围内(无论哪个声明先出现);隐式声明既不能通过选择也不能直接看到。对于组件实例所隐含的块的声明性区域,或等效于包实例或子程序实例的通用映射包或子程序的声明性区域,本段的规则适用于相应的实体声明,组件声明,未实例化的程序包声明或未实例化的子程序声明(视情况而定)。   ...

为避免陷入困境,std_logic_1164(-2008)软件包中明确声明了HREAD和HWRITE,

   procedure HRead(
      variable L:          inout Line;
      variable VALUE:      out   Std_ULogic_Vector;
      variable GOOD:       out   Boolean);

   procedure HRead(
      variable L:          inout Line;
      variable VALUE:      out   Std_ULogic_Vector);

   procedure HWrite(
      variable L:          inout Line;
      constant VALUE:      in    Std_ULogic_Vector;
      constant JUSTIFIED:  in    SIDE  := RIGHT;
      constant FIELD:      in    WIDTH := 0);

是-2008软件包std_logic_1164中声明的过程的合法重载。 (这些声明是在其后发现非法同形异义词的声明。它们不是隐式声明的或别名的。这些声明在std_logic_1164软件包的较早修订版中找不到。这意味着在OP的软件包StdIO中可能不需要这些声明。 )

这些是错误:

1.3本标准的结构和术语 1.3.1常规

  

在本文档中,单词“ <应>应”用于表示强制性要求。 应该一词用于表示推荐。单词可以用于表示允许的动作。 can一词用于表达可能性和能力。

1.3.3语义描述

  

紧随句法产生之后,用一系列叙述规则描述了特定结构的含义和限制。在这些规则中,斜体字表示该术语的定义,并且完全以大写字母出现的标识符是指STANDARD包中的定义(请参见16.3)。

     

在这些语义描述中使用以下术语,其含义如下:

     

错误:所描述的条件表示格式不正确;但是,不需要实现即可检测和报告此情况。仅当在语言处理过程中通常无法检测到条件时,才认为条件是错误的。

     

错误:描述的条件表示格式不正确;需要使用实现来检测条件并将错误报告给工具的用户。

     

非法:“错误”的同义词。

     

法律:所描述的条件代表格式正确的描述。

同形异义子程序声明产生错误,不符合强制性的语义要求(在上述12.3中使用必须)。

为什么它们是同形图基于使用符合IEEE Std 1076-2008的VHDL工具,因此在IEEE程序包std_logic_1164中STD_LOGIC_VECTOR是STD_ULOGIC_VECTOR的子类型:

    subtype STD_LOGIC_VECTOR is (resolved) STD_ULOGIC_VECTOR;

同形异义程序声明的注释声明以下形式的接口对象:

6.5.2接口对象声明

  

interface_constant_declaration :: =
  [ constant ]标识符列表:[ in ] subtype_indication [:= static_expression]

     

interface_variable_declaration :: =
  [变量]标识符列表:[模式] subtype_indication [:= static _ expression]

其子类型指示类型标记:

6.3子类型声明

  

subtype_indication :: =
  [resolution_indication] type_mark [约束]
  ..
  type_mark :: =
   type _ 名称
  | subtype _ 名称

具有相同的基本类型:

6.3子类型声明

  

...
  类型标记表示类型或子类型。如果类型标记是类型的名称,则该类型标记表示该类型以及相应的不受约束的子类型。根据定义,类型标记的基本类型是由类型标记表示的类型或子类型的基本类型。

     

...

具有相同的参数类型配置文件(4.5.1),并且过程声明为同形图。

4.5子程序重载
4.5.1常规

  

...
  给定的子程序指示符可用于指定多个子程序。然后,子程序指示符被认为是重载的。指定的子程序也被称为重载,并且彼此重载。如果两个子程序彼此重载,则只有两个子程序具有相同的参数和结果类型配置文件时,它们中的一个才可以隐藏另一个子程序。

     

如果子程序的名称,参数关联的数量,实际参数的类型和顺序,形式参数的名称(如果命名关联),则对重载子程序的调用是模棱两可的(因此是错误的) (使用),并且结果类型(对于函数)不足以准确地识别一个(重载)子程序。

解决方案

首先,您可以使用与VHDL标准的早期版本兼容的工具。在-2008之前,std_ulogic_vector和std_logic_vector是两个单独的类型。

第二,当使用-2008兼容设计规范和工具时,可以删除带有std_logic_vector参数的'duplicate'声明以及包主体中的任何匹配子程序规范。除非-2008软件包std_logic_1164中未提供任何子程序规范的某些行为,否则-2008可能不需要此软件包(从其声明中可以看出)。如果行为上没有区别,则不需要StdIO软件包,所有过程都在-2008软件包std_logic_1164中声明。 (您可能会瞥见为什么STD_LOGIC_VECTOR是-2008年的STD_ULOGIC_VECTOR的子类型,它以戏剧性的方式减少了子程序声明和规范的数量。)

资源

如果您的工具实现中未提供-2008程序包主体以及更早版本的程序包主体的来源,here。 (分别为1076-2008_downloads.zip1076.2-1996_downloads.zip)。对于这些错误,仅考虑软件包std_logic_1164中STD_LOGIC_VECTOR的声明(1076-2008_downloads / 1076-2008_machine-可读/ieee/std_logic_1164.vhdl和1076.2-1996_downloads / std_logic_1164.vhdl)。

其他项目

在软件包StdIO的context子句中,不需要std的库子句或std.standard的use子句。

请参见IEEE Std 1076-2008:

13.2设计库。

  

...
  假定除上下文声明和程序包STANDARD之外的每个设计单元均包含以下隐式上下文项作为其context子句的一部分:

     

STD,工作; 使用 STD.STANDARD。全部