Specman / e список списков (многомерный массив) - PullRequest
0 голосов
/ 06 мая 2018

Как создать фиксированный многомерный массив в Specman / e, используя переменные ?
А затем получить доступ к отдельным элементам или целым рядам?

Например, в SystemVerilog у меня будет:

module top;

  function automatic my_func();
    bit [7:0] arr [4][8]; // matrix: 4 rows, 8 columns of bytes
    bit [7:0] row    [8]; // array : 8 elements        of bytes

    row = '{1, 2, 3, 4, 5, 6, 7, 8};

    $display("Array:");
    foreach (arr[i]) begin
      arr[i] = row;
      $display("row[%0d] = %p", i, row);
    end

    $display("\narr[2][3] = %0d", arr[2][3]);
  endfunction : my_func

  initial begin
    my_func();
  end

endmodule : top

Это даст такой вывод:

Array:
row[0] = '{'h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7, 'h8}
row[1] = '{'h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7, 'h8}
row[2] = '{'h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7, 'h8}
row[3] = '{'h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7, 'h8}

arr[2][3] = 4

Может кто-нибудь переписать my_func () в Specman / e?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

В случае поля (в отличие от локальной переменной), также возможно объявить его с заданным размером. Этот размер, опять же, не является «фиксированным» и может быть изменен во время выполнения (путем добавления или удаления элементов), но он определяет исходный размер списка при создании, например:

struct foo {
    my_list[4][8]: list of list of int;
};
0 голосов
/ 07 мая 2018

В e нет фиксированных массивов. Но вы можете определить переменную типа списка, включая многомерный список, например:

var my_md_list: list of list of my_type;

Это не то же самое, что многомерный массив в других языках, в том смысле, что в общем случае каждый внутренний список (являющийся элементом внешнего списка) может иметь различный размер. Но вы все равно можете достичь своей цели, используя его. Например, ваш код может быть переписан в e примерно так:

var arr: list of list of byte;
var row: list of byte = {1;2;3;4;5;6;7;8};

for i from 0 to 3 do {
    arr.add(row.copy());
    print arr[i];
};

print arr[2][3];

Обратите внимание на использование row.copy() - это гарантирует, что каждый внешний элемент списка будет копией исходного списка. Если мы не используем copy(), мы получим список многих указателей на тот же список . Это также может быть законным, в зависимости от цели вашего кода.

...