Forum: FPGA, VHDL & Co. Intel Avalon Performance Frage


von avalonMax1000 (Gast)


Lesenswert?

Hallo zusammen,

ich habe auf einem Intel MAX10 einen NIOS2e Prozessor (32Kb RAM) mit 
einem selbst geschriebenen Avalon Memory Mapped Slave (CRC in Hardware).
Ich habe nun die Performance mir angeschaut und brauche Hilfe.

Ich schreibe in der Endlosschleife
mit ldw, Modi und stw auf den Avalon MM slave. Das klappt auch soweit 
nur zwischen zwei Schreibvorgängen (write signal) liegen 33 clock 
Zyklen.

Ich dachte zuerst es liegt am NIOS2e aber mit einem NIOS2f und jeweils 
1Kb Cache habe ich das gleiche verhalten.
Woher kommt diese Latenz?

Gibt es einen Weg diese zu minimieren?

Vielen Dank.

von Schiffe Versenken (Gast)


Lesenswert?

avalonMax1000 schrieb:
> Hallo zusammen,
>
> ich habe auf einem Intel MAX10 einen NIOS2e Prozessor (32Kb RAM) mit
> einem selbst geschriebenen Avalon Memory Mapped Slave (CRC in Hardware).
> Ich habe nun die Performance mir angeschaut und brauche Hilfe.

>
> Gibt es einen Weg diese zu minimieren?

Mehrere, beispielsweise den Takt reduzieren, oder alles an einem Takt zu 
hängen, das erspart die synchronizer. Und nicht das man Genrieren durch 
uninspiriertes drauflosclicken mehr Waitsates als nötig configuriert 
worden. Avalon Streaming IF sollte man auch genügend Aufmerksamkeit 
widmen: 
https://www.intel.com/content/www/us/en/programmable/documentation/nik1412467993397.html#nik1412467963376

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Ich meine mich zu erinnern dass das auch mit der Konfiguration des NIOS 
zu tun hat, wie er die Tasks abarbeitet. Das Streaming IF an sich ist 
schnell und latenzarm. Was regelmäßig zum Warten führt, sind 
DDR-Zugriffe aller Art. Das lässt sich nur durch intelligente 
FIFO-Steuerung lösen.

von avalonMax1000 (Gast)


Lesenswert?

Danke für den Input.
Ich stelle meine Frage nochmals spezieller:

Wenn ich einen eigenen Avalon SPI Slave mache, braucht dann NIOS2 immer 
>20 Zyklen für den Registerzugriff?
Das Streaming-IF hilft ja bei einem klassischen Register ja nichts, da 
bidirektional.

von Schiffe Versenken (Gast)


Lesenswert?

avalonMax1000 schrieb:
> Danke für den Input.
> Ich stelle meine Frage nochmals spezieller:
>
> Wenn ich einen eigenen Avalon SPI Slave mache, braucht dann NIOS2 immer
>>20 Zyklen für den Registerzugriff?
Nein.

von Schiffe Versenken (Gast)


Lesenswert?

Wenn Du nicht in die Docs schauen magst dann lies und versteh wenigstens 
dieses Lab: 
https://dreamteam181.wordpress.com/2017/05/08/lab-3-designing-avalon-memory-mapped-master-components/

von Schiffe Versenken (Gast)


Lesenswert?

Probs mit Codelesen aus externen SDRAM kann man durch L1-CodeCaches 
begrenzen. Ist dein NIOS mit solchen Caches generiert?

von Ben (Gast)


Lesenswert?

Wie hast du denn die Zyklenzahl bestimmt?

von avalonMax1000 (Gast)


Lesenswert?

Ich habe mit dem Signal Tap logic mir die Avalon Signale angeschaut.
Wahrscheinlich komme ich nicht drum herum, einen Avalon Master für eine 
Art DMA zu implementieren um effizienter zu werden.

von Schiffe Versenken (Gast)


Lesenswert?

avalonMax1000 schrieb:
> Ich habe mit dem Signal Tap logic mir die Avalon Signale angeschaut.
> Wahrscheinlich komme ich nicht drum herum, einen Avalon Master für eine
> Art DMA zu implementieren um effizienter zu werden.

Nein, bei 22 Takten gibt es geeignetere Lösungsansätze als DMA-Master.
Und Streaming ist eine Form des DMA, das hast Du ja bereits als "nicht 
hilfreich" abgekanzelt.

von Ben (Gast)


Lesenswert?

@ avalonMax1000

Folgendes Set-Up: Avalon-MM-Slave Komponente mit internem Registersatz. 
Der Inhalt von Register[0] wird über ein UND-Gatter auf einen Nios2 
externen Testpin geführt. Anschließend beschreibe ich das Register 
abwechselnd mit 0x00000000 und 0xFFFFFFFF ...

Komme so auf eine Registerzugriffszeit von 40ns, bzw. zwei 
Prozessortakte ...

von Jonas (Gast)


Lesenswert?

@avalonMax1000

Wie sieht denn dein im Platform Designer erstelltes System aus?

von avalonMax1000 (Gast)


Lesenswert?

@Ben
War das ein NIOS2 f oder e?

Ich habe den Code beim NIOS 2e aus dem externen SD-RAM laufen lassen, 
wobei dieser CAS 3 ist; folglich drei Waitstates.
Einen Cache kann ich nicht verwenden, weil ich die Lizenz für den NIOS2 
nicht habe, daher geht leider nur ohne Cache.
Der Cache würde die Performance sicherlich erhöhen.

Inzwischen habe ich eine akzeptable Lösung gefunden; ich habe hole die 
Daten per Avalon in ein FIFO und in ein weiteres Fifo die empfangenen 
Daten der SPI Schnittstelle. Wenn die SPI Transaktion dann fertig ist, 
schreibe ich per Avalon-Master die Daten wieder in das SD-RAM.
Hiermit habe ich nur noch Waitstates und kann BURST verwenden.

Trotzdem würde ich verstehen, wieso es so viele Takte für die genannten 
Assembler Befehle sind.

von Ben (Gast)


Lesenswert?

@avalonMax1000

Das war tatsächlich ein Nios2 (f). Ich hab es gerade noch einmal mit 
einem Nios2 (e) aufgesetzt und den oben erwähnten Test in Assembler 
implementiert:

Ein Registerzugriff kommt dann auf 6 Prozessortakte + zwei Takte 
Verzögerung durch den Avalon-Bus selbst.

Das passt, bedenkt man, dass der Nios2 (e) keine Instruktionspipeline 
besitzt und somit für einen Befehl sechs Takte benötigt (Instruction 
fetch, Instruction Decode, Execute, ... ,siehe Handbuch).

von avalonMax1000 (Gast)


Lesenswert?

@Ben

Danke für die Information. Ich hatte total verdrängt, dass der NIOS2 (e) 
auch eine sechsstufige Pipeline hat. Wahrscheinlich muss ich mir doch 
mal eine NIOS2 (f) Lizenz leisten.

von Ben (Gast)


Lesenswert?

@avalonMax1000

der Nios2 (e) besitzt 'keine' Instruktionspipeline. Deshalb braucht er 
ja in Summe sechs Takte um einen Befehl abzuarbeiten ...

Setzt du den Nios2 kommerziell ein?

von Schiffe Versenken (Gast)


Lesenswert?

Ben schrieb:

> der Nios2 (e) besitzt 'keine' Instruktionspipeline. Deshalb braucht er
> ja in Summe sechs Takte um einen Befehl abzuarbeiten ...

Was für ein Scheiss-Core, aber jetzt sollte endgültig klar sein, das ein 
DMA Master nicht die Lösung für einen Prozessor auf Sechstel-Speed ist.
Es gibt auch lizenzfreie Alternativen bspw. den LEON2, schau dir mal den 
an:
https://www.gaisler.com/doc/CoSCPU.pdf

Lizenz-technisches zum NIOS wurde bereits hier durchgekaut:

Beitrag "Volllizenz Nios II"
Beitrag "Altera NIOS extern RAM anbinden ohne Lizenz"
Beitrag "Probleme mit NIOS II - DE2 Board"

von Ben (Gast)


Lesenswert?

Zur Ehrenrettung muss man an dieser Stelle sagen, dass der Nios2 (e) vor 
dem Hintergrund einer minimalen Resourcennutzung entwickelt wurde, was 
summa summarum dazu führt, dass die Performance entsprechend gering 
ausfällt.
Nichtsdestotrotz habe ich den (e)-Core bereits in einer Vielzahl von 
Anwendungen implementiert, wo es darum ging eine 
"konfigurierbare/flexible State-Machine" zu haben, die mit wenig 
Resourcen auskommt. Die Ausführungsgeschwindigkeit war hier sekundär.

Trotzallem ist der Einwurf von 'Schiffe Versenken' richtig. Es gibt 
kostenfreie Alternativen a la Gaislers LEON2/3. Diese Cores gehen aber 
in die Richtung des Nios2 (f) Cores ...

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.