Perdaculus 0 19 декабря, 2019 Опубликовано 19 декабря, 2019 · Жалоба Добрый день. Возник вопрос, как в модельсим передать между модулями упакованную структуру одно поле которой параметризировано? Если пишу так, то он ругается на то что структура не определена (логично): 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? Да я в принципе могу определить выход просто как разрядность и в теле присвоить ему упакованную структуру, но потом при изменении структуры мне разрядность этого выхода придется постоянно менять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 19 декабря, 2019 Опубликовано 19 декабря, 2019 · Жалоба Попробуйте утащить структуру + параметр в отдельный файл. Назвать его типа top.svh и в нужные модули (или даже в весь проект) подключать его директивой 'include "top.svh" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 19 декабря, 2019 Опубликовано 19 декабря, 2019 · Жалоба Приветствую! Можно конечно объявить структуру в package - но к сожалению ее при этом нельзя динамически параметризировать. Но есть вариант - "Назад в будущее" 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. Вариант "А что так можно?" 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 ) ); ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Perdaculus 0 19 декабря, 2019 Опубликовано 19 декабря, 2019 · Жалоба 2 часа назад, nice_vladi сказал: Попробуйте утащить структуру + параметр в отдельный файл. Назвать его типа top.svh и в нужные модули (или даже в весь проект) подключать его директивой 'include "top.svh" 2 часа назад, RobFPGA сказал: вариант - "Назад в будущее" Спасибо! 2 часа назад, RobFPGA сказал: P.S. Вариант "А что так можно?" 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 - работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 19 декабря, 2019 Опубликовано 19 декабря, 2019 · Жалоба Приветствую! 27 minutes ago, Perdachillo said: Почему от меня это скрывали?) Это фича 18+ 27 minutes ago, Perdachillo said: Попробовал в modelsim - работает. Так даже для синтеза работает! Во всяком случае в Vivado и Synplify как то пробовал похожее синтезировать некоторое время назад. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться