Vivado: Verwendung von Interface-Definitionen in RTL-Modulen

OP (Firma: Schweigstill IT) Persönliche Seite #4981423
Lesenswert?

Hallo,

ich habe ein paar Fragen zur Xilinx Vivado 2016.2 und neuer.

Besteht eigentlich bei der Verwendung eines RTL-Moduls in einem 
Blockdesign die Möglichkeit, mit Interfacedefinitionen zu arbeiten?

Oder können Interfaces nur in Verbindung mit IP-Blöcken verwendet 
werden, so dass sich Module nur mit Einzelsignalen (und AXI-Interfaces) 
einsetzen lassen?

Bedeutet das auch, dass man von Modulen aus keine Verbindungen zu 
Interfaces ziehen kann, die z.B. in einer Boardbeschreibung (board.xml, 
part0_pins.xml) definiert sind?

Kann man denn wenigstens, vorzugsweise per TCL oder XDC-Datei, auf die 
vergebenen Namen von Pindefinitionen direkt zugreifen, so in etwa wie:
1
set_property PACKAGE_PIN [get_board_part_pin ADC1_BUSY  [get_ports ch1_adc_busy]

Leider konnte ich bisher keine TCL-Funktion finden, die einem 
"get_board_part_pin" entspricht. Und in der I/O-Port-Definition von 
Vivado werden die Tabellenspalten "Board Part Pin" und "Board Part 
Interface" auch nur für Pins gefüllt, für die eine Verbindung zu 
IP-Blöcken besteht.
Angehängte Dateien:
OP (Firma: Schweigstill IT) Persönliche Seite #4981482
Lesenswert?

Nachtrag:

Ich habe festgestellt, dass ich bei der Suche nach geeigneten 
TCL-Kommandos fälschlicherweise immer get_bd_... statt get_board_... 
getippt hatte und natürlich deswegen nicht fündig wurde. AUA

Mittlerweile habe ich aber auch herausgefunden, dass man die Zuordnung 
anhand der Board Part Pins wie folgt durchführen kann:
1
set_property BOARD_PART_PIN ADC1_BUSY [get_ports ch1_adc_busy]

Allerdings können auf diese Art und Weise nur schon in anderen 
Interfaces verwendete Pins referenziert werden und nicht welche, die nur 
in der part0_pins.xml definiert wurden.
OP (Firma: Schweigstill IT) Persönliche Seite #4982468
Lesenswert?

Ich habe nach etlichen Stunden des Herumprobierens herausgefunden, wie 
es geht. Die Vorgehensweise ist in UG994, Kapitel 12 "Referencing RTL 
Modules" genau beschrieben; vielleicht hätte ich dieses Kapitel 
ausführlicher studieren sollen.

Entscheidend für die Erkennung von Interfaces im Blockdesign ist die 
Verwendung des Attributs X_INTERFACE_INFO in der Architecture des 
RTL-Modules. Bei meinem obigen Beispiel wäre das z.B.
1
entity mid_ch1 is
2
  generic (
3
    -- Users to add parameters here
4

5
    -- User parameters ends
6
    -- Do not modify the parameters beyond this line
7

8
    -- Parameters of Axi Slave Bus Interface S_AXI
9
    C_S_AXI_DATA_WIDTH  : integer := 32;
10
    C_S_AXI_ADDR_WIDTH  : integer := 6
11
  );
12
  port (
13
    -- Users to add ports here
14
        
15
    -- Ports of mid_adc1_ctrl
16
    adc_busy            : in    std_logic;
17
    adc_cnv             : out   std_logic;
18
    adc_rdl_sdi         : out   std_logic;
19

20
    -- User ports ends
21
    -- Do not modify the ports beyond this line
22

23

24
    -- Ports of Axi Slave Bus Interface S_AXI
25
    s_axi_aclk  : in std_logic;
26
    s_axi_aresetn : in std_logic;
27
    s_axi_awaddr  : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
28
    s_axi_awprot  : in std_logic_vector(2 downto 0);
29
    s_axi_awvalid : in std_logic;
30
    s_axi_awready : out std_logic;
31
    s_axi_wdata : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
32
    s_axi_wstrb : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0);
33
    s_axi_wvalid  : in std_logic;
34
    s_axi_wready  : out std_logic;
35
    s_axi_bresp : out std_logic_vector(1 downto 0);
36
    s_axi_bvalid  : out std_logic;
37
    s_axi_bready  : in std_logic;
38
    s_axi_araddr  : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
39
    s_axi_arprot  : in std_logic_vector(2 downto 0);
40
    s_axi_arvalid : in std_logic;
41
    s_axi_arready : out std_logic;
42
    s_axi_rdata : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
43
    s_axi_rresp : out std_logic_vector(1 downto 0);
44
    s_axi_rvalid  : out std_logic;
45
    s_axi_rready  : in std_logic
46
  );
47
end mid_ch1;
48

49
architecture arch_imp of mid_ch1 is
50

51
  ATTRIBUTE X_INTERFACE_INFO : STRING;
52
  ATTRIBUTE X_INTERFACE_INFO of adc_busy: SIGNAL is "schweigstill.de:user:mid_adc1_ctrl:1.0 adc_ctrl busy";
53
  ATTRIBUTE X_INTERFACE_INFO of adc_cnv: SIGNAL is "schweigstill.de:user:mid_adc1_ctrl:1.0 adc_ctrl cnv";
54
  ATTRIBUTE X_INTERFACE_INFO of adc_rdl_sdi: SIGNAL is "schweigstill.de:user:mid_adc1_ctrl:1.0 adc_ctrl rdl_sdi";

Das, was ich leider noch nicht hinbekommen habe, ist die Verknüpfung 
dieses Interfaces mit Hilfe einer Boardbeschreibung. Stattdessen habe 
ich dann die entsprechenden Pins direkt in der vivado_target.xdc 
eingetragen, was dann auch wunderbar funktionierte.
1
set_property PACKAGE_PIN K1 [get_ports ch1_adc_ctrl_busy]
2
set_property PACKAGE_PIN K2 [get_ports ch1_adc_ctrl_cnv]
3
set_property PACKAGE_PIN G2 [get_ports ch1_adc_ctrl_rdl_sdi]

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren