Как объявить и использовать массивы 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;
}
}
Ответы
Ответ 1
Verilog думает в битах, поэтому reg [7:0] a[0:3]
даст вам массив размером 4x8 (= массив размером 4x1 байт). Из этого вы получите первый байт с помощью a[0]
. Третий бит второго байта - 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
Ответ 2
В дополнение к Marty excellent Ответ, спецификация SystemVerilog предлагает тип данных byte
. Следующее объявляет 4х8-битную переменную (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
Это похоже на концепцию Marty reg [7:0] a [0:3];
. Однако byte
- это тип данных с двумя состояниями (0 и 1), но reg
- 4-состояние (01xz). Использование byte
также требует вашей цепочки инструментов (симулятор, синтезатор и т.д.) Для поддержки этого синтаксиса SystemVerilog. Обратите внимание также на более компактный синтаксис цикла foreach (b[i])
.
Спецификация SystemVerilog поддерживает широкий спектр типов многомерных массивов. LRM может объяснить их лучше, чем я могу; см. IEEE Std 1800-2005, глава 5.
Ответ 3
На самом деле просто, как и программирование на C, вам просто нужно передать индексы массива с правой стороны во время объявления. Но да, синтаксис будет как [0: 3] для 4 элементов.
reg a[0:3];
Это создаст 1D массива одного бита. Аналогично, 2D-массив может быть создан следующим образом:
reg [0:3][0:2];
Теперь в C предположим, что вы создаете 2D-массив из int, тогда он будет внутренне создавать 2D-массив из 32 бит. Но, к сожалению, Verilog - это HDL, поэтому он думает в битах, а не в кучке битов (хотя int datatype присутствует в Verilog), он может позволить вам создавать любое количество бит для хранения внутри элемента массива (что не является case с C, вы не можете хранить 5 бит в каждом элементе 2D-массива в C). Поэтому для создания 2D-массива, в котором каждый отдельный элемент может содержать 5-битное значение, вы должны написать это:
reg [0:4] a [0:3][0:2];