2013-08-05 9 views
16

sto vedendo un codice in SystemVerilog che ha qualcosa di simile:vettori di indicizzazione e array con +:

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

Come devo capire il +: durante l'indicizzazione di questo vettore?

Ho scoperto che si chiama bit slicing, ma non riesco a trovare una spiegazione a riguardo.

+2

Questo è un duplicato vicino di http://stackoverflow.com/questions/17778418 – dwikle

risposta

39

Descrizione ed esempi sono disponibili in IEEE Std 1800-2012 § 11.5.1 "Selezione bit vettoriale e indirizzamento di selezione parte". Il primo aspetto IEEE è IEEE 1364-2001 (Verilog) § 4.2.1 "Selezione bit vettoriale e indirizzamento di selezione parte". Ecco un esempio diretto dalla 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 

Se sel è 0 allora dword[8*(0) +: 8] == dword[7:0]
Se sel è 7 allora

Il valore sempre la sinistra indice iniziale. Il numero a destra è la larghezza e deve essere una costante positiva. il + e - indica di selezionare i bit di un valore di indice superiore o inferiore quindi l'indice di partenza.

Supponendo address è in little endian ([msb: lsb]) formato, quindi if(address[2*pointer+:2]) equivale if({address[2*pointer+1],address[2*pointer]})

+0

Così che cosa accadrebbe se abbiamo usato a_vect [15 -: 32]? – umayneverknow

+0

@umayneverknow Non ricordo se l'LRM ha menzionato cosa succede nello scenario Take. Dovrebbe risolvere/errore lo stesso di 'a_vect [15: -16]'. Provaci e scoprilo – Greg

15

Questo è un altro modo per specificare la gamma del vettore di bit.

x +: N, la posizione di partenza del vettore è dato da x e si contano fino da x di N.

C'è anche

x -: N, in questo caso la posizione iniziale è x e contate giù da x da N.

N è una costante e x è un'espressione che può contenere iteratori.

ha un paio di vantaggi -

  1. rende il codice più leggibile.

  2. È possibile specificare un iteratore quando si fa riferimento a sezioni di bit senza ottenere un errore "non può avere un valore non costante".

Problemi correlati