Перейти к содержанию

    

Тип type в parameter модуля (немного экзотики в SV)

Приветствую!

Переделывая некий модуль с verilog на SystemVerilog возникла желание  сделать порты  модулей более читаемыми, а не как просто плоские вектора бит. Чтобы через  длительное время после дизайна ( через неделю например :) ) открыв исходник было понятно что 

безликий bus_addr [ADDR_WH-1:0] на самом деле 
...
typedef struct packed {
  logic [SEG_WH-1:0  seg;
  logic [BLK_WH-1:0] blk;
  logic [IDX_WH-1:0] idx;
} st_ADDR_A_t;

Можно определить структуру в package 

package types_pq;
typedef struct packed {
...
} st_ADDR_A_t;

module addr_gen #(...
...
output types_pq::st_ADDR_A_t bus_addr,
...

Но тогда если нужно несколько одинаковых (функционально) модулей с разными вариантами (шириной полей) структур придется делать copy-paste модулей (скучно ).

Казалось бы самое правильное тут это interface да с потрошками параметрами :)

interface bus_if #(IDX_WH=1, BLK_WH=1, SEG_WH=1) ();
  logic [SEG_WH-1:0] seg;
  logic [BLK_WH-1:0] blk;
  logic [IDX_WH-1:0] idx;
...
endinterface

...
bus_if #(.IDX_WH(10), .BLK_WH(8), .SEG_WH(5)) if_bus_addr ();

module addr_gen #(
bus_if.M bus_addr,
...

Но мне интересно стало а можно ли как по другому? Оказалось что да  - тип порта можно передавать через parameter :shok:

module addr_gen #(parameter type BUS_T = types_pq::st_ADDR_A_t) (
... 
  output BUS_T bus_addr,
...

addr_gen #(.BUS_T(types_pq::st_ADDR_A_t)) i_addr_gen_a (...);
addr_gen #(.BUS_T(types_pq::st_ADDR_B_t)) i_addr_gen_b (...);

Проверил что сей изыск успешно синтезируется в Synplify 2018.03 и в Vivado 2018.3,  а вот в старичке Qu 14.1 увы нет.  

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну можно этот тип запихнуть и в interface и при их объявлении уже указывать на структуру из package.  

interface bus_if #(parameter type st_ADDR_t = bit) ();
  st_ADDR_t			st_ADDR
endinterface

bus_if #(.st_ADDR_t(types_pq::st_ADDR_A_t)) if_bus_addr_a ();
bus_if #(.st_ADDR_t(types_pq::st_ADDR_B_t)) if_bus_addr_b ();

addr_gen i_addr_gen_a (if_bus_addr_a);
addr_gen i_addr_gen_b (if_bus_addr_b);

Стало ли нагляднее... боюсь через неделю все равно придется заглядывать в package. 

Но раз уж поля структуры адреса в интерфейсе, удобно ассершен прикрутить какой-нибудь нужный.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация