Koluchiy 0 12 марта, 2021 Опубликовано 12 марта, 2021 · Жалоба Здравствуйте, уважаемые гуры. Хочу сделать модуль с параметром (количество портов). Если чо, все это в Vivado 2019. В зависимости от параметра должны подключаться немного разные модули с различными наборами сигналов. Думал я сделать это таким образом: в зависимости от параметра определять `define, в зависимости от `define подключать нужные модули и разрешать те или иные сигналы вложенных модулей. module# ( parameter NumCh = 1 ) UpperModule ( набор сигналов ) generate if (NumCh == 1) begin:GTH_1Ch_Block `define GTH_1Ch end else begin:GTH_2Ch_Block `define GTH_2Ch end `ifdef GTH_1Ch LowerModule1 `endif `ifdef GTH_2Ch LowerModule2 `endif ( // Common signals .Input(In1), ... //Configurable signals `ifdef GTH_2Ch .Input(In2), `endif ); Проблема: не работает. Vivado явно не понимает подключение различных модулей в зависимости от `define, который объявляется в generate. С одной стороны, не выдает ошибок, с другой стороны явно подключает не тот модуль, который задан параметром. Что я делаю не так? P.S. Я понимаю, что можно в зависимости от значения подключать разные модули через generate, без директив препроцессора. Но это неудобно, т.к. у подключаемых модулей много общих сигналов. Хотелось бы подключать один модуль, но у него менять название в зависимости от параметра, и добавлять ему дополнительные сигналы. Насколько я понимаю, сделать это можно только при помощи директив препроцессора (`ifdef). Но я явно что-то не так делаю при создании `define в зависимости от параметра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 12 марта, 2021 Опубликовано 12 марта, 2021 · Жалоба Когда компилируется ваш generate, препроцессор своё уже отработал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 12 марта, 2021 Опубликовано 12 марта, 2021 (изменено) · Жалоба дефайн в generate не прокатывает. Давненько сам так поймался в квартусе https://stackoverflow.com/questions/59264458/define-in-generate-if-statement пришлось в generate сразу модули прописывать. Изменено 12 марта, 2021 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 12 марта, 2021 Опубликовано 12 марта, 2021 · Жалоба Всем спасибо, это я уже нагуглил. Есть ли человеколюбивое решение моего вопроса? Объявлять каждый вариант вложенного модуля в generate плохо тем, что много повторяющегося текста. Соответственно, при каких-то изменениях придется менять сразу в нескольких местах, что рождает вероятность ошибок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 12 марта, 2021 Опубликовано 12 марта, 2021 · Жалоба Я стремлюсь к блочности кода, чтобы по сто раз в разных местах не менять. Может бывалые придут расскажут как быть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 12 марта, 2021 Опубликовано 12 марта, 2021 · Жалоба 1 hour ago, Koluchiy said: Думал я сделать это таким образом: в зависимости от параметра определять `define, в зависимости от `define подключать нужные модули и разрешать те или иные сигналы вложенных модулей. Дефайны обрабатываются на этапе препроцессинга, а дженерейты на этапе элаборации. Так и не будет работать, увы. Не совсем понятна задача. Если нужно подключать разные модули, тогда сделайте всё под дженерейт. Прямо подключение целого модуля по параметру дженерейта (А присвоение портов через wildcard'ы). Минус этого решения - если не будет обьявлен неподключаемый модуль в библиотеке, тогда будет ошибка. Второй вариант - попробовать сделать всё в Интерфейсе. Сделать интерфейс враппер для всех модулей, а внутри уже по параметру выбирать нужный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 12 марта, 2021 Опубликовано 12 марта, 2021 · Жалоба 5 часов назад, Koluchiy сказал: в зависимости от параметра определять `define, в зависимости от `define подключать нужные модули Если хотите менять список портов модуля, то параметр не подойдет. Нужен `ifdef или interface/modport Если список портов должен зависеть от параметра (т.е. разные инстансы должны иметь разные порты), то только интерфейсы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 13 марта, 2021 Опубликовано 13 марта, 2021 · Жалоба 13 часов назад, Nick_K сказал: А присвоение портов через wildcard'ы Не пользуйтесь этим, если не хотете, чтобы коллеги вас поминали тихим матерным словом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 14 марта, 2021 Опубликовано 14 марта, 2021 · Жалоба On 3/13/2021 at 6:37 AM, andrew_b said: Не пользуйтесь этим, если не хотете, чтобы коллеги вас поминали тихим матерным словом. При чём здесь это? Я предложил возможное решение. Какой ценой - это совсем другой вопрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться