Zephyrnet-logo

Demystificeren van BDF-tabelprogrammering voor Slave Bridge-adresvertalingen voor AXI-adres

Datum:

Vanaf QDMA v4.0 worden adresvertalingen voor een AXI-adres uitgevoerd op basis van BDF-tabelprogrammering.

Deze BDF-tabelgegevens kunnen worden geprogrammeerd via de AXI4-Lite Slave CSR-interface, s_axil_csr_*. Er zijn 8 vensters aanwezig, vergelijkbaar met de 8 BAR's op een PCIe-bus. Elke invoer in de BDF-tabelprogrammering vertegenwoordigt één venster.

In deze blog wordt dieper ingegaan op de programmeervoorbeelden voor BDF-tabellen die worden gegeven in (PG302) (v4.0). 

Voorbeeld 1: BAR Grootte van 64 KB, met 1 venster

Window 0: BAR-grootte is 4 KB met adresvertaling van 0xF voor bits [15:12]. AXI-adresbusbreedte = 64 bits.

1.PNG

AXI BAR-maat : 64K = (64*1024) – 1 = 65535 = 0xFFFF = 16'b1111_1111_1111_1111 = [15:0] bits
Om 64K AXI BAR-grootte te adresseren, zijn [15:0] bits vereist in de AXI-adresbus. Adresvertaling voor [63:16] bits wordt ingesteld in de GUI. In dit voorbeeld is [63:16] = 0x76AA.
Basisadres : 0x0000_0000_76AA_0000
Hoog adres : 0x0000_0000_76AA_{AXI BAR-maat} = 0x0000_0000_76AA_FFFF

2.png

Er kunnen maximaal 8 vensters zijn. De maximale grootte voor een venster kan dus als volgt worden berekend:

Venstergrootte = AXI BAR-grootte / 8 = 64K / 8 = 8K = (8*1024) -1 = 8191 = 13'b1_1111_1111_1111 = [12:0] bits

Maar voor dit voorbeeld is alleen een BAR-grootte van 4K vereist. Daarom is voor een venstergrootte van 4K 4K/4K = 0x1 is geprogrammeerd op 0x2430 bits [25:0].

BAR-grootte van 4K = (4*1024)-1 = 4095 = 12'b1111_1111_1111 = [11:0] bits

Adresvertaling voor [15:12] bits is geprogrammeerd op 0x2420 en 0x2424. In dit voorbeeld is de adresvertaling voor bits [15:12] ingesteld op 0xF. Als bits [15:12] zijn ingesteld op 0xF en de rest van de LSB's zijn ingesteld op 0 (nul), resulteert dit in 16'b1111_0000_0000_0000, wat in hexadecimaal is 0x0000_F000.

3.PNG

Voor dit voorbeeld wordt een AXI-adres van 0x0000_0000_76AA_0101 een adres vertaald naar 0x0000_0000_76AA_F101.

4.PNG

Voorbeeld 2: BAR Grootte van 64 KB, met 1 venster

Window 0: BAR-grootte is 8 KB met adresvertaalwaarde van 'b110 voor bits [15:13]. AXI-adresbusbreedte = 64 bits

5.PNG

AXI BAR-maat : 64K = (64*1024) – 1 = 65535 = 0xFFFF = 16'b1111_1111_1111_1111 = [15:0] bits

Om 64K AXI BAR Size te adresseren, zijn [15:0] bits vereist in de AXI-adresbus. Adresvertaling voor [63:16] bits wordt ingesteld in de GUI. In dit voorbeeld is [63:16] = 0x76AA.

Basisadres : 0x0000_0000_76AA_0000

Hoog adres : 0x0000_0000_76AA_{AXI BAR-maat} = 0x0000_0000_76AA_FFFF

6.png

Er kunnen maximaal 8 vensters zijn. De maximale grootte voor een venster kan dus als volgt worden berekend:

Venstergrootte = AXI BAR-grootte / 8 = 64K / 8 = 8K = (8*1024) -1 = 8191 = 13'b1_1111_1111_1111 = [12:0] bits

Voor dit voorbeeld is een BAR-grootte van 8K vereist. Voor een venstergrootte van 8K geldt dus 8K/4K = 0x2 is geprogrammeerd op 0x2430 bits [25:0].

BAR-grootte van 8K = (8*1024)-1 = 8191 = 13'b1_1111_1111_1111 = [12:0] bits

Adresvertaling voor [15:13] bits is geprogrammeerd op 0x2420 en 0x2424. In dit voorbeeld is de adresvertaling voor bits [15:13] ingesteld op 110. Als bits [15:13] zijn ingesteld op 110 en de rest van de LSB's zijn ingesteld op 0 (nul), resulteert dit in 16'b1100_0000_0000_0000, wat in hexadecimaal is 0x0000_C000.

7.PNG

Voor dit voorbeeld wordt het AXI-adres 0x0000_0000_76AA_0011 het adres vertaald naar 0x0000_0000_76AA_C011.

8.PNG

Voorbeeld 3: BAR-grootte van 32 GB en 4 vensters van verschillende groottes

Window 0: BAR-grootte is 4 KB met adresvertaling van 0xAAAAA voor bits [34:12].

Window 1: BAR-grootte is 4 GB zonder adresvertaling op het venster.

Window 2: BAR-grootte is 64 KB met adresvertaling van 0xBBBB voor bits [34:16].

Window 3: BAR-grootte is 1 GB met adresvertaling van 11111 voor bits [34:30].

AXI BAR-maat : 32GB = (32*1024*1024*1024) – 1 = 34359738367 = 0x7_FFFF_FFFF = 35’b111_1111_1111_1111_1111_1111_1111_1111_1111 = [34:0] bits

Om 32 GB AXI BAR-grootte te adresseren, zijn [34:0] bits vereist in de AXI-adresbus. Adresvertaling voor [63:35] bits wordt ingesteld in de GUI. In dit voorbeeld is [63:35] = 0xAED.

Basisadres : 0x0000_AED0_0000_0000

Hoog adres : 0x0000_AED{AXI BAR-maat} = 0x0000_AED7_FFFF_FFFF

9.png

Er kunnen maximaal 8 vensters zijn. De maximale grootte voor een venster kan als volgt worden berekend:

Venstergrootte = AXI BAR-grootte / 8 = 32GB / 8 = 4GB = (4*1024*1024*1024) -1 = 4294967295 = 13'b1111_1111_1111_1111_1111_1111_1111_1111 = [31:0] bits

In dit voorbeeld worden 4 Windows gebruikt. Elk venster moet een ander startadres voor de BDF-tabel hebben en wordt als volgt berekend:

Startadres voor voorgerecht van de BDF-tafel = 0x2420 + (0x20 * i), waarbij i = tafeltoegangsnummer

Voor venster 0:

AXI-adresbusbreedte = 64 bits

10.PNG

Voor Window-0 is een BAR-grootte van 4K vereist. Daarom geldt voor een venstergrootte van 4K 4K/4K = 0x1 is geprogrammeerd op 0x2430 bits [25:0].

BAR-grootte van 4K = (4*1024)-1 = 4095 = 12'b1111_1111_1111 = [11:0] bits

Adresvertaling voor [34:12] bits is geprogrammeerd op 0x2420 en 0x2424. Adresvertaling voor bits [31:12] is ingesteld op 0xAAAA_A en bits [34:32] zijn ingesteld op 'b111.

11.PNG

12.PNG

Als het adres van AXI 0x0000_AED0_0000_0F11 is, valt het binnen het adresbereik van Venster 0 en ook binnen het adresbereik van 4 KB. Daarom wordt het vertaald naar 0x0000_AED7_AAAA_AF11.

Voor venster 1:

AXI-adresbusbreedte = 64 bits

13.PNG

Voor venster 1 is een BAR-grootte van 4 GB vereist. Daarom geldt voor een venstergrootte van 4 GB (4*1024*1024)K/4K = 0x10_0000 is geprogrammeerd op 0x2450 bits [25:0]. Het startadres van de BDF-tabel voor venster 1= 0x2420 + (0x20 * 1) = 0x2440.

BAR-grootte van 4 GB = (4*1024*1024*1024)-1 = 4294967295 = 32'hFFFF_FFFF = [31:0] bits

Adresvertaling voor [34:32] bits is geprogrammeerd op 0x2440 en 0x2444. Adresvertaling op 0x2440 is niet vereist omdat een BAR-grootte van 4GB alle bereiken van Venster 1 dekt. ​​Adresvertaling voor bits [34:32] is ingesteld op 0x5 op 0x2444.

14.PNG

15.PNG

Als het slave-adres van AXI 0x0000_AED1_00EA_0F11 is, valt dit binnen het adresbereik van Venster 1. De BAR-grootte van Venster 1 is 4GB en bestrijkt dus het gehele bereik van Venster 1. Het AXI-adres zal daarom vertaald worden naar 0x0000_AED5_00EA_0F11.

Voor venster 2:

AXI-adresbusbreedte = 64 bits

16.PNG

Voor Venster 2 is een BAR-grootte van 64 KB vereist. Voor een venstergrootte van 64 KB geldt dus 64 K/4 K = 0x10 is geprogrammeerd op 0x2470 bits [25:0].

Het startadres van de BDF-tabel voor venster 2 = 0x2420 + (0x20 * 2) = 0x2460.

BAR Grootte van 64 KB  = (64*1024)-1 = 65535= 16'hFFFF = [15:0] bits

Adresvertaling voor [34:16] bits is geprogrammeerd op 0x2460 en 0x2464. Adresvertaling voor bits [31:16] is ingesteld op 0xBBBB en bits [34:32] zijn ingesteld op 'b111.

17.PNG

18.PNG

Als het adres van AXI 0x0000_AED2_0000_051A is, valt het binnen het adresbereik van Venster 2 en ook binnen de BAR-grootte van 64 KB voor Venster 2. Daarom wordt het AXI-adres vertaald naar 0x0000_AED7_BBBB_051A.

Voor venster 3:

AXI-adresbusbreedte = 64 bits

19.PNG

Voor Windows 3 is een BAR-grootte van 1 GB vereist.

Daarom geldt voor een venstergrootte van 1 GB (1*1024*1024)K/4K = 0x4_0000 is geprogrammeerd op 0x2490 bits [25:0].

Het startadres van de BDF-tabel voor venster 3 = 0x2420 + (0x20 * 3) = 0x2480.

BAR-grootte van 1 GB  = (1*1024*1024*1024)-1 = 1073741823= 30'h3FFF_FFFF = [29:0] bits

Adresvertaling voor bits [31:30] is geprogrammeerd op 0x2480 en adresvertaling voor bits [34:32] is geprogrammeerd op 0x2484. Adresvertaling voor bits [31:30] is ingesteld op 'b11 en adresvertaling voor bits [34:32] is ingesteld op 'b111 wat betekent dat 0xC000_0000 is geprogrammeerd op 0x2480 en 0x0000_0007 is geprogrammeerd op 0x2480.

20.PNG

21.PNG

Als het slave-adres van AXI 0x0000_AED3_3F2C_0DAC is, valt dit binnen het adresbereik van venster 3 en ook binnen de BAR-grootte van 1 GB voor venster 3. Daarom wordt het slave-adres als volgt vertaald:

 AED3_3F2C_0DAC = AED3_<'b0011>_F2C_0DAC

Hier is de '3' in het groen het adres vertaald naar '7' omdat we het volgende hebben geprogrammeerd:

22.PNG

Van de 4 binaire bits in '3' in rood, maken de twee LSB's (hier 11) deel uit van het bestemmingsadres en mogen daarom niet in het adres worden vertaald. Alleen de twee MSB's (hier 00) worden in adres vertaald volgens de volgende geprogrammeerde waarde:

23.PNG

Dit levert het volgende op als het uiteindelijke adres, vertaald adres.

€7_<'b1111>_F2C_0DAC = AED7_FF2C_0DAC

PlatoAi. Web3 opnieuw uitgevonden. Gegevensintelligentie versterkt.
Klik hier om toegang te krijgen.

Bron: https://forums.xilinx.com/t5/Design-and-Debug-Techniques-Blog/Demystifying-BDF-Table-programming-for-Slave-Bridge-Address/ba-p/1260264

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?