Forum: FPGA, VHDL & Co. XILINX PCIe IP core Minimal configuration


von pcieIP (Gast)


Lesenswert?

Hallo,

ich starte eben autoditaktisch mich mit PCIe zu beschäftigen und
hätte eine Frage an PCIe Experten, die den XILINX PCIe V2.0 IP
Core z.b. für Virtex oder Kintex nutzen.

Wenn ich das richtig sehe, bauen die IP Cores selbständig die unterste
Ebene der PCIe Verbindung (Physical Layer) auf, ohne dass irgend eine
SW involviert ist.

Meine Frage ist nun: wenn man ein minimales Design nur zum Test
erzeugt, z.B. eine PCIe Lane mit RX,TX ,REFCLK, PWRGD, WAKE und
PRSNT als Endpoint für einen PCIe Slot im PV, was muss man
denn dem IP Core im FPGA minimal "anbieten" dass die physical
Layer Verbindung aufgebaut wird ? Ich meine würde der passende
Anschluss (jetzt Xilinx spezifisch) bei

  pipe_mmcm_rst_n
  sys_clk
  sys_rst_n

 reichen ? Was würde noch fehlen ?

Klar kann man damit noch nichts anfangen, aber wenn die unterste
Verbindung schon mal aufgebaut würde, müsste man dann doch schon
im PCI Tree des PCs den Endpoint finden oder liege ich da total
daneben?

Ich beanke mich schon mal für sachdienliche Hinweise.

von user (Gast)


Lesenswert?

ja genau
die Karte sollte sich sogar schon am Betriebsystem anmelden.

von Antti L. (trioflex)


Lesenswert?

Vivado macht dir alles fertig, sagst nur wo sind PCIe lanes, wo PERST 
und wo REFCLK, der rest wird generiert.

von cfgardiner (Gast)


Lesenswert?

Hallo,

ich denke es wird nicht ganz so einfach gehen wie in Deinem OP Text. Es 
wird auch eine minimale Configuration Space benötigt (Mindestens ein BAR 
und eine PM capability Structure, ggfs auch eine PCIe Capability 
Structure. IDs, Classcode etc sind zunächst nicht so wichtig). Sonst 
wird Dein Endpoint nicht enummeriert.

Mit PCI Tree meinst Du vermutlich so etwas wie
- lspci -vvv unter Linux
- Systemsteuerung oder Tool unter Windows

Wenn nur das physikalische verdrahtet ist, sagt das System irgendwann 
"Hmph, schaut eh nach Messgerät aus" und entweder schaltet den Port 
wieder ab oder geht in den Compliance Test Mode damit Du ein 
Augendiagram messen kannst.

Viel Erfolg,
Charles

von pcieIP (Gast)


Lesenswert?

Danke sehr für die Antworten, klingt schon mal nicht schlecht.
Dann liege ich zunächst mal nicht ganz falsch.

Ja, ich benutze Vivado und es ist schon klar, zum Generieren des Cores
muss man eigentlich alles fertig angeben (BAR etc.), das habe ich mir
schon angesehen. Ich will aber zunächst nur den Teil nach "aussen"
nutzen, das AXI Zeugs würde dann später kommen.

Mir geht es darum (zur Selbstmotivation) so bald wie möglich eine
Reaktion am PC zu sehen, bevor man dann weitermacht mit dem "Rest"

Es gibt Tools , in meinem Fall für Windows, die den PCI Tree darstellen
mit allen Parametern die vom Endpoint kommen. Da würde ich dann die
Einstellungen wie z.B. Hersteller ID ect. die man bei der 
Coregenerierung
angeben muss erwarten , wenn die physikalische Verbindung zustande
kommt.

Vielen Dank nochmals für die Unterstützung.

von Christian R. (supachris)


Lesenswert?

Meines Wissens werden da auch Files für ein Beispeilprojekt generiert, 
bzw. kann man sich ein solches Projekt generieren lassen. Rechte 
Maustaste auf den Core und dann Generate Example Project. Da ist schon 
mal das wichtgste drin. Ansonsten gibts zu den Boards mit PCIe immer 
fertige Beispiele dazu.

von Antti L. (trioflex)


Lesenswert?

ich versuche es noch einmal

vivado starten, IP catatlog
PCIe core generieren
warten bis alle Dateien fertig sind
dann Beispiel design offnen
PCIe lane, PERST pin und REF clock festlegen
bitgen
flashgen

PCIe kart in linux oder win pc rein

wird erkannt

ehrlich, mehrmals so getan, genau so geht

das ist natürlich ein fertiges Demo Beispiel nur aber für Este Test ok,

wenn es so geht dann:

viado starten, neues IPI block desing
kostenloses microblaze
AXI memory mapped PCIe

und lost geht spass..

von pcieIP (Gast)


Lesenswert?

Danke, super.

So dachte ich mir das auch. Werde in Kürze mal den ersten Versuch
starten.

Eine möglicherweise dumme Frage zum Prinzip habe ich aber noch.
Die Pinbelegung des PCIe Slots die man findet, gibt diese die
Signale des Motherboards an, so wie sie von der Bridge oder
vom Root Complex kommen? Ich meine also, es muss idealerweise
z.B.

  B14(HSoP0) mit HSiP0
  B15(HSoN0) mit HSiN0 vom zu steckenden Board
und
  A16(HSiP0) mit HSoP0
  A17(HSiN0) mit HSoN0 vom zu steckenden Board

verbunden sein. Ist das so richtig?

Vielen Dank.

von Antti L. (trioflex)


Lesenswert?

Jetzt ist aber nicht verständlich was du willst.

In ersten mail war es deutlich: XILINX

bei Xilinx gibt es namen wie: HSxPx nicht.

Das in und out is natürlich immer problem, aber wenn du fertiges FPGA 
board hast, dann sollte es schon richtig sein. Wenn du falsch 
zuweisungen macht, dann meckern die tools so oder so.

von pcieIP (Gast)


Lesenswert?

Das stimmt was Xilinx angeht, aber ich habe inzwischen das
http://de.wikipedia.org/wiki/PCI_Express
gefunden und auch anderweitig und da gibt es diese
Bezeichnung schon. Hier sieht man auch die Richtungen.
Das habe dann wohl richtig interpretiert.

Mir geht es hier grundsätzlich ums Verständnis was damit gemeint ist.

Danke für die ausdauernde Unterstützung.

von pcieIP (Gast)


Lesenswert?

Jetzt muss ich doch noch was nachfragen.

Kann man wirklich mit WAKE (sofern man es bedienen kann), das
Root-port dazu bewegen, die Verbindung ab und dann die
Trainingssequenz wieder anzustoßen um die Verbindung
wieder aufzubauen ? So oft man will in dem anfangs beschriebenen
Status nur zum Test?

Danke

von cfgardiner (Gast)


Lesenswert?

aus Deinem Text verstehe ich leider nicht was Du insgesamt vor hast. 
Bzgl. WAKE wage ich zu bezweifeln, dass man das einfach beliebig toggeln 
kann.

Ein PCI(e) Endpoint hat 4 Device Powerstates D0, D1, D2, D3. D0 ist 
vollfunktionsfähig, D3 ist ausgeschaltet wobei ein D3-hot definiert ist, 
der z.b. für wake-on-fax/wake-on-lan verwendet werden kann. D0 und D3 
muessen implementiert werden (logisch irgendwie), D1 D2 sind optional.

PCI(e) kennt auch einen Power Management Event (PME) das bedeutet, dass 
ein EP vom System in einen anderen Powerzustand versetzt werden möchte. 
Was passiert hängt natürlich vom aktuellen EP Powerzustand sowie der 
Gerätetreiber ab.

WAKE macht eigentlich nur Sinn wenn der EP im D3 (jedenfalls > D0) ist. 
Folge sollte sein, dass der EP periodisch PM_PME Messages an das System 
schickt. Wenn der EP ein PME_TURN_OFF Message erhält muss er das senden 
von PM_PME unterbinden. Irgendwann wird das System dann das Device von 
D3 nach D0 versetzen. Hierbei erfolgt natürlich ein Link-Training beim 
Durchgang durch den Recovery State.

Das war jetzt die Vogel-Perspektive. Damit das alles funktioniert muss 
natürlich die PM Capability Structure auch richtig konfiguriert werden 
und zwar in der Regel zumindest Teilweise vom Gerätetreiber.

Ich vermute sehr stark, dass der EP im D0 gar keinen PM_PME sendet wenn 
Du einfach am WAKE# toggelst. m.E. wäre das nicht sinnvoll.

Wenn Du aus welchem Grund auch immer Training Sequenzen auf Knopfdruck 
sehen willst, wäre mein Empfehlung, dass Du ein 16550 Kompatiblen UART 
an Deinem EP hängst und diesen unter Windows mit dem standard serial.sys 
Treiber verbindest. Wenn Du das richtig machst bekommst Du automatisch 
einen Com Port zugeteilt. Die Microsft Com-Port Spec verlangt, dass ein 
nicht benutztes Com Port nach D3 geschickt wird. Mit einer Applikation, 
die den Com Port auf und zu macht muesstest Du bei jedem Übergang einen 
Recovery Durchgang auslösen (zuminest von D3 nach D0). Hier werden 
Training Sequenzen ausgetauscht.

Es gibt übrigens im Link-Control Register der PCIe Capability Structure 
ein 'Retrain Link' bit. Nur, zumindest nach PCIe Spec steht dieses Bit 
einem EP nicht zur Verfügung.

Viel Erfolg,
Charles

von Lattice User (Gast)


Lesenswert?

pcieIP schrieb:
> Jetzt muss ich doch noch was nachfragen.
>
> Kann man wirklich mit WAKE (sofern man es bedienen kann), das
> Root-port dazu bewegen, die Verbindung ab und dann die
> Trainingssequenz wieder anzustoßen um die Verbindung
> wieder aufzubauen ? So oft man will in dem anfangs beschriebenen
> Status nur zum Test?
>

Mit WAKE# geht da gar nichts. WAKE# ist normalerweise nicht mit dem 
Rootport verbunden, sondern direkt mit dem Power Management Controller 
des Systems. Und zwar typischerweise von allen Slots gemeinsam um das 
System einzuschalten (z.B. bei Wake On Lan, USB Keyboard etc).
Einfach am WAKE# zu ziehen ist aber nicht erlaubt, denn das System will 
anschliessend feststellen wer es war.

Was du vermutlich suchst ist Hotplugging, da sieht es allerdings düster 
aus. Mir ist bislang nur ein Mainboard untergekommen das es supported, 
und das war ein Intel Developmentboard in den Anfangszeiten von PCIe. 
Das heisst natürlich nicht dass es heute keine gibt, und ich habe auch 
nicht danach gesucht.

von pcieIP (Gast)


Lesenswert?

Danke euch beiden für die Klarstellung. In meiner naiven Vorstellen
dachte ich das könnte man so machen. Dann habe ich meine spärliche
Doku die ich gefunden haben wohl nicht richtig verstanden.

Vielen Dank nochmals.

von Lattice User (Gast)


Lesenswert?

Wenn es dir nur darum geht, den FPGA neu laden zu können ohne das System 
neu zu starten, da gibt es eine Möglichkeit.

Vorrausgesetzt dass sich an der Definition des Configiration Space 
nichts geändert hat, reicht es im Gerätemanager (oder devcon utililty) 
den Treiber neu zu starten (d.h. disable/enable).

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.