GHDL模拟器不';不支持没有错误的vhdl属性?

GHDL模拟器不';不支持没有错误的vhdl属性?,vhdl,fpga,xilinx,vivado,ghdl,Vhdl,Fpga,Xilinx,Vivado,Ghdl,我编写了一些vivado RTL,然后向实体的端口添加了一些vhdl属性,以定义Xilinx vivado工具的接口,如下所示: library ieee; use ieee.std_logic_1164.all; entity vivado_rtl_island is port( -- Clocks i_m50_clk :in std_logic; i_m50_rst :in

我编写了一些vivado RTL,然后向实体的端口添加了一些vhdl属性,以定义Xilinx vivado工具的接口,如下所示:

library ieee;
use     ieee.std_logic_1164.all;

entity vivado_rtl_island is

port(
    -- Clocks
    i_m50_clk                    :in   std_logic;
    i_m50_rst                    :in   std_logic;                                           

    -- APB Command Inteface
    s_paddr                  :in  std_logic_vector(31 downto 0);   
    s_psel                   :in  std_logic;                       
    s_penable                :in  std_logic;                       
    s_pwrite                 :in  std_logic;                       
    s_pwdata                 :in  std_logic_vector(31 downto 0);   
    s_pready                 :out std_logic;                       
    s_prdata                 :out std_logic_vector(31 downto 0);   
    s_pread                  :out std_logic;
    s_pslverr                :out std_logic
);

end entity;

architecture rtl of vivado_rtl_island is
  -- Define APB Interface for "Vivado IP Integrator"
  ATTRIBUTE X_INTERFACE_INFO:              STRING;
  ATTRIBUTE X_INTERFACE_INFO of s_paddr:   SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PADDR";
  ATTRIBUTE X_INTERFACE_INFO of s_psel:    SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PSEL";
  ATTRIBUTE X_INTERFACE_INFO of s_penable: SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PENABLE";
  ATTRIBUTE X_INTERFACE_INFO of s_pwrite:  SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PWRITE";
  ATTRIBUTE X_INTERFACE_INFO of s_pwdata:  SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PWDATA";
  ATTRIBUTE X_INTERFACE_INFO of s_pready:  SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PREADY";
  ATTRIBUTE X_INTERFACE_INFO of s_prdata:  SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PRDATA";
  ATTRIBUTE X_INTERFACE_INFO of s_pslverr: SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PSLVERR";
begin

 end architecture;
$ ghdl -a --std=08 --ieee=synopsys --work=work  vivado_rtl_island.vhd
在这里,我尝试使用GHDL编译上述rtl,如下所示:

library ieee;
use     ieee.std_logic_1164.all;

entity vivado_rtl_island is

port(
    -- Clocks
    i_m50_clk                    :in   std_logic;
    i_m50_rst                    :in   std_logic;                                           

    -- APB Command Inteface
    s_paddr                  :in  std_logic_vector(31 downto 0);   
    s_psel                   :in  std_logic;                       
    s_penable                :in  std_logic;                       
    s_pwrite                 :in  std_logic;                       
    s_pwdata                 :in  std_logic_vector(31 downto 0);   
    s_pready                 :out std_logic;                       
    s_prdata                 :out std_logic_vector(31 downto 0);   
    s_pread                  :out std_logic;
    s_pslverr                :out std_logic
);

end entity;

architecture rtl of vivado_rtl_island is
  -- Define APB Interface for "Vivado IP Integrator"
  ATTRIBUTE X_INTERFACE_INFO:              STRING;
  ATTRIBUTE X_INTERFACE_INFO of s_paddr:   SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PADDR";
  ATTRIBUTE X_INTERFACE_INFO of s_psel:    SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PSEL";
  ATTRIBUTE X_INTERFACE_INFO of s_penable: SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PENABLE";
  ATTRIBUTE X_INTERFACE_INFO of s_pwrite:  SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PWRITE";
  ATTRIBUTE X_INTERFACE_INFO of s_pwdata:  SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PWDATA";
  ATTRIBUTE X_INTERFACE_INFO of s_pready:  SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PREADY";
  ATTRIBUTE X_INTERFACE_INFO of s_prdata:  SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PRDATA";
  ATTRIBUTE X_INTERFACE_INFO of s_pslverr: SIGNAL is "xilinx.com:interface:apb:1.0 APB_S PSLVERR";
begin

 end architecture;
$ ghdl -a --std=08 --ieee=synopsys --work=work  vivado_rtl_island.vhd
GHDL产生以下错误:

vivado_rtl_island.vhd:28:33: no "s_paddr" for attribute specification
vivado_rtl_island.vhd:29:33: no "s_psel" for attribute specification
vivado_rtl_island.vhd:30:33: no "s_penable" for attribute specification
vivado_rtl_island.vhd:31:33: no "s_pwrite" for attribute specification
vivado_rtl_island.vhd:32:33: no "s_pwdata" for attribute specification
vivado_rtl_island.vhd:33:33: no "s_pready" for attribute specification
vivado_rtl_island.vhd:34:33: no "s_prdata" for attribute specification
vivado_rtl_island.vhd:35:33: no "s_pslverr" for attribute specification
然而,当我用modelsim编译这个时,它不会产生错误


有没有人知道如何在GHDL中解决这个问题,这样我就可以添加这些属性,模拟器就会忽略它们,而不会产生错误?

显然,您使用的是VHDL2008


使用VHDL 2008,实体端口属性必须进入实体定义,即需要在
结束实体
语句之前移动属性。

参见IEEE Std 1076-2008 7.2属性规范,第9段:

实体声明、体系结构、配置或包的属性规范应立即出现在该声明的声明部分中。类似地,设计单元、子程序、块语句或包的接口对象属性的属性规范应立即出现在该设计单元、子程序、块语句或包的声明部分中。类似地,设计单元、子程序、块语句或包的接口对象属性的属性规范应立即出现在该设计单元、子程序、块语句或包的声明性部分中

设计单元是实体声明(3.2实体声明),是主要单元(13.1设计单元)。该语义限制已在每个IEEE Std 1076修订版中实施(-1987年至-2008年,在5.2属性规范中发现的-2008之前)。Modelsim“编译”您的规范是错误的

Xilinx的Vivado合成历史上利用了Modelsim行为。有趣的是,Vivado不一致地遵守了上面7.2中引用的第一句话的语义要求,这在早期版本中也有发现,但在第二个版本中没有。您可以在实体声明部分中声明实体上的属性,而Vivado至少可以在体系结构声明部分中指定端口上的属性

使用ghdl时不会丢失所有信息。在分析过程中可以传递一个命令行参数,以放宽各种规则,以匹配Modelsim的行为,而第三方工具依赖于该行为

ghdl-a--std=08--ieee=synopsys-frelaxed rules--work=work vivado\u rtl\u island.vhdl
vivado_rtl_island.vhdl:28:33:警告:必须在实体[-Wspecs]中指定端口“s_paddr”的属性
vivado_rtl_island.vhdl:29:33:警告:必须在实体[-Wspecs]中指定端口“s_psel”的属性
vivado_rtl_island.vhdl:30:33:警告:必须在实体[-Wspecs]中指定端口“s_penable”的属性
vivado_rtl_island.vhdl:31:33:警告:必须在实体[-Wspecs]中指定端口“s_pwrite”的属性
vivado_rtl_island.vhdl:32:33:警告:必须在实体[-Wspecs]中指定端口“s_pwdata”的属性
vivado_rtl_island.vhdl:33:33:警告:必须在实体[-Wspecs]中指定端口“s_pready”的属性
vivado_rtl_island.vhdl:34:33:警告:必须在实体[-Wspecs]中指定端口“s_prdata”的属性
vivado_rtl_island.vhdl:35:33:警告:必须在实体[-Wspecs]中指定端口“s_pslverr”的属性
您可以添加命令行标志
-frelaxed rules
,错误将转换为警告

标准修订版-2008的默认ghdl行为已更改。您会注意到,在不指定
--std=08
的情况下,默认的标准符合性是
--std=93c
,其中包括
-frelaxed规则
,并且与“---std=93(-1993)兼容。没有包含宽松规则的-2008修订版

语义限制背后的原因可能源于领先的(当时是1987年)供应商无法在没有直接访问端口声明的情况下实现在端口上指定用户属性。虽然该供应商可能不再提供VHDL产品,但限制仍然存在

我们发现Modelsim的各种实例都试图通过市场份额的影响来有效地引导标准(它们有一个命令行
-pendanticerrors
参数,将大量警告更改为错误)

ghdl的开发遵循他们的领导,例外情况是严格遵守标准(默认情况下,
--std=93c
),命令行参数启用警告而不是错误

这样做的理由是,那些实现VHDL的人往往是从标准出发,而不是通过对市场份额最大的供应商进行逆向工程来实现

ghdl中的-frelaxed规则描述可能不完整。在上的章节以及其他章节中都有提及

Xilinx已经意识到了这个问题。Modelsim无疑知道它们与标准的不同之处,目前VHDL标准修订过程中没有供应商参与

通过查看ghdl源代码树,ghdl-0.35于2017年12月14日发布,并修复了(参见src/vhdl/sem_specs.adb),使用
-frelaxed rules
向体系结构声明部分添加端口属性,以提供当前功能,而不管
--std=08
(在ghdl-0.36开发周期内)


另请参见github上与GHDL不同的端口上的Xilinx Vivado和Modelsim支持属性,其中OP寻求第二种意见,说明此答案有效。

使用GHDL编译如下:

ghdl.exe -a -frelaxed-rules --std=08 --ieee=synopsys --work=work ./vivado_rtl_island.vhd
并将端口属性移动到架构块。。。
然后,它将与Xilinx Vivado和GHDL保持一致。

IEEE Std 1076-2008 7.2属性规范,第9段“…类似地,