EDIT: Ik heb het probleem gevonden. De caching policy wordt in plasma.vhd bepaald, en hier wordt ook de cache geupdate na een cache miss, en hier zitten nog wat extra checks op het adres.
Hallo tweakers,
ik ben voor een project voor mijn studie nu bezig met het verbeteren van de plasma CPU, die geschreven is in VHDL en geschikt is voor synthese op een FPGA. Ik hou me bezig met de cache, maar vooralsnog lukt het niet echt. Momenteel is de cache 4kb en de externe RAM 32MB.
De relevante bestanden zijn
cache.vhd
cache_ram.vhd
(de plasma CPU is opensource en ook te vinden op opencores.org, alleen moet je hiervoor een account aanmaken voordat je de code kan downloaden, ik heb de relevante bestanden dus maar even geupload)
In het eerste bestand wordt de cache gedefinieerd, in het tweede bestand specifiek de RAM-modules (noem je dit zo? Ik bedoel de RAMB_S9 entities).
Een RAMB_S9 module heeft een input adres van 11 bits en heeft een output poort van 8 bits. Omdat de data access per woord van 4 bytes gaat, worden er vier van deze RAMB_S9 modules naast elkaar gebruikt. Er is dus in principe voldoende ruimte voor 2^11 * 4 = 8192 bytes. Maar omdat de meest significante bit van het input address steeds op 0 word gezet (zie regel 101 en 171 van cache.vhd), wordt slechts de 'onderste helft' van de RAMB_S9 module gebruikt.
Als ik echter probeer de cache groter te maken door deze bit wel te gebruiken, lijkt alles OK te werken, tot ik een wat grotere benchmark probeer te draaien, die op het begin goed lijkt te werken (in een modelsim simulatie) maar nu 500us in een eindeloze loop terecht komt.
Het commentaar aan de bovenkant van de code in in cache.vhd en boot_ram.vhd zegt dat de cache een blok deelt met het 'interne RAM'. Het lijkt me echter dat dit commentaar verouderd is, omdat dit zowel in cache_ram.vhd (in een comment uit 2005) en boot_ram.vhd staat, en dit toch echt verschillend RAM gebruikt (en de cache gebruikt natuurlijk niet het RAM in boot_ram, en andersom).
Ook wanneer ik een programma run dat het interne RAM gebruikt, lijkt het het RAM in boot_ram te gebruiken, niet dat cache_ram, en dit suggereert de code in plasma.vhd (zie regel 183) ook Mijn hypothese is dat het RAM nu gesplitst is in twee blokken, het cache_ram en het boot_ram, wat niks meer met elkaar te maken heeft, en het commentaar is blijven staan. In dit geval is het nog steeds onduidelijk waarom de benchmark crasht.
Hulp, zowel generieke opmerkingen (hoe vind ik de fout in een modelsim simulatie met zoveel signalen die voor zo lang lopen?) als specifiekere hulp zijn zeer welkom!
Hallo tweakers,
ik ben voor een project voor mijn studie nu bezig met het verbeteren van de plasma CPU, die geschreven is in VHDL en geschikt is voor synthese op een FPGA. Ik hou me bezig met de cache, maar vooralsnog lukt het niet echt. Momenteel is de cache 4kb en de externe RAM 32MB.
De relevante bestanden zijn
cache.vhd
cache_ram.vhd
(de plasma CPU is opensource en ook te vinden op opencores.org, alleen moet je hiervoor een account aanmaken voordat je de code kan downloaden, ik heb de relevante bestanden dus maar even geupload)
In het eerste bestand wordt de cache gedefinieerd, in het tweede bestand specifiek de RAM-modules (noem je dit zo? Ik bedoel de RAMB_S9 entities).
Een RAMB_S9 module heeft een input adres van 11 bits en heeft een output poort van 8 bits. Omdat de data access per woord van 4 bytes gaat, worden er vier van deze RAMB_S9 modules naast elkaar gebruikt. Er is dus in principe voldoende ruimte voor 2^11 * 4 = 8192 bytes. Maar omdat de meest significante bit van het input address steeds op 0 word gezet (zie regel 101 en 171 van cache.vhd), wordt slechts de 'onderste helft' van de RAMB_S9 module gebruikt.
Als ik echter probeer de cache groter te maken door deze bit wel te gebruiken, lijkt alles OK te werken, tot ik een wat grotere benchmark probeer te draaien, die op het begin goed lijkt te werken (in een modelsim simulatie) maar nu 500us in een eindeloze loop terecht komt.
Het commentaar aan de bovenkant van de code in in cache.vhd en boot_ram.vhd zegt dat de cache een blok deelt met het 'interne RAM'. Het lijkt me echter dat dit commentaar verouderd is, omdat dit zowel in cache_ram.vhd (in een comment uit 2005) en boot_ram.vhd staat, en dit toch echt verschillend RAM gebruikt (en de cache gebruikt natuurlijk niet het RAM in boot_ram, en andersom).
Ook wanneer ik een programma run dat het interne RAM gebruikt, lijkt het het RAM in boot_ram te gebruiken, niet dat cache_ram, en dit suggereert de code in plasma.vhd (zie regel 183) ook Mijn hypothese is dat het RAM nu gesplitst is in twee blokken, het cache_ram en het boot_ram, wat niks meer met elkaar te maken heeft, en het commentaar is blijven staan. In dit geval is het nog steeds onduidelijk waarom de benchmark crasht.
Hulp, zowel generieke opmerkingen (hoe vind ik de fout in een modelsim simulatie met zoveel signalen die voor zo lang lopen?) als specifiekere hulp zijn zeer welkom!
[ Voor 3% gewijzigd door Verwijderd op 04-06-2015 21:32 ]