Как определить диапазон msb: lsb в качестве параметра? - PullRequest
0 голосов
/ 15 мая 2018

имея в своем оборудовании тонны регистров, содержащих битовые поля, я хотел «присвоить имена» этим регистрам и получить доступ в SystemVerilog к битовым полям, используя их имена вместо формата msb: lsb. Итак, я сделал новый пакет и объявил постоянные параметры внутри, а также попробовал те, которые описывают диапазон. Примерно так:

package VmeAddressMap;
   parameter SYS_INTCONFIG = 32'h00000044;
   parameter RSYS_INTCONFIGRORA = 31:16;
   parameter RSYS_INTCONFIGENABLE = 15:0;
endpackage // VmeAddressMap

вполне очевидно, это не работает. Итак, я пришел с «гибридным» решением, то есть простые константы остаются в пакете, а для диапазонов я создал другой файл, который содержит макросы:

файл пакета:

package VmeAddressMap;
   parameter SYS_INTCONFIG = 32'h00000044;
endpackage // VmeAddressMap

файл макроса:

`define RSYS_INTCONFIGRORA 31:16
`define RSYS_INTCONFIGENABLE 15:0

это решение позволяет мне действовать следующим образом (чтение - это задача чтения данных через шину VME):

Read(SYS_INTCONFIG);
`CHECK_EQUAL(LastVmeReadData_b32[`RSYS_INTCONFIGRORA], 15,
           "IRQ setup invalid");

Это работает и делает то, что я хочу. Однако мне это не нравится. В частности, смешивание макросов со стилем описания SystemVerilog.

Есть ли способ, как выполнить ту же задачу прямо в пакете?

Ответы [ 2 ]

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

Это именно то, что делает для вас слой абстракции регистра UVM. Вы определяете поля, давая им имя, битовую ширину и другие атрибуты. Эти поля сгруппированы в регистры, а регистры сгруппированы в блоки с адресами и смещениями.

Теперь, когда я вам это сказал, вот простое решение, которое делает то, что вы ищете, используя конструкцию let.

package VmeAddressMap;
   parameter SYS_INTCONFIG = 32'h00000044;
   let RSYS_INTCONFIGRORA(field) = field[31:16];
   let RSYS_INTCONFIGENABLE(field) = field[15:0];
endpackage // VmeAddressMap

Но теперь вы должны поместить диапазон перед переменной.

`CHECK_EQUAL(RSYS_INTCONFIGRORA(LastVmeReadData_b32), 15,
           "IRQ setup invalid");
0 голосов
/ 15 мая 2018

Вы можете использовать один параметр для MSB и другой для LSB.

parameter RSYS_INTCONFIGRORA_MSB = 31;
parameter RSYS_INTCONFIGRORA_LSB = 16;

LastVmeReadData_b32[RSYS_INTCONFIGRORA_MSB:RSYS_INTCONFIGRORA_LSB]

Это немного громоздко, поэтому, если все имеет ширину 16 бит, вы можете просто определить LSB:

parameter RSYS_INTCONFIGRORA = 16;

LastVmeReadData_b32[RSYS_INTCONFIGRORA +: 16]

Или вы можете использовать структуру:

typedef struct packed {
  logic [15:0] RSYS_INTCONFIGRORA;
  logic [15:0] RSYS_INTCONFIGENABLE;
} some_register_t;

Вы также можете создать union с этой структурой, если некоторые части проекта должны взаимодействовать с целым регистровым объектом, а другие только с битовыми полями.

Эти структуры регистров можно встроить в гораздо большую структуру карт регистров.

Если вы используете UVM, тогда вы должны создать RAL модуль ваших регистров

...