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

Тип 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. 

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

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


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

столкнулся с применением такого в исходниках cva6 / ariane

квеста 10.4е такое не понимает, ругается на Internal error: unhandled IDL type

два случая

1) изи

module axi_lite_interface #(
    ...
    parameter type         axi_req_t      = ariane_axi::req_t,
    parameter type         axi_resp_t     = ariane_axi::resp_t
) (
    ...
    input  axi_req_t                          axi_req_i,
    output axi_resp_t                         axi_resp_o,

    ...

assign data_o = axi_req_i.w.data;

валится на assign

выглядит так будто axi_req_t воспринимает как wire (является ли wire IDL y questa - хз)

при отказе от передачи типа в параметре и явном указании

 input  ariane_axi::req_t                          axi_req_i,

работает

-------------------

2) хуже

module plic_regs #(
  parameter type reg_req_t  = logic,
  ...
  input  reg_req_t req_i,
  ...
   if (req_i.valid) begin
    if (req_i.write) begin 

то есть в модуле (и вышестоящих по иерархии) тип указан logic, хотя по коду это структура,

и только где-то на самом верху передается тип 

   plic_top #(
      .N_SOURCE    ( ariane_soc::NumSources  ),
      .N_TARGET    ( ariane_soc::NumTargets  ),
      .MAX_PRIO    ( ariane_soc::MaxPriority ),
      .reg_req_t   ( plic_req_t              ),

то есть патчить сложнее

----------------

скомпилировалось с -sfcu (и переписывания сгенеренных средой tcl скриптов - может что-то упустил), но симуляция не работает, пока разбираюсь

----------------

есть вопрос - это известная фича, я не изобретаю велосипед? может есть более правильные пути? опенсорсные авторы в "саппорте" советуют выкинуть квесту и взять другой симулятор, но мне проще с квестой, а не верилятором :) 

 

 

 

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


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

On 6/14/2022 at 11:57 AM, yes said:

опенсорсные авторы в "саппорте" советуют выкинуть квесту и взять другой симулятор, но мне проще с квестой, а не верилятором :) 

а что верилятор такое нормально переварит? сомнения берут меня.. :-/

теже авторы из Цюриха и Болоньи в других репо наоборот ментор нахваливают, да не простой, а с доп.фичами:

Quote

Mentor ModelSim ( the free version provided by Altera is only partially working, see issue #12).


https://github.com/pulp-platform/pulpissimo#requirements

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


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

12 hours ago, Doka said:

а что верилятор такое нормально переварит? сомнения берут меня.. :-/

теже авторы из Цюриха и Болоньи в других репо наоборот ментор нахваливают, да не простой, а с доп.фичами:

собрать самому verilator мне не удалось. там вроде бы в опенпитоне (по-моему этой средой пользовался) вроде бы и срез с гита вериляторного фиксированый и все-такое - но не собралось. может старался недостаточно. но скачал виртуальную машину, где уже все как бы собрано из этих исходников - там работает. 

сам по себе верилятор тоже неплохо собирается - но в той опенпитоновской среде кучу длл-ек подключает еще что-то - вобщем проблемы с хостовым компилятором и либами.  

-----------------------------

этот вопрос решился с каденсовским симулятором, там тоже есть всякие варнинги про unsupported - но вобщем работает.

================

под ментором с фичами, по-моему, подразумевается квеста. а в моделсиме нет рандомизации, нет кавериджа и ассершинов, еще может чего-то то нет. в коде полно "if modelsim выкинуть кусок"

  

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


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

37 minutes ago, yes said:

сам по себе верилятор тоже неплохо собирается - но в той опенпитоновской среде кучу длл-ек подключает еще что-то - вобщем проблемы с хостовым компилятором и либами.  

судя по упоминанию длл-ек сборка в винде. там не пробовал.  в линуксе всё по стоковой инструкции из коробки собирается - что икарус, что верилятор.

единственное, об ред-хатовский gcc версии 4.8 может споткнуться, ну так это не беда - есть devtoolset с любой версией gcc up to 11

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


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

1 minute ago, Doka said:

судя по упоминанию длл-ек сборка в винде. там не пробовал.  в линуксе всё по стоковой инструкции из коробки собирается - что икарус, что верилятор.

да в теории оно все так "ис коропки", а попробуй собери :). тем более в гитах версии/таги опенсорсники не любят. если берешь какой-то замороженный проект, то там для субмодулей могут быть указаны хэши - но такое тоже редко...

 

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


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

On 6/14/2022 at 10:57 AM, yes said:

2) хуже ...

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

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...