Forum: FPGA, VHDL & Co. Microblaze D-Cache Error


von Tomi T. (Firma: xxx) (kaptainchaos)


Lesenswert?

Moin,

ich habe folgendes Problem: In meinem Projekt möchte ich den D- und 
I-Cache des Microblaze einschalten. Diese sind auch in der Hardware 
verfügbar und besitzen jeweils 8kB. Beide besitzen den Selben 
Adressbereich von 0x1C00 0000 bis 0x1DFF FFFF.

Bevor ich diese in meinem Programm einschalte, führe ich einen 
Selbsttest durch. Hierzu rufe ich die folgenden Funktionen auf, welche 
von Xilinx zur Verfügung gestellt werden: Xil_TestICacheAll und 
Xil_TestDCacheAll. Beim Testen des D-Cache wird mit eine Fehlermeldung 
per printf ausgegeben:

Error: Invalidate dcache all not working

Leider habe ich hierzu keine Informationen finden können. Vielleicht hat 
ja von Euch jemand schon Erfahrung hiermit gemacht und kann mir sagen 
wie ich diesen Fehler beseitigen kann und was er genau aussagt. Man 
lernt ja gerne was dazu;-)

Besten Dank schon mal im Voraus.

von Duke Scarring (Gast)


Lesenswert?

Tomi Tomsen schrieb:
> Beide besitzen den Selben
> Adressbereich von 0x1C00 0000 bis 0x1DFF FFFF.
Ich hätte die ja auf verschiedene Adressbereiche gelegt, bin aber beim 
Microblaze nicht so firm...

Duke

von Tomi T. (Firma: xxx) (kaptainchaos)


Lesenswert?

Moin Duke,

also ich habe das mit den Adressen so verstanden, dass diese den Bereich 
angeben, welcher von den jeweiligen Caches adressiert werden können. Aus 
diesen Adressbereich können dann die Daten oder Instruktionen vom 
DDR-Speicher in den Cache geladen und bei einem Cache-Hit aus diesem 
ausgeführt werden.
In dem Reference Guide vom Microblaze steht nichts davon das diese 
getrennt sein müssen, oder ich habe es überlesen.
Trotzdem danke für die Antwort.

von Duke Scarring (Gast)


Lesenswert?

Tomi Tomsen schrieb:
> also ich habe das mit den Adressen so verstanden, dass diese den Bereich
> angeben, welcher von den jeweiligen Caches adressiert werden können.
Stimmt. Aber ich habe im Datenblatt das hier gefunden:
1
The MicroBlaze data cache can be configured from 64 bytes to 64 kB.
Und 0x1C00 0000 bis 0x1DFF FFFF sind 32 MByte...

Duke

von Georg A. (Gast)


Lesenswert?

Das eine ist die Grösse des Caches selbst, das andere der cachebare 
Bereich, das passt schon so.

Der Code zu dem Call ist zB. hier:
http://cdbae.hg.sourceforge.net/hgweb/cdbae/cdbae/file/tip/bsp/qnx_v2_00_a/src/common/xil_testcache.c

Wenn das auch "dein" Code ist, hat der Test aber schon einige Haken. Der 
Testbereich wird da im Heap definiert (static u32 Data[DATA_LENGTH]). 
Das Linkersetup muss das natürlich auch in den cachebaren Bereich legen 
und nicht ins BRAM. Interrupts könnten den Test auch stören, weil die 
nicht gesperrt werden.

von Tomi T. (Firma: xxx) (kaptainchaos)


Lesenswert?

Moin,

also erst einmal vielen Dank für die Antworten:-)

@Duke:

> The MicroBlaze data cache can be configured from 64 bytes to 64 kB.

Den Abschnitt hatte ich auch gelesen, soweit ich das Verstehe wird damit 
nur die Größe des Cache beschrieben, welche ich im EDK unter Option vom 
Microblaze einstellen kann, meine beiden Caches sind jeweils 8kB groß. 
Die waren aus einem Beispiel-Projekt so schon eingestellt. Ich habe nur 
den cachbaren Bereich verkleinert, da der andere Adressbereich als 
Framebuffer dient.

@ Georg:

Ich habe das genauso wie Du verstanden, die Adresse gibt den cachbaren 
Bereich an (bei 32bit ca. 4Gb, minus der Peripherie) und die Größe des 
Cache sagt nur aus wie viel Daten/Instruktionen vorgehalten werden 
können.
Bei dem Code handelt es sich genau um den welcher ausgeführt wird. Ich 
habe das Linkersetup geprüft, die Einstellungen sind so, dass die 
folgenden Daten im DDR-RAM leigen:

Code Sections, Data Sections, Heap und Stack

Mit der Größe des Heap und dem Stack hatte ich ein wenig rum gespielt, 
aber auch mit 100KB hatte ich Problem.

Mir stellt sich die Frage ob ich die Größe des Caches frei wählen kann, 
oder gibt es dort Einschränkungen die ich übersehen habe, außer dass die 
Grenze bei 64kB liegt.

von Tomi T. (Firma: xxx) (kaptainchaos)


Lesenswert?

Ach das hatte ich noch vergessen. Den Selbsttest führe ich bei der 
Initialisierung des Microblaze durch, erst nachdem dies erfolgreich ist 
wird der Interrupt-Controller eingeschaltet. Der Test läuft also ohne 
eine Störung durch einen Interrupt ab.

von Georg A. (Gast)


Lesenswert?

Blöde Frage: Ich kenn den Cache nur vom EDK9.2, und da kann der MB-Cache 
gar kein write-back, sondern nur write-through. Damit wäre natürlich 
auch ein Invalidate hinfällig und damit der ganze Test.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.