2013-08-05 16 views
16

ich einen Code in SystemVerilog sehe, die so etwas wie dieses hat:Indexing Vektoren und Matrizen mit +:

if(address[2*pointer+:2]) 
    do_something; 

Wie soll ich das +: verstehen, wenn die Indizierung dieses Vektors?

Ich fand, dass es Bit Slicing genannt wird, aber ich kann keine Erklärung darüber finden.

+2

Dies ist ein nahes Duplikat von http://stackoverflow.com/questions/17778418 – dwikle

Antwort

39

Beschreibung und Beispiele finden Sie in IEEE Std 1800-2012 § 11.5.1 "Vektor-Bitauswahl und Teileauswahladressierung". Der erste IEEE-Auftritt ist IEEE 1364-2001 (Verilog) § 4.2.1 "Vektor-Bitauswahl- und Teileauswahladressierung". 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 dann dword[8*(0) +: 8] == dword[7:0]
Wenn sel 7 ist dann

Der Wert auf der linken Seite immer den Startindex. Die Zahl rechts ist die Breite und muss eine positive Konstante sein. + und - gibt an, die Bits eines höheren oder niedrigeren Indexwerts als den Startindex auszuwählen.

Angenommen address in Little-Endian ist ([msb: lsb]) Format, dann ist das Äquivalent von if(address[2*pointer+:2])if({address[2*pointer+1],address[2*pointer]})

+0

Also, was passieren würde, wenn wir a_vect verwendet [15 -: 32]? – umayneverknow

+0

@umayneknknow Ich kann mich nicht erinnern, ob das LRM erwähnt hat, was im Take-Szenario passiert. Sollte lösen/Fehler das gleiche wie 'a_vect [15: -16]'. Probieren Sie es aus und finden Sie es heraus – Greg

15

Dies ist ein weiterer Weg, um die Reichweite des Bitvektor zu spezifizieren.

x +: N, Die Startposition des Vektors durch x gegeben ist und Sie zählen bis von x von N.

Es gibt auch

x -: N, in diesem Fall die Startposition ist x und Sie zählen down von x von N.

N ist eine Konstante und x ist ein Ausdruck, der Iteratoren enthalten kann.

Es hat ein paar Vorteile -

  1. Es macht den Code besser lesbar.

  2. Sie können einen Iterator angeben, wenn auf Bit-Slices verwiesen wird, ohne dass der Fehler "Kann nicht einen nicht konstanten Wert haben" angezeigt wird.