2

我编写了一些 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 中解决这个问题,以便我可以添加这些属性,模拟器会忽略它们而不产生错误?

4

3 回答 3

5

参见 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文档中的 -frelaxed-rules 描述可能不完整。在有关VHDL 标准的部分以及其他部分中可以找到提及。

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

查看 ghdl 源代码树 ghdl-0.35 于 2017 年 12 月 14 日发布,第 525 期在2018 年 2 月 7 日进行了修复(参见 src/vhdl/sem_specs.adb),将端口属性添加到架构声明部分-frelaxed-rules以提供无论当前的功能如何--std=08(在 ghdl-0.36 开发周期中)。

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

于 2019-06-05T02:25:33.430 回答
1

显然,您正在使用 VHDL2008。

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

于 2019-06-04T14:56:18.347 回答
0

用 GHDL 像这样编译:

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

并将端口属性移动到架构块......然后它将与 Xilinx Vivado 和 GHDL 一致地工作。

于 2019-06-12T17:27:17.070 回答