Что делает операция индексации для целочисленного типа в SystemVerilog?

Я пытаюсь перенести некоторый код SystemVerilog на C++/SystemC и немного застрял на паре строк, где вижу странную индексацию массива. Вот упрощенная версия того, что я вижу.

typedef enum bit [2:0] {enu_red, enu_blue, enu_green} typ_enum; 

typedef struct packed {
    bit [3:0] field1;
    bit [3:0] field2;
} typ_struct;

...

var int arr_ints[typ_struct];
var int que_ints[$];

typ_struct obj_struct;
typ_enum   obj_enum;

int i = 3;

// assume all the declared variables hold valid values at this point
// also assume que_ints[i] is valid

if ((!arr_ints[obj_struct][1]) // these two lines are the problem
    && (que_ints[i][obj_struct])
)
begin
    // do something
end

Теперь, после переноса этого кода, я получаю некоторые ошибки компилятора, которые я полностью понимаю, потому что исходный код выглядит не совсем правильно для меня. В первой строке оператора if это похоже на попытку проиндексировать целочисленный тип с логическим значением. Во втором это похоже на попытку проиндексировать целочисленный тип перечислимым значением. Тем не менее, этот код, по-видимому, работает. Может кто-нибудь объяснить, что он делает?


person Rich    schedule 11.12.2012    source источник
comment
Как определяется true?   -  person dwikle    schedule 11.12.2012
comment
Я заменил true на 1. В реальном коде эта функция используется как логическое значение true/false, но реализована как бит. Я был перепутан с эквивалентом С++, фактически используя тип bool   -  person Rich    schedule 11.12.2012


Ответы (2)


Это делает битовую нарезку целочисленного типа. Вы получите доступ к фактическим битам базового представления int.

Если que_ints[5] равно целому числу 0xdeadbeef, то:

  • que_ints[5][3] is 1
  • que_ints[5][7:4] is 0xe.

В SystemC следствием является функция range().

person Ross Rogers    schedule 11.12.2012
comment
Спасибо, я не знал, что целые числа могут быть неявно индексированы битами, как битовые/логические массивы. - person Rich; 11.12.2012

arr_ints — это ассоциативный массив типа int, где в качестве ключа используется тип typ_struct.

Итак, arr_ints[obj_struct] даст вам целое число.

Индексация целочисленного типа с использованием [n] даст вам бит с индексом n.

Итак, arr_ints[obj_struct][1] даст вам бит 1 целого числа в arr_ints[obj_struct]


Во второй рассматриваемой строке:

que_ints — это очередь типа int.

Таким образом, que_ints[i] даст вам целое число в ячейке i в очереди.

В que_ints[i][obj_struct] он неявно преобразует тип перечисления в целочисленное значение (на самом деле бит [2: 0]) и дает вам битовый индекс на основе этого.

person dwikle    schedule 11.12.2012