makc 220 17 июня, 2022 Опубликовано 17 июня, 2022 (изменено) · Жалоба Всем привет! Обнаружилась досадная особенность при синтезе совершенно элементарной конструкции синхронизатора для параллельной шины у Gowin: вместо пары регистров Gowin Synthesis для ПЛИС GW1N-UV9LQ100C6/I5 и других из этого семейства генерирует память и управляющий триггер. При этом, например, для GW1N-LV1LQ100C6/I5 этого не наблюдается. Вот как выглядит пример описания для повторения эксперимента:bus_sync.v RTL после синтеза выглядит красиво и вроде бы мы получили ровно то, что хотели и планировали: Но как бы не так. В нетлисте, генерируемом параллельной с красивой картинкой RTL всё выглядит уже не так безобидно: Спойлер DFF st1_0_s2 ( .Q(st1_0_5), .D(st1_0_19), .CLK(clk_d) ); RAM16S4 st1_0_s4 ( .DO(dout_d[3:0]), .DI(din_d[3:0]), .AD({GND,GND,GND,st1_0_5}), .WRE(VCC), .CLK(clk_d) ); RAM16S4 st1_0_s6 ( .DO(dout_d[7:4]), .DI(din_d[7:4]), .AD({GND,GND,GND,st1_0_5}), .WRE(VCC), .CLK(clk_d) ); INV st1_0_s12 ( .O(st1_0_19), .I(st1_0_5) ); По сути генерируется память с организацией 2х8 и Т-триггер, который перебирает адрес этой памяти, имитируя поведение сдвигового регистра, которым и является синхронизатор. Всё бы ничего, но это не синхронизатор. Это подтверждает и отчёт об используемых ресурсах, получаемый после синтеза: Hierarchy Module Resource MODULE NAME REG NUMBER ALU NUMBER LUT NUMBER DSP NUMBER BSRAM NUMBER SSRAM NUMBER bus_sync (src/bus_sync.v) 1 - 1 - - 2 В котором SSRAM NUMBER равен двум, а триггеров только один вместо 16 и это само по себе уже наводит на нехорошие мысли, что что-то здесь не так. Поправьте меня, если я не прав да и вообще интересны ваши комментарии по теме синтезатора у Gowin. Я не хочу сказать, что это какая-то ошибка в синтезаторе. Формально он прав, т.к. принял решение сэкономить на триггерах и это неплохо. Но проблема в другом: в штатном асинхронном FIFO IP от Gowin именно через такие "псевдосинхронизаторы" передаются между тактовыми доменами счётчики, считающие в коде Грея. Соответственно из этого я делаю вывод, что разработчики забыли поставить атрибуты syn_srlstyle для этих синхронизаторов и тем самым совершили ошибку. Изменено 17 июня, 2022 пользователем makc Информация про GW1N-LV1LQ100C6/I5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewkrot 0 17 июня, 2022 Опубликовано 17 июня, 2022 · Жалоба У меня Ваш код генерит 16 триггеров, как и положено. Возможно, все остальные модули в Вашем проекте съели все триггеры, и на синхро их просто не осталось. Вот и пошла в ход SSRAM/ Или триггеры попали под санкции) fpga_project.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 220 17 июня, 2022 Опубликовано 17 июня, 2022 · Жалоба 5 минут назад, andrewkrot сказал: меня Ваш код генерит 16 триггеров, как и положено. Возможно, все остальные модули в Вашем проекте съели все триггеры, и на синхро их просто не осталось. Вот и пошла в ход SSRAM/ Или триггеры попали под санкции) Поменял в вашем проекте тип ПЛИС на GW1N-UV9LQ100C6/I5 и история повторилась. Проект у меня полностью аналогичен вашему, т.е. в нём кроме модуля синхронизатора ничего нет. Поэтому дело не в недостатке триггеров, а в поведении синтезатора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться