Was bedeutet "+:" in Verilog?

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?

@Plutonium-Schmuggler, danke Sir, aber ich kann es nicht finden.
@Plutonium-Schmuggler - können Sie bitte die Antwort geben, die Sie in Ihrem Link gefunden haben? Was bedeutet es eigentlich? Danke. :-)
@Carter - Können Sie bitte etwas mehr Kontext bereitstellen? Die Anweisung, die den Ausdruck und die Zeilen vor und nach der Anweisung enthält, danke. Bist du sicher, dass es kein Tippfehler ist?
@Greenonline Daran erinnere ich mich nicht genau. Kann ich morgen machen.

Antworten (2)

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 sel0 ist, dann dword[8*(0) +: 8] == dword[7:0]
ist sel7 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]), dann if(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.

Danke, Sir, aber es wurde bei Vektor verwendet. Aber ich sah bei diesen For-Anweisungen. Ich erinnere mich nicht genau, aber es wird so verwendet. Für~~()~~+:(~~). Gesamtaussage nicht exakt. aber +: wurde bei der for-Anweisung verwendet.
@Carter bitte bearbeiten Sie Ihre Frage und geben Sie den Code an, mit dem Sie Probleme haben.
habe es. Ich lasse es dich so schnell wie möglich wissen.
Aber würden Sie mich bitte wissen lassen? Sind diese alle synthetisierbar?
Sieht für mich so aus, bin mir aber nicht sicher.
Part-Select-Adressierung ( +: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).
Die indizierte Teilauswahl funktioniert in einer for-Schleife einwandfrei. Ich habe es schon mehrmals auf diese Weise verwendet und xst hat kein Problem damit, solange die rechte Seite konstant ist.

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.