GHDL仿真器不支持vhdl属性而不会出现错误?

时间:2019-06-04 12:52:45

标签: 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   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如下编译上述rtl:

$ 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中的此问题,以便我可以添加这些属性,并且模拟器将忽略它们,而不产生错误吗?

3 个答案:

答案 0 :(得分:3)

请参见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_rtl_island.vhdl
vivado_rtl_island.vhdl:28:33:warning: attribute for port "s_paddr" must be specified in the entity [-Wspecs]
vivado_rtl_island.vhdl:29:33:warning: attribute for port "s_psel" must be specified in the entity [-Wspecs]
vivado_rtl_island.vhdl:30:33:warning: attribute for port "s_penable" must be specified in the entity [-Wspecs]
vivado_rtl_island.vhdl:31:33:warning: attribute for port "s_pwrite" must be specified in the entity [-Wspecs]
vivado_rtl_island.vhdl:32:33:warning: attribute for port "s_pwdata" must be specified in the entity [-Wspecs]
vivado_rtl_island.vhdl:33:33:warning: attribute for port "s_pready" must be specified in the entity [-Wspecs]
vivado_rtl_island.vhdl:34:33:warning: attribute for port "s_prdata" must be specified in the entity [-Wspecs]
vivado_rtl_island.vhdl:35:33:warning: attribute for port "s_pslverr" must be specified in the entity [-Wspecs]

您可以添加命令行标志-frelaxed-rules,错误将转换为警告。

默认版本-2008更改了默认的ghdl行为。您会注意到,没有指定--std=08的默认标准遵从性是--std=93c,其中包括-frelaxed-rules,否则与`--std = 93(-1993)兼容。没有-2008修订版,其中包含宽松的规则。

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

我们发现Modelsim的各种实例都在有效地试图通过市场份额的影响来操纵标准(它们有一个命令行-pendanticerrors参数将许多警告变为错误)。

ghdl的开发遵循了他们的领导方式,但严格遵守标准是规范(尽管默认情况下为--std=93c,命令行参数启用警告而不是错误。

这样做的原因是,实施VHDL的人员倾向于按照标准进行操作,而不是对具有最大市场份额的供应商进行反向工程。

在ghdl documentation中,-frelaxed-rules描述可能不完整。在VHDL standards的各节以及其他各节中都有提及。

Xilinx已意识到此问题。毫无疑问,Modelsim知道它们与标准有何不同,并且目前还没有供应商参与VHDL标准的修订过程。

浏览ghdl源代码树ghdl-0.35已于2017年12月14日发布,Issue 525修复了Feb 7, 2018(请参阅src / vhdl / sem_specs.adb)以向其中添加端口属性具有-frelaxed-rules的体系结构声明部分,无论--std=08为何,都提供当前功能(在ghdl-0.36开发周期中)。

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

答案 1 :(得分:1)

您显然正在使用VHDL2008。

在VHDL 2008中,实体端口属性必须进入实体定义,即,您需要在end entity语句之前移动属性。

答案 2 :(得分:0)

使用GHDL进行这样的编译:

ghdl.exe -a -frelaxed-rules --std=08 --ieee=synopsys --work=work ./vivado_rtl_island.vhd

并将端口属性移至“架构”块... 那么它将与Xilinx Vivado和GHDL保持一致。