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

Передача упакованной структуры между модулями

Добрый день. 
Возник вопрос, как в модельсим передать между модулями упакованную структуру одно поле которой параметризировано?
Если пишу так, то он ругается на то что структура не определена (логично):

module input_processing #(
    parameter WORK_WIDTH = 18
)(
    input logic ireset,
    input logic iclk,
    
    output st_TAG port_tag,    
);
typedef struct packed{
    logic throw;            
    logic R_pack;            
    logic H_pack;            
    logic [$clog2(WORK_WIDTH)-1:0] pad;    
    logic [15:0] slice_len;    
} st_TAG;
** Error: near "port_tag": syntax error, unexpected IDENTIFIER, expecting ')'.

Если так, то говорит, что не определен параметр (тоже логичо):

typedef struct packed{
    logic throw;            
    logic R_pack;            
    logic H_pack;            
    logic [$clog2(WORK_WIDTH)-1:0] pad;    
    logic [15:0] slice_len;    
} st_TAG;
module input_processing #(
    parameter WORK_WIDTH = 18
)(
    input logic ireset,
    input logic iclk,
    
    output st_TAG port_tag,
);
** Error: (vsim-3043) Unresolved reference to 'WORK_WIDTH' in $root.WORK_WIDTH.

На самом деле у меня уже возникала похожая проблема, только не со структурой, а с функцией. 
Возникала ошибка, когда я пытался рассчитать размерность порта с помощью функции определенной в теле модуля.
Я нахожу логику в ошибках modelsim, но если он запрещает заходить в тело модуля при объявлении портов, то должна быть 
возможность определить структуру/функцию в описании портов, чтобы использовать их там. Или нет? 
Забавно, что Quartus ошибку не выдает (по крайней мере с функциями), то есть там получается другая область видимости.
Вы не находите странным такую разницу в подходах Quartus 17 и Modelsim 10.4b? 

Да я в принципе могу определить выход просто как разрядность и в теле присвоить ему упакованную структуру, но потом при изменении
структуры мне разрядность этого выхода придется постоянно менять.

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


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

Попробуйте утащить структуру + параметр в отдельный файл. Назвать его типа top.svh и в нужные модули (или даже в весь проект) подключать его директивой 'include "top.svh"

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


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

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

Можно конечно объявить структуру в package - но к сожалению ее при этом нельзя динамически параметризировать. 

Но есть вариант  -  "Назад в будущее" :biggrin: 

module input_processing #(parameter WORK_WIDTH = 18) (  
  ireset  ,
  iclk    ,
  port_tag
);

typedef struct packed {
  logic                          throw    ;
  logic                          R_pack   ;
  logic                          H_pack   ;
  logic [$clog2(WORK_WIDTH)-1:0] pad      ;
  logic [                  15:0] slice_len;
} st_TAG_t;

input  logic    ireset  ;
input  logic    iclk    ;
output st_TAG_t port_tag;
....
  
endmodule

Делает то что нужно. - Но надо понимать что  типы структур  объявленные  вне модуля и внутри его буду разными.  Иногда это может вызывать  сложности (в основном при верификации). 

Удачи! Rob.

P.S.  Вариант  "А что так можно?" :shok: :scratch_one-s_head: :yes:

module input_processing #(parameter type TAG_T=int) (
  input  wire  iclk    ,
  input  wire  ireset  ,
  output TAG_T port_tag
);
...
endmodule
  
module top ...

typedef struct packed {
  logic                          throw    ;
  logic                          R_pack   ;
  logic                          H_pack   ;
  logic [$clog2(WORK_WIDTH)-1:0] pad      ;
  logic [                  15:0] slice_len;
} st_TAG_t;

st_TAG_t tag;

input_processing #(.TAG_T(st_TAG_t)) i_inst (
  .ireset  (ireset),
  .iclk    (iclk  ),
  .port_tag(tag   )
);
...
  

 

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


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

2 часа назад, nice_vladi сказал:

Попробуйте утащить структуру + параметр в отдельный файл. Назвать его типа top.svh и в нужные модули (или даже в весь проект) подключать его директивой 'include "top.svh"

 

2 часа назад, RobFPGA сказал:

 вариант  -  "Назад в будущее" 

Спасибо!

2 часа назад, RobFPGA сказал:

P.S.  Вариант  "А что так можно?" :shok: :scratch_one-s_head: :yes:


module input_processing #(parameter type TAG_T=int) (
  input  wire  iclk    ,
  input  wire  ireset  ,
  output TAG_T port_tag
);
...
endmodule
  
module top ...

typedef struct packed {
  logic                          throw    ;
  logic                          R_pack   ;
  logic                          H_pack   ;
  logic [$clog2(WORK_WIDTH)-1:0] pad      ;
  logic [                  15:0] slice_len;
} st_TAG_t;

st_TAG_t tag;

input_processing #(.TAG_T(st_TAG_t)) i_inst (
  .ireset  (ireset),
  .iclk    (iclk  ),
  .port_tag(tag   )
);
...
  

Почему от меня это скрывали?) Это прямо крутая фича.
Попробовал в modelsim - работает. 
 

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


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

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

27 minutes ago, Perdachillo said:

Почему от меня это скрывали?)

Это фича 18+ :biggrin:

27 minutes ago, Perdachillo said:

Попробовал в modelsim - работает. 

Так даже для синтеза работает!  Во всяком случае в Vivado и Synplify как то пробовал похожее синтезировать некоторое время назад. 

Удачи! Rob.

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


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

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

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

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

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

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

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

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

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

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