2010-06-10 12 views

risposta

46

Verilog pensa in bit, in modo da reg [7:0] a[0:3] vi darà un po '4x8 array (= 4x1 array di byte). Si ottiene il primo byte di questo con a[0]. Il terzo bit del secondo byte è a[1][2].

Per una matrice 2D di byte, controllare innanzitutto il simulatore/compilatore. Le versioni precedenti (credo che prima del 01) non lo supportano. Quindi reg [7:0] a [0:3] [0:3] fornirà una matrice 2D di byte. Ad esempio, è possibile accedere a un singolo bit con a[2][0][7].

reg [7:0] a [0:3]; 
reg [7:0] b [0:3] [0:3]; 

reg [7:0] c; 
reg d; 

initial begin 

    for (int i=0; i<=3; i++) begin 
     a[i] = i[7:0]; 
    end 

    c = a[0]; 
    d = a[1][2]; 


    // using 2D 
    for (int i=0; i<=3; i++) 
     for (int j=0; j<=3; j++) 
      b[i][j] = i*j; // watch this if you're building hardware 

end 
+1

Non i cicli for devono essere <= 3 anziché <3? –

+1

La dichiarazione dell'array @RossAiken dello stile [a: b] è compresa nell'intervallo. Quindi <= è corretto. – siu

+0

@siu - All'inizio mi sbagliavo - ross-aiken ha individuato l'errore e ho modificato la risposta ... – Marty

8

Oltre alla ottima risposta di Marty, la specifica SystemVerilog offre il tipo di dati byte. La seguente dichiara una variabile 4x8 bit (4 byte), assegna ogni byte un valore, quindi visualizza tutti i valori:

module tb; 

byte b [4]; 

initial begin 
    foreach (b[i]) b[i] = 1 << i; 
    foreach (b[i]) $display("Address = %0d, Data = %b", i, b[i]); 
    $finish; 
end 

endmodule 

Questo stampa:

Address = 0, Data = 00000001 
Address = 1, Data = 00000010 
Address = 2, Data = 00000100 
Address = 3, Data = 00001000 

Questo è concettualmente simile a Marty reg [7:0] a [0:3]; . Tuttavia, byte è un tipo di dati a 2 stati (0 e 1), ma reg è a 4 stati (01xz). L'utilizzo di byte richiede anche la catena di strumenti (simulatore, sintetizzatore, ecc.) Per supportare questa sintassi SystemVerilog. Nota anche la sintassi del loop foreach (b[i]) più compatta.

Le specifiche SystemVerilog supportano un'ampia varietà di tipi di array multidimensionali. LRM può spiegarli meglio di me; fare riferimento a IEEE Std 1800-2005, capitolo 5.

3

In realtà, come la programmazione in C, è sufficiente passare gli indici di array sul lato destro durante la dichiarazione. Ma sì, la sintassi sarà come [0: 3] per 4 elementi.

reg a[0:3]; 

Ciò creerà un 1D di matrice di singolo bit. Allo stesso modo matrice 2D può essere creato in questo modo:

reg [0:3][0:2]; 

Ora in C si supponga di creare una matrice 2D di int, allora si creerà internamente una matrice 2D di 32 bit. Ma sfortunatamente Verilog è un HDL, quindi pensa a bit piuttosto che a un mucchio di bit (sebbene il tipo di dati sia presente in Verilog), può consentire di creare un numero qualsiasi di bit da memorizzare all'interno di un elemento dell'array (che non è il caso con C, non è possibile memorizzare 5 bit in ogni elemento dell'array 2D in C). Quindi, per creare un array 2D, in cui ogni singolo elemento può contenere un valore di 5 bit, è necessario scrivere questo:

reg [0:4] a [0:3][0:2]; 
Problemi correlati