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

Выходные регистры ввода/вывода в Gowin GW2A

Доброго времени суток всем участникам,

Попытавшись разместить выходные регистры данных и управления OEN в ячейках ввода/вывода у Gowin GW2A (используется Gowin_V1.9.9Beta-1 и пробовал Gowin_V1.9.8.11) я столкнулся с рядом проблем:

  1. Отсутствуют констрейнты, которые бы позволяли на уровне исходника на Verilog говорить среде, что синтезируемый триггер (регистр) необходимо разместить во встроенном в ячейку ВВ триггере.
  2. В описании архитектуры GW2A приводится следующая иллюстрация:
    image.thumb.png.e8a643936c426c90d0e9fb5aec20f7d1.png
    Но при этом в библиотеке примитивов отсутствуют соответствующие примитивы для OREG/TRIREG. Есть, правда ODDR, но к нему есть свои вопросы и о них ниже.
    Для режима SDR ниже приводится более детальная иллюстрация структуры ячейки:
    image.thumb.png.cb0324f9e8b752a5dec279a054e72436.png
    При этом для входов сброса есть следующее примечание: "Local set/reset signal O_SR and I_SR can be either synchronized reset, synchronized set, asynchronous reset, asynchronous set, or no-function;". Т.е. должны поддерживаться все возможные режимы сброса (вполне ожидаемо, на первый взгляд). Однако из-за отсутствия в библиотеке соответствующих примитивов на практике в этом убедиться затруднительно. При этом у приведенных в описании архитектуры триггеров для режима DDR вход сброса отсутствует.
  3. С другой стороны в документе "Gowin FPGA Primitive User Guide", где казалось бы должны были быть описаны указанные в описании архитектуры элементы (триггеры) есть только описание регистров DDR:
    image.thumb.png.ff01fbafa54e8bba4088c1a2b67a57f4.png
    Причём, что очень странно, в описании портов ODDRC, для входа CLEAR указана поддержка только асинхронного режима:
    image.thumb.png.f8fade95762b2465dba409d6bb0c24a1.png
  4. После выполнения PnR с настройками размещения регистров в IOB в результатах бэканнотации (нетлист, генерируемый после PnR) у триггеров, которые я считал должны были быть размещены в ячейках ВВ, я вижу инстанцирование DFFR с очень подозрительным недокументированным аттрибутом:
    (*gowin_io_reg = "FALSE" *) DFFR ...

    Найти описание этого gowin_io_reg я нигде не смог, гугл про него не знает.

  5. Как можно проконтролировать, какие регистры попали в триггера ячеек ВВ, а какие нет? Ни в одном репорте этих данных нет.

Собственно вопрос: какие есть варианты управления размещением триггеров для надежного их размещения в ячейках ВВ?

Пока в голову приходит только один вариант: явно инстанцировать ODDRC в режиме SDR (подавать на оба входа один и тот же сигнал) и полагаться на него. Но это выглядит крайне кривой затеей, т.к. исходя из описания архитектуры должны быть возможности как минимум использовать синхронных сброс триггеров в ячейках ВВ.

PS: Похоже, что та же проблема и с входными регистрами (триггерами). Однако с ними всё-таки немного проще и, надеюсь, решение для выходов будет вполне применимо и для входов.
PPS: Выяснилось, что для размещения регистров управления третьим состоянием выходов в ячейках ВВ важна полярность. Т.е. если активный уровень сигнала управления будет 1, то между этим регистром и входом OEN на буфере ВВ синтезатор добавит инвертор и это не позволит PnR разместить соответствующий триггер в ячейке ВВ. Поэтому необходимо учитывать эту особенность и правильно выбирать активный уровень этих сигналов в проекте (должен быть active-low).

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


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

Нашёлся ответ в документации (SUG935-1.3.4E, 05/25/2023 Gowin Design Physical Constraints User Guide) как довольно криво, но вполне надёжно размещать регистры в ячейках ВВ:

Цитата

Example 6
INS_LOC “reg_name” B14;
// It is constrained to the IOB by restraining the INS_LOC of the REGISTER/IOLOGIC.

И это работает. Но остаётся вопрос, как добиться того же эффекта через атрибуты Verilog/VHDL.

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


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

Доброго дня.
Есть ещё один, вроде бы не упомянутый вами документ: UG289-2.1.4E, 05/25/2023 - Gowin Programmable IO (GPIO) User Guide, но в нём я сходу не нашёл то, о чём вы спрашиваете. Может быть поможет @StewartLittle? И можно ли как-то опосредованно задать вопрос поддержке? Хотя, помню, у меня у самого был опыт, но т.к. сформулировал я вопрос криво, в чём сам и виноват, то получил и соответствующий ответ. Готов повторить, но уже с вашим вопросом.

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


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

54 минуты назад, Zversky сказал:

документ: UG289-2.1.4E, 05/25/2023 - Gowin Programmable IO (GPIO) User Guide, но в нём я сходу не нашёл то, о чём вы спрашиваете.

Его я тоже видел, но поскольку там ничего нет, то и писать о нем не стал. 

55 минут назад, Zversky сказал:

И можно ли как-то опосредованно задать вопрос поддержке?

Вот это было бы неплохо, но похоже речь идёт о реализации дополнительных атрибутов, а новые фичи они явно реализовать не спешат.

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


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

В 03.06.2023 в 12:00, makc сказал:

Собственно вопрос: какие есть варианты управления размещением триггеров для надежного их размещения в ячейках ВВ?

Configuration - Place & Route - Place - Place input register to IOB / Place output register to IOB / Place inout register to IOB

Не?

Но это, правда, для всех входов/выходов/бидиров оптом.

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


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

2 минуты назад, StewartLittle сказал:

Configuration - Place & Route - Place - Place input register to IOB / Place output register to IOB / Place inout register to IOB

Не?

Не. Оно не всегда работает, к моему огромному сожалению. По какой причине это происходит сказать сложно, но во Floorplanner'e я это пронаблюдал и пришлось писать констрейнты физического размещения, указанные выше. Хотелось бы того же эффекта, но через атрибуты.

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


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

47 минут назад, StewartLittle сказал:

Но это, правда, для всех входов/выходов/бидиров оптом.

Похоже у них всё-таки есть недокументированный атрибут, который работает и влияет на упаковку в триггеры ячеек ввода/вывода.

Если написать так:

    (* gowin_io_reg = "FALSE" *) reg  dataout_q;
    always @(posedge outclock) begin
        dataout_q <= data_i;
    end

То dataout_q не пакуется в регистры В/В, что видно во Floorplanner и в PnR Report'e.

Если написать:

    (* gowin_io_reg = "TRUE" *) reg  dataout_q;
    always @(posedge outclock) begin
        dataout_q <= data_i;
    end

 То dataout_q пакуется в регистры В/В, что опять же видно во Floorplanner и в PnR Report'e.

Т.е. атрибут gowin_io_reg позволяет индивидуально управлять упаковкой. Прошу заинтересованных участников проверить это поведение и, если будет такая возможность, задать вопрос техподдержке Gowin насчёт этого чудесного атрибута.

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


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

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

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

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

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

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

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

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

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

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