При попытке разместить модуль RTL вы должны получить множество предупреждений в Vivado:
ПРЕДУПРЕЖДЕНИЕ: [IP_Flow 19-529] Карта портов 'PADDR': порт с именем 'rtl_top' не существует.
ПРЕДУПРЕЖДЕНИЕ: [IP_Flow 19-571] Шинный интерфейс 'S_APB_GP0': физический порт "rtl_top" карты портов не существует
ПРЕДУПРЕЖДЕНИЕ: [IP_Flow 19-1965] Шинный интерфейс 'S_APB_GP0': отсутствует сопоставление порта с требуемым логическим портом "PSEL" абстракции шины "xilinx.com:interface:apb_rtl:1.0".
Перемещение спецификации атрибута в раздел architecture
(оставление объявления атрибута внутри объявления entity
) дает лучшие результаты:
Получено с:
library ieee;
use ieee.std_logic_1164.all;
entity rtl_top is
port(
-- Clocks
axi_aclk :in std_logic;
axi_arst_n :in std_logic;
-- Peripheral Servant Port: from ZYNQ Master Port
-- (Connect to ZYNQ M_AXI_GPO -> axi-interconnect -> axi-apb-bridge)
s_apb_gp0_paddr :in std_logic_vector(31 downto 0);
s_apb_gp0_psel :in std_logic;
s_apb_gp0_penable :in std_logic;
s_apb_gp0_pwrite :in std_logic;
s_apb_gp0_pwdata :in std_logic_vector(31 downto 0);
s_apb_gp0_pready :out std_logic;
s_apb_gp0_prdata :out std_logic_vector(31 downto 0);
s_apb_gp0_pslverr :out std_logic;
--Peripheral DMA port: to ZYNQ Servant Port S_AXI_GP0
-- (actually, don't connect it, its just a placeholder)
m_axi_gp0_araddr :out std_logic_vector(31 downto 0);
m_axi_gp0_arburst :out std_logic_vector(1 downto 0);
m_axi_gp0_arcache :out std_logic_vector(3 downto 0);
m_axi_gp0_arid :out std_logic_vector(5 downto 0);
m_axi_gp0_arlen :out std_logic_vector(3 downto 0);
m_axi_gp0_arlock :out std_logic_vector(1 downto 0);
m_axi_gp0_arprot :out std_logic_vector(2 downto 0);
m_axi_gp0_arqos :out std_logic_vector(3 downto 0);
m_axi_gp0_arready :in std_logic;
m_axi_gp0_arsize :out std_logic_vector(2 downto 0);
m_axi_gp0_arvalid :out std_logic;
m_axi_gp0_awaddr :out std_logic_vector(31 downto 0);
m_axi_gp0_awburst :out std_logic_vector(1 downto 0);
m_axi_gp0_awid :out std_logic_vector(5 downto 0);
m_axi_gp0_awprot :out std_logic_vector(2 downto 0);
m_axi_gp0_awqos :out std_logic_vector(3 downto 0);
m_axi_gp0_awready :in std_logic;
m_axi_gp0_awvalid :out std_logic;
m_axi_gp0_bid :in std_logic_vector(5 downto 0);
m_axi_gp0_bready :out std_logic;
m_axi_gp0_bresp :in std_logic_vector(1 downto 0);
m_axi_gp0_bvalid :in std_logic;
m_axi_gp0_rdata :in std_logic_vector(31 downto 0);
m_axi_gp0_rid :in std_logic_vector(5 downto 0);
m_axi_gp0_rlast :in std_logic;
m_axi_gp0_rready :out std_logic;
m_axi_gp0_rresp :in std_logic_vector(1 downto 0);
m_axi_gp0_rvalid :in std_logic;
m_axi_gp0_wdata :out std_logic_vector(31 downto 0);
m_axi_gp0_wid :out std_logic_vector(5 downto 0);
m_axi_gp0_wlast :out std_logic;
m_axi_gp0_wready :in std_logic;
m_axi_gp0_wstrb :out std_logic_vector(3 downto 0);
m_axi_gp0_wvalid :out std_logic
);
ATTRIBUTE X_INTERFACE_INFO :STRING;
end entity;
architecture rtl of rtl_top is
ATTRIBUTE X_INTERFACE_INFO of s_apb_gp0_paddr :SIGNAL is "xilinx.com:interface:apb:1.0 S_APB_GP0 PADDR";
ATTRIBUTE X_INTERFACE_INFO of s_apb_gp0_psel :SIGNAL is "xilinx.com:interface:apb:1.0 S_APB_GP0 PSEL";
ATTRIBUTE X_INTERFACE_INFO of s_apb_gp0_penable :SIGNAL is "xilinx.com:interface:apb:1.0 S_APB_GP0 PENABLE";
ATTRIBUTE X_INTERFACE_INFO of s_apb_gp0_pwrite :SIGNAL is "xilinx.com:interface:apb:1.0 S_APB_GP0 PWRITE";
ATTRIBUTE X_INTERFACE_INFO of s_apb_gp0_pwdata :SIGNAL is "xilinx.com:interface:apb:1.0 S_APB_GP0 PWDATA";
ATTRIBUTE X_INTERFACE_INFO of s_apb_gp0_pready :SIGNAL is "xilinx.com:interface:apb:1.0 S_APB_GP0 PREADY";
ATTRIBUTE X_INTERFACE_INFO of s_apb_gp0_prdata :SIGNAL is "xilinx.com:interface:apb:1.0 S_APB_GP0 PRDATA";
ATTRIBUTE X_INTERFACE_INFO of s_apb_gp0_pslverr :SIGNAL is "xilinx.com:interface:apb:1.0 S_APB_GP0 PSLVERR";
begin
--ZYNQ API Slave Port Placeholder
s_apb_gp0_pready <= '0';
s_apb_gp0_prdata <= (others => '0');
s_apb_gp0_pslverr <= '0';
--ZYNQ Axi MASTER Port Placeholder
m_axi_gp0_araddr <= (others => '0');
m_axi_gp0_arburst <= (others => '0');
m_axi_gp0_arcache <= (others => '0');
m_axi_gp0_arid <= (others => '0');
m_axi_gp0_arlen <= (others => '0');
m_axi_gp0_arlock <= (others => '0');
m_axi_gp0_arprot <= (others => '0');
m_axi_gp0_arqos <= (others => '0');
m_axi_gp0_arsize <= (others => '0');
m_axi_gp0_awaddr <= (others => '0');
m_axi_gp0_awburst <= (others => '0');
m_axi_gp0_awid <= (others => '0');
m_axi_gp0_awprot <= (others => '0');
m_axi_gp0_awqos <= (others => '0');
m_axi_gp0_wdata <= (others => '0');
m_axi_gp0_wid <= (others => '0');
m_axi_gp0_wstrb <= (others => '0');
m_axi_gp0_arvalid <= '0';
m_axi_gp0_awvalid <= '0';
m_axi_gp0_bready <= '0';
m_axi_gp0_rready <= '0';
m_axi_gp0_wlast <= '0';
m_axi_gp0_wvalid <= '0';
end architecture;
Правильно, мне даже не нужно было включать информацию об интерфейсе для интерфейса AXI, чтобы получить красивый симпатичный порт. (Я бы все еще оставил это, просто любопытно, как Vivado может справиться с отсутствием информации об интерфейсе для AXI.) Я думаю, Vivado распознает интерфейсы AXI только по имени, поскольку Xilinx теперь так сильно любит AXI.
Что меня удивляет, так это то, что сохранение спецификации атрибута в разделе architecture
, похоже, нарушает спецификацию VHDL, как указано в Ответе на ваш последний атрибут Вопрос . user1155120 был прав, хотя, похоже, что Vivado придерживается неправильного поведения.