Forum: FPGA, VHDL & Co. Verilog: assign mit range select, Fehler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Matthäus (Gast)


Lesenswert?

Hallo,

ich versuche meinen FPGA so in Verilog zu beschreiben, dass ich eine 
Zeitverzögerung durch die Hintereinanderschaltung von FFs erreiche. Es 
gibt einen Signalinput und einen input "[1:0] wahl" der mir 15 Ausgänge 
in 4 Varianten zu den FFs durchschaltet.


reg [1023:0] schieber = 0; // Schieberegistervariable
reg [9:0] tabelle [14:0][3:0]; // Tabelle für Delay-Intervalle

... dann wird die Initialisierung von "tabelle" mit den gewünschten 
Delay-Intervallen (funktioniert)
... dann folgt der Schieberegister (funktioniert)

es gibt nur ein Problem mit assign:
"unsupported expression on dynamic range select"

assign out[1] = schieber[tabelle[0][wahl]];
assign out[2] = schieber[tabelle[1][wahl]];
...
assign out[15] = schieber[tabelle[14][wahl]];

Wie kann ich das hinbiegen? Vielen Dank für Vorschläge!!

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Lesenswert?

Matthäus schrieb:

> assign out[1] = schieber[tabelle[0][wahl]];
> assign out[2] = schieber[tabelle[1][wahl]];
> ...
> assign out[15] = schieber[tabelle[14][wahl]];
>
> Wie kann ich das hinbiegen? Vielen Dank für Vorschläge!!

Schau dir an wie man in verilog multiplexer beschreibtm bspw:

https://technobyte.org/verilog-multiplexer-4x1/


da steht für einen 4 zu 1 multiplexor:
1
 assign out = s1 ? (s0 ? d : c) : (s0 ? b : a);

s ist der selector (s0 lsb, s1 msb), beschrieben ist das Ganze mit drei 
? : Operatoren wie man sie aus C kennt, die in zwei ebenen 
hintereinandergeschaltet sind.

Du solltest also (in Verilog) kein zweidiensionales array verwenden, 
sondern den selector 'selbst' ausdekodieren.

: Bearbeitet durch User
von Lothar M. (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Matthäus schrieb:
> der Schieberegister
das ...

> meinen FPGA
mein ...

> ich versuche meinen FPGA so in Verilog zu beschreiben
Du solltest nicht das FPGA beschreiben (das hat der Hersteller des FPGAs 
schon gemacht), sondern du solltest deine Schaltung beschreiben, und 
zwar so, dass der Synthesizer/Compiler sie erkennt und umsetzen kann.

> Es gibt einen Signalinput und einen input "[1:0] wahl" der mir
> 15 Ausgänge in 4 Varianten zu den FFs durchschaltet.
Du hast einen Eingang, der auf ein 1024-Bit Schieberegister geht.
Dahinter hängen 15 Stück Riesenmega-1024:1-Monstermultiplexer, die 
dynamisch abhängig von 2 Eingangsbits und einer variablen Tabelle 1 Bit 
aus der 1024 Bit langen Schieberegisterkette auf den Ausgang multiplexen 
soll. Oder sehe ich das zu kompliziert?

> Wie kann ich das hinbiegen?
Wie sieht deine Schaltung für diese Funktion aus? Denn erst wenn du eine 
Schaltung auf einem Blatt Papier (oder wenigstens im Kopf) hast, dann 
kannst du die beschreiben. Und hoffen, dass der Synthesizer diese 
Beschreibung kapiert.

> es gibt nur ein Problem mit assign:
> "unsupported expression on dynamic range select"
Lies die Doku deiner Toolchain. Dort steht drin, welchen Sprachumfang 
von Verilog der Synthesizer zu Hardware umformen kann.
Bei VHDL schätze ich das auf weniger als 5% ein.
Oder andersrum: ich kann eine ganz simple Codezeile in VHDL hinschreiben 
und bin mir sicher, dass kein Synthesizer sie auf ein FPGA (oder auch 
auf ein ASIC) abgebildet bekommt.

: Bearbeitet durch Moderator
von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Fpgakuechle K. schrieb:
> Schau dir an wie man in verilog multiplexer beschreibtm bspw:

Das hat doch der OP ganz richtig gemacht (aber siehe unten). Das 
Synthesetool versteht es nur offenbar nicht.

>
1
>  assign out = s1 ? (s0 ? d : c) : (s0 ? b : a);
2
>
>
> s ist der selector (s0 lsb, s1 msb), beschrieben ist das Ganze mit drei
> ? : Operatoren wie man sie aus C kennt, die in zwei ebenen
> hintereinandergeschaltet sind.

> Du solltest also (in Verilog) kein zweidiensionales array verwenden,
> sondern den selector 'selbst' ausdekodieren.

Ganz so low-level ist Verilog nun auch nicht. Man muss es definitiv 
nicht so machen. Vor allem emfiehlt sich das nicht bei einem Multiplexer 
dieses Formats, selbst wenn man ihn in sinnvollerweise zwei Ebenen 
teilt.

von Matthäus (Gast)


Lesenswert?

Danke für die Antworten!!

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Lesenswert?

Marcus H. schrieb:
> Fpgakuechle K. schrieb:
>> Schau dir an wie man in verilog multiplexer beschreibtm bspw:
>
> Das hat doch der OP ganz richtig gemacht (aber siehe unten). Das
> Synthesetool versteht es nur offenbar nicht.

Wenn die Software mit einer Fehlermeldung abbricht, hat der TO 
offensichtlich nicht alles richtig gemacht.

>> Du solltest also (in Verilog) kein zweidiensionales array verwenden,
>> sondern den selector 'selbst' ausdekodieren.
>
> Ganz so low-level ist Verilog nun auch nicht. Man muss es definitiv
> nicht so machen.

'Low Level', also 'Gatterebene', ist aber nun mal die Beschreibungsform, 
die jeder Verilog-compiler verstehen sollte. Der TO sollte also mal in 
den "Synthesis Style guide" der von ihm verwendeten Software schauen, 
welche Verilog-construct für seine Hardware verlangt wird, bspw.: 
https://www.xilinx.com/support/documentation/sw_manuals/xilinx2019_1/ug901-vivado-synthesis.pdf 
S.226 ff.

von Vancouver (Gast)


Lesenswert?

Mal unabhängig davon ob dein Design sinnvoll ist, das Problem ist 
offenbar, dass dein Tool kein Array mit einem Eintrag aus einem anderen 
Array direkt indizieren kann. Du könntest mal versuchen, die 15 Tabellen 
in separate Signale zu übergeben und diese dann als Arrayindex zu 
verwenden. Das würde dir zumindest zeigen, ob du auf der richtigen Spur 
bist.

Btw, warum hat deine Tabelle 32768*16 Einträge, wenn du nur 15*4 
brauchst? Du weißt, dass [14:0] kein Wertebereich ist, sondern ein 15 
bit breiter Vektor, der die Werte 0...32767 annehmen kann?

Hast du das eigentlich mal simuliert? Du gehörst hoffentlich nicht zur 
Spezies, die Simulationen von FPGA-Designs für unnötig hält

von Matthäus (Gast)


Lesenswert?

@ Vancouver :

das wusste ich ja, aber komischerweise gibt es eine Fehlermeldung, wenn 
ich das nicht als [14:0] anschreibe...

von Matthäus (Gast)


Lesenswert?

@Vancouver: siehe 
https://www.chipverify.com/verilog/verilog-arrays-memories

stimmt also schon..

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Lesenswert?

Matthäus schrieb:
> @Vancouver: siehe
> https://www.chipverify.com/verilog/verilog-arrays-memories
>
> stimmt also schon..

'address range' (bitbreite Adresse)  und 'range' (Wertebereich) meinen 
nicht unbedingt das selbe.

Vancouver schrieb:
> Du weißt, dass [14:0] kein Wertebereich ist, sondern ein 15
> bit breiter Vektor, der die Werte 0...32767 annehmen kann?

von Vancouver (Gast)


Lesenswert?

Sorry, stimmt natürlich. Das ist die unpacked dimension, da wird der 
Wertebereich angegeben. Ich hätte geschrieben
reg [9:0] tabelle [15][4]
aber deine Schreibweise ist auch richtig. Der Dopplepunkt hat mich nur 
ins geistige Nirvana befördert.

von Vancouver (Gast)


Lesenswert?

Welche Toolchain verwendet du denn?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.