typedef на основе параметров в системе Verilog

Я хотел бы иметь параметризованную структуру typedef в System Verilog.

Например, могу ли я параметризовать typedef для сложных типов данных вместо отдельных определений для 8- и 16-битных сложных данных?

typedef struct {logic [7:0] i, q;} complex_datatype_8b;
typedef struct {logic [15:0] i, q;} complex_datatype_16b;


person user3303020    schedule 04.11.2020    source источник


Ответы (2)


Нет параметризованной конструкции typedef, но вы можете иметь параметризованные typedef как часть параметризованного модуля, интерфейса, класса, ...

module mod #(int A = 1, int B = 1)();
  typedef struct packed {logic [A-1:0] i, q;} t1;
  typedef struct packed {logic [B-1:0] i, q;} t2;
  ...
endmodule

Типичный способ выразить параметризованные определения типов в тестовой среде - использовать классы:

class cl #(parameter C = 1);
  typedef struct packed {logic [C-1:0] i, q;} tp;
endclass

module mod1();
  cl#(7)::tp t;
  ..
endmodule

Фактически, вы можете использовать любые параметры вместо констант в typedef.

person Serge    schedule 05.11.2020
comment
cl # (7) :: tp t; разрешено ли такое объявление для портов модуля, а не только для тестовой среды? - person user3303020; 08.11.2020
comment
поскольку для этого требуются классы, он должен быть частью тестового стенда. Вы также можете использовать эту конструкцию в портах модулей тестового стенда. Это не синтезируется. - person Serge; 09.11.2020

Параметризованное определение типа невозможно, но нам нужно внести некоторые изменения, чтобы добиться аналогичных результатов. Здесь мы используем для этого макросы.

    `define MY_STRUCT_STAGE(NAME) \
       my_struct_t_``NAME``
     
    `define MY_STRUCT_STAGE_DEFINE(NAME, CNTR_TBL_ADDR_W, CNTR_TBL_DATA_W) \
     typedef struct { \
                     logic [CNTR_TBL_ADDR_W-1``:0] address; \
                     logic [CNTR_TBL_DATA_W-1:0] data; \
        } `MY_STRUCT_STAGE(NAME)

module module_struct #(parameter int ADDR = 3, parameter int DATA=2);
  `MY_STRUCT_STAGE_DEFINE(struct1,ADDR,DATA)
  `MY_STRUCT_STAGE(struct1)
endmodule

module top ();
  module_struct ms1(); // by default ADDR = 3 and DATA=2 with this structure is created
  module_struct #(5,6) ms2(); // struct is created with ADDR=5 and DATA=6
endmodule

Я взял ссылку из - https://verificationacademy.com/forums/systemverilog/parameterized-struct-systemverilog-design сообщение

person Milan Parmar    schedule 05.11.2020