Во-первых, вы хотите синтезируемый код? Классы SystemVerilog поддерживают параметризацию и определения структур на уровне классов. Однако большинство инструментов синтеза даже не поддерживают это ограниченное использование конструкции класса в качестве механизма определения области действия.
Пакеты, которые имеют гораздо большую поддержку инструментов синтеза, к сожалению, не имеют возможности параметризации пакетов / структур. Лучшее, что я сделал, это эмулировал параметризуемые структуры с помощью макросов, например:
module mod;
// parameter *may* need to be untyped so that text substitution macro
// works properly without appending any 0's
parameter MY_PARAM = 1;
// Macro and struct definitions could be moved to common header file if shared across multiple modules
typedef struct packed { /* definition */ } my_type_1_t;
typedef struct packed { /* definition */ } my_type_2_t;
`define my_type_t(PARAM) my_type_``PARAM``_t
typedef my_type_t(MY_PARAM) type_t;
type_t my_signal;
// module logic...
endmodule;
Пожалуйста, проверьте мой синтаксис выше, так как я не пытался скомпилировать и протестировать его.