имея в своем оборудовании тонны регистров, содержащих битовые поля, я хотел «присвоить имена» этим регистрам и получить доступ в 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.
Есть ли способ, как выполнить ту же задачу прямо в пакете?