Как объявить и использовать байтовые массивы 1D и 2D в Verilog? - PullRequest
34 голосов
/ 10 июня 2010

Как объявить и использовать байтовые массивы 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;
    }
}

Ответы [ 3 ]

53 голосов
/ 10 июня 2010

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

Для двумерного массива байтов сначала проверьте ваш симулятор / компилятор. Старые версии (я думаю, до '01) не будут поддерживать это. Тогда reg [7:0] a [0:3] [0:3] даст вам двумерный массив байтов. Например, один бит может быть доступен с помощью 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
10 голосов
/ 10 июня 2010

В дополнение к превосходному ответу Марти, спецификация 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 - это тип данных с 2 состояниями (0 и 1), а reg - это 4 состояния (01xz).Использование byte также требует, чтобы ваша цепочка инструментов (симулятор, синтезатор и т. Д.) Поддерживала этот синтаксис SystemVerilog.Обратите внимание также на более компактный синтаксис цикла foreach (b[i]).

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

4 голосов
/ 09 декабря 2014

На самом деле все просто, как и в программировании на C, вам просто нужно передать индексы массива с правой стороны при объявлении.Но да, синтаксис будет похож на [0: 3] для 4 элементов.

reg a[0:3]; 

Это создаст одномерный массив из одного бита.Аналогичным образом можно создать 2D-массив следующим образом:

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

Теперь в C предположим, что вы создаете 2D-массив типа int, а затем он внутренне создает 2D-массив из 32 битов.Но, к сожалению, Verilog - это HDL, поэтому он думает не о куче бит, а о битах (хотя тип данных int присутствует в Verilog), он может позволить вам создать любое количество бит для хранения внутри элемента массива (который не являетсяв случае с C вы не можете хранить 5 битов в каждом элементе двумерного массива в C).Таким образом, чтобы создать двумерный массив, в котором каждый отдельный элемент может содержать 5-битное значение, вы должны написать следующее:

reg [0:4] a [0:3][0:2];
...