data2mem zur Mitarbeit bewegen

Gast #4657731
Lesenswert?

Hallo Forum!

Ich möchte mir unter Xilinx-ISE mit data2mem ein gültiges bmm-File bauen 
lassen für einen BRAM mit 64k x 32 Bits.

Dazu verwende ich die folgende Kommandozeile:
1
$ data2mem -mf   p mein_soc PPC405 0   a mein_ram w 0x0000 32   s RAMB16 0x10000 2   mein_block   -o p mein.bmm

Leider bekomme ich die folgende Fehlermeldung:
1
ERROR:Data2MEM:11 - Unexpected symbol '0', 'ADDRESS_MAP 'p' processor type name' expected.
2
data2mem -mf p mein_soc PPC405 0 a mein_ram w 0x0000 32 s RAMB16 0x10000 2 mein_block -o p mein.bmm
3
                               ^

Und das, obwohl ich laut Hilfe die richtige Syntax verwende (und der 
Prozessortyp ja schon da steht...):
1
$ data2mem -help mf
2
...    
3
    The Address Space Definition group items mean:
4

5
    -mf <p PNAME PTYPE PID
6
            <a ANAME ['w' | 'b'] ASTART BWIDTH
7
                <s MTYPE BSIZE DWIDTH IBASE...>...>...>
8

9
       'p'    = The following three items define an Address Map definition.
10
                As many Address Map definitions are repeated back-to-back.
11
                An Address Map definition must have at least one Address
12
                Space definition.
13

14
       PNAME  = Alpha-numeric name of the Processor Map.
15

16
       PTYPE  = Alpha-numeric name of the processor type in the Address Map.
17
                Legal processor types consists of 'PPC405', 'MICROBLAZE',
18
                and 'PICOBLAZE'.
19

20
       PID    = Numeric ID of the Address Map.
21
...

Die wenigen Beispiele, die ich im Netz gefunden habe, verwenden auch 
diese Syntax.

Hat jemand noch eine ältere ISE-Version, bei der das evtl. klappt?
Wenn ja, wäre es nett, das bmm hier anzuhängen.

Alternativ sind Vorschläge willkommen, um data2mem lauffähig zu 
machen...

TIA
Gast #4659550
Lesenswert?

Moin,

ich erinnere mich dunkel, dass die Hilfe in data2mem nicht mehr so ganz 
korrekt war.
Was bei mir funktioniert, ist:

1) foo.bmm schreiben, in Projekt einbinden
2) Tools generieren daraus foo_bd.bmm (siehe Xilinx-Doku dazu)
3) ELF-File in SRAM-Bitstream mergen. Hier mal copy/paste die 
Makefile-Regel dazu:
1
$(PLATFORM)_fw.bit: fw/$(PLATFORM)_top.bit boot.elf
2
        $(DATA2MEM) -bd boot.elf -bm foo_bd.bmm -bt $< \
3
        -bx /tmp \
4
        -o b $@

Gruss,

- Strubi


P.S. Poste doch sonst mal dein BMM.
Gast #4660585
Lesenswert?

Hallo Strubi,

Ab Punkt 2 funktioniert es erwartungsgemäß.
Die Schwierigkeit liegt in Punkt 1, dem Erstellen der richtigen 
.bmm-Datei.
Eigentlich sollte die mit dem Parameter -mf auch von data2mem erstellt 
werden können.

Für einen Blockram mit 512x32 (words x bits) sieht die Datei so aus:
1
ADDRESS_SPACE my_ram RAMB16 [0x00000000:0x000007ff]
2
    BUS_BLOCK
3
        ram_instance/Mram_ram [31:0];
4
    END_BUS_BLOCK;
5
END_ADDRESS_SPACE;

Getestet habe ich es, indem ich mir Zufallszahlen (bin + mem) generiert 
habe:
1
$ srec_cat -generate 0x0000 0x0800 -random -o data.bin -binary
2

3
$ echo "@0" > data.mem
4
$ xxd -plain data.bin >> data.mem

Dann kann ich nach der Synthese (und data2mem) die Bitfiles vergleichen:
1
$ xxd fw/$(PLATFORM)_top.bit > $(PLATFORM)_top.xxd
2
$ xxd $(PLATFORM)_fw.bit     > $(PLATFORM)_fw.xxd
3

4
$ diff  $(PLATFORM)_top.xxd  $(PLATFORM)_fw.xxd  |  wc -l
Wenn beide bit (bzw. xxd)-Dateien identisch sind, sind die bmm-Dateien 
korrekt.


Die bmm-Datei für ein 1024x32 RAM ist z.B. nicht korrekt:
1
# !!! NOT working !!!
2
ADDRESS_SPACE my_ram RAMB16 [0x00000000:0x00000fff]
3
    BUS_BLOCK
4
        ram_instance/Mram_ram2 [31:16];
5
        ram_instance/Mram_ram1 [15: 0];
6
    END_BUS_BLOCK;
7
END_ADDRESS_SPACE;
8
# !!! NOT working !!!
Gast #4662841
Lesenswert?

Xilinx-generverter schrieb:
> Die bmm-Datei für ein 1024x32 RAM ist z.B. nicht korrekt:

Neue Erkenntnisse:
Bei 1024x32 (2xRAMB16) und bei 2048x32 (4xRAMB16) werden von der 
Synthese die Paritybits des BRAM (unnötigerweise) mit genutzt.
Das kann man im 'technologie view' und auch im FPGA-Editor sehen.

Das hat die folgenden Konsequenzen:
- die bmm-Datei passt nicht mehr (RAMB18 statt RAMB16, 36 Bit statt 32 
Bit [confusing])
- die mem-Datei zum Initialisieren braucht ein anderes Format
- elf-Dateien gehen vermutlich gar nicht mehr

P.S.: Mit dem angehängten Quelltext (Versuch eines Minimalbeispiels) 
kann der genneigte Leser die Problematik evtl. nachvollziehen...
Angehängte Dateien:

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