Как объявить и использовать 1D и 2D массивы байтов в Verilog?

Как объявить и использовать 1D и 2D массивы байтов в Verilog?

например, как сделать что-то как

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;
    }
}
34
задан James McNellis 10 June 2010 в 03:50
поделиться

2 ответа

Verilog мыслит битами, поэтому reg [7: 0] a [0: 3] даст вам массив 4x8 бит (= массив байтов 4x1). Вы получаете первый байт из этого числа с помощью a [0] . Третий бит 2-го байта - a [1] [2] .

Для двумерного массива байтов сначала проверьте свой симулятор / компилятор. Более старые версии (до '01, я полагаю) не поддерживают это. Затем reg [7: 0] a [0: 3] [0: 3] даст вам 2D-массив байтов. К одному биту можно получить доступ, например, с помощью 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
53
ответ дан 27 November 2019 в 16:40
поделиться

В дополнение к отличному ответу Марти, спецификация SystemVerilog предлагает тип данных byte. Ниже объявляется 4x8-битная переменная (4 байта), каждому байту присваивается значение, затем выводятся все значения:

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

Выводится:

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

Это похоже по концепции на reg [7:0] a [0:3]; Марти. Однако byte - это двухпозиционный тип данных (0 и 1), а reg - четырехпозиционный (01xz). Использование byte также требует, чтобы ваша инструментальная цепочка (симулятор, синтезатор и т.д.) поддерживала этот синтаксис SystemVerilog. Обратите внимание также на более компактный синтаксис цикла foreach (b[i]).

Спецификация SystemVerilog поддерживает большое разнообразие типов многомерных массивов. LRM может объяснить их лучше, чем я; обратитесь к IEEE Std 1800-2005, глава 5.

10
ответ дан 27 November 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: