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

Синхронизаторы и Gowin

Всем привет!

Обнаружилась досадная особенность при синтезе совершенно элементарной конструкции синхронизатора для параллельной шины у Gowin: вместо пары регистров Gowin Synthesis для ПЛИС GW1N-UV9LQ100C6/I5 и других из этого семейства генерирует память и управляющий триггер. При этом, например, для GW1N-LV1LQ100C6/I5 этого не наблюдается. Вот как выглядит  пример описания для повторения эксперимента:bus_sync.v

RTL после синтеза выглядит красиво и вроде бы мы получили ровно то, что хотели и планировали:
image.thumb.png.6b63740af57378791f37236b31d11918.png

Но как бы не так. В нетлисте, генерируемом параллельной с красивой картинкой 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 для этих синхронизаторов и тем самым совершили ошибку.

 

Изменено пользователем makc
Информация про GW1N-LV1LQ100C6/I5

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


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

У меня Ваш код генерит 16 триггеров, как и положено. Возможно, все остальные модули в Вашем проекте съели все триггеры, и на синхро их просто не осталось. Вот и пошла в ход SSRAM/ Или триггеры попали под санкции)

fpga_project.7z

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


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

5 минут назад, andrewkrot сказал:

меня Ваш код генерит 16 триггеров, как и положено. Возможно, все остальные модули в Вашем проекте съели все триггеры, и на синхро их просто не осталось. Вот и пошла в ход SSRAM/ Или триггеры попали под санкции)

Поменял в вашем проекте тип ПЛИС на GW1N-UV9LQ100C6/I5 и история повторилась. Проект у меня полностью аналогичен вашему, т.е. в нём кроме модуля синхронизатора ничего нет. Поэтому дело не в недостатке триггеров, а в поведении синтезатора.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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