Jak deklarować i używać tablic bajtowych 1D i 2D w Verilog?

Jak deklarować i używać tablic bajtowych 1D i 2D w Verilog?

Np. jak zrobić coś takiego

byte a_2D[3][3];
byte a_1D[3];

// using 1D
for (int i=0; i< 3; i++)
{
    a_1D[i] = (byte)i;
}

// using 2D
for (int i=0; i< 3; i++)
{
    for (int j=0; j< 3; j++)
    {
        a_2D[i][j] = (byte)i*j;
    }
}
Author: James McNellis, 2010-06-10

3 answers

Verilog myśli w bitach, więc reg [7:0] a[0:3] da ci tablicę 4x8 bitów (=tablica 4x1 bajtów). Otrzymujesz z tego pierwszy bajt za pomocą a[0]. Trzeci bit drugiego bajtu to a[1][2].

Dla tablicy 2D bajtów, najpierw sprawdź swój symulator / kompilator. Starsze wersje (pre '01, jak sądzę) tego nie obsługują. Wtedy reg [7:0] a [0:3] [0:3] da ci tablicę 2D bajtów. Dostęp do pojedynczego bitu można uzyskać na przykład za pomocą 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
 48
Author: Marty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-14 01:20:28

Oprócz doskonałej odpowiedzi Marty, Specyfikacja SystemVerilog oferuje typ danych byte. Poniżej deklaruje zmienną 4x8-bitową( 4 bajty), przypisuje każdemu bajtowi wartość, a następnie wyświetla wszystkie wartości:

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

To drukuje:

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

Jest to koncepcja podobna do Marty ' ego reg [7:0] a [0:3];. Jednak byte jest 2-stanowym typem danych (0 i 1), ale {[5] } jest 4-stanowym (01xz). Korzystanie z byte wymaga również łańcucha narzędzi (symulatora, syntezatora itp.) do obsługi tego systemu składnia. Zwróć również uwagę na bardziej zwartą składnię pętli foreach (b[i]).

Specyfikacja SystemVerilog obsługuje szeroką gamę wielowymiarowych typów tablic. LRM może je wyjaśnić lepiej niż ja; zobacz IEEE Std 1800-2005, Rozdział 5.

 8
Author: toolic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-10 13:31:21

Jest to w zasadzie proste, podobnie jak programowanie w C wystarczy przekazać indeksy tablicy po prawej stronie podczas deklaracji. Ale tak składnia będzie jak [0: 3] dla 4 elementów.

reg a[0:3]; 

Spowoduje utworzenie 1D tablicy pojedynczego bitu. Podobnie można utworzyć tablicę 2D w następujący sposób:

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

Teraz w C Załóżmy, że tworzysz tablicę 2D int, wtedy wewnętrznie utworzy tablicę 2D złożoną z 32 bitów. Ale niestety Verilog to HDL, więc myśli w bitach a nie w bitach (chociaż int datatype istnieje w Verilog), pozwala na utworzenie dowolnej liczby bitów, które mają być przechowywane wewnątrz elementu tablicy (co nie jest w przypadku C, nie można przechowywać 5-bitów w każdym elemencie tablicy 2D w C). Aby utworzyć tablicę 2D, w której każdy pojedynczy element może zawierać 5-bitową wartość, należy napisać:

reg [0:4] a [0:3][0:2];
 3
Author: Karan Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 11:51:27