Als ich mir den Verilog-Code von jemandem ansah, fand ich „+:“ in Verilog. Es sieht aus wie eine arithmetische Funktion, aber ich bin mir nicht sicher. Ich habe noch nie zuvor gesehen. Kennt jemand diese Verwendung?
Aktualisieren:
csum= csum + one_cnt[i* ('DPC_shift +1) +: ('DPC_shift +1)];
Ich habe eine Frage, ist das synthetisch?
Von https://stackoverflow.com/a/18068296/1544337 :
Beschreibung und Beispiele finden sich in IEEE Std 1800-2012 § 11.5.1 „Vector bit-select and part-select addressing“. Erster IEEE-Auftritt ist IEEE 1364-2001 (Verilog) § 4.2.1 "Vector Bit-Select and Part-Select Addressing". Hier ist ein direktes Beispiel aus dem LRM:
logic [31: 0] a_vect; logic [0 :31] b_vect; logic [63: 0] dword; integer sel; a_vect[ 0 +: 8] // == a_vect[ 7 : 0] a_vect[15 -: 8] // == a_vect[15 : 8] b_vect[ 0 +: 8] // == b_vect[0 : 7] b_vect[15 -: 8] // == b_vect[8 :15] dword[8*sel +: 8] // variable part-select with fixed width
Wenn
sel
0 ist, danndword[8*(0) +: 8] == dword[7:0]
istsel
7 danndword[8*(7) +: 8] == dword[63:56]
Der linke Wert ist immer der Startindex. Die Zahl rechts ist die Breite und muss eine positive Konstante sein. und zeigt an
+
,-
dass die Bits mit einem höheren oder niedrigeren Indexwert als dem Startindex ausgewählt werden sollen.Angenommen
address
, es handelt sich um das Little-Endian-Format ([msb:lsb]), dannif(address[2*pointer+:2])
ist dies das Äquivalent vonif({address[2*pointer+1],address[2*pointer]})
Es ist oft nützlich, nach vollständigen Namen von Operatoren zu suchen. Ich habe die Suche nach "Verilog plus Doppelpunktoperator " gefunden.
Siehe auch https://stackoverflow.com/a/17779414/1544337 , auf das von der zitierten Frage aus verlinkt wird.
+:
und -:
) ist auf jedem modernen Synthesizer synthetisierbar. Um den Synthesizer dazu zu bringen, ihn als Full-Case / Parallel-Case zu behandeln, müssen Sie sich auf das Handbuch beziehen. +:
sollte nicht in einer for-Schleife stehen. Die Teilauswahl innerhalb einer For-Schleife wird nicht synthetisiert, da sie nicht statisch entrollt werden kann (es sei denn, das in Scheiben geschnittene Array ist ein Parameter).Aktualisieren:
csum= csum + one_cnt[i* ('DPC_shift +1) +: ('DPC_shift +1)];
Ich habe eine Frage, ist das synthetisch?
Zumindest in der Version von Quartus, die ich verwende, wenn i ein Signal ist, wird es nicht synthetisiert. Ich habe das auf die harte Tour herausgefunden. Es beklagt sich darüber, dass die Indizierung trotz der Tatsache, dass die Breite konstant ist, nicht konstant ist und dass es sehr gerne eine Einzelbitauswahl mit einem variablen Index durchführt.
Ich finde das sehr ärgerlich, als ob das Tool es unterstützen würde, dann wäre es ein nützliches Tool zum Extrahieren von Teilwörtern aus größeren Wörtern.
Ich habe es nicht mit anderen Tools oder mit i als Schleifenzähler versucht.
Fuhrmann
Grünonline
Grünonline
Fuhrmann