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

Библиотека от Alex Forencich. Продукт или пример?

Всем привет!

Вот есть известный в узких кругах такой товарищ -- Alex Forencich. Знаменит своими обширными опенсорсными библиотеками на Verilog, выложенными на github. Неоднократно встречал очень положительные (если не сказать "восторженные") отзывы, в т.ч. и страницах этого форума. Сам не пользовался, полистал только. Ну, кода написано много, весь на Verilog-2001. Код в целом аккуратный.

Тут потребовалось поднимать RGMII (Xilinx 7-series), рассматривал разные варианты, в том числе вспомнил и про эту библиотеку. И по мере вникания в тему возник вопрос: а кто-нибудь реально что-то из этой библиотеки использовал? Каков успех? Особенно интересует verilog-ethernet.

У Xilinx есть корка GMII-RGMII, она мне не очень подходит -- избыточна, но использовал её (example project) в качестве референса. Поначалу написал код по своему пониманию, посмотрев, как устроено тактирование на приёме (это самый тонкий момент, с передающей стороной всё стандартно -- ODDR для клока и данных и вперёд). В этом оба варианта совпадают (rx_clk через CC (Clock Capable) pin подаётся на BUFIO, с которого тактируются IDDR элементы, и на BUFR, через который тактируется регулярная логика). Но на этом совпадения заканчиваются. У Forencich'а принимаемые данные сразу идут на IDDR, а у Xilinx через IDELAY элемент (и это, как показали эксперименты, играет важную роль). При этом у Forencich'а совсем нет констрейнов по этому интерфейсу -- set_input_delay/set_output_delay. Ну, это как-то вообще не серьёзно -- такие интерфейсы без констрейнов не работают.

Мой исходный вариант был похож на библиотеку Forencich'а: данные с входных пинов идут на IDDR. Дальше я начал это дело констрейнить. И успеха не имел -- тайминги никак не сходились. В качестве референса по констрейнам взял example project для корки Xilinx. Надо сказать, что констрейны там весьма нетривиальные, и я до сих пор не понимаю, как работают некоторые из них (см. ниже). По итогу возни с этим хозяйством, пришёл к тому, что без элемента IDELAY (и соответствующих констрейнов для них -- там величина задержки, объединение в группу вместе с IODELAYCTRL) адекватных таймингов не добиться. Добавив эти элементы и подобрав параметр задержки, добился-таки положительного результата.

И не даёт покоя вопрос: а как же эта крутая библиотека, на которую исключительно положительные отзывы? Не знаю, как другие её части, но RGMII на приём там нерабочий от слова совсем! И отсутствие констрейнов внешнего интерфейса просто сразу ставит большой вопрос о применимости данной библиотеки. И сильно подрывает доверие ко всему остальному. Пока для меня это выглядит как обычный open-source, который автор просто выложил в каком-то виде, про который не ясно, он годный на что-то или нет.

 

По констрейнам. Там есть вот такие:

set_multicycle_path -from [get_clocks rgmii_rxclk] -to ${rxclk} -setup 0
set_multicycle_path -from [get_clocks rgmii_rxclk] -to ${rxclk} -hold -1

Тут rgmii_rxclk -- это виртуальный клок, по которому поступают данные на вход, rxclk -- это клок на rgmii_rxc пине (который Clock Capable) и который тактирует входную логики этого интерфейса внутри ПЛИС.

Технически тут мультицикл используется для т.н. сдвига "окна". Но зачем это сделано и как работает, я не догоняю. Может кто-нибудь объяснить?

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


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

Я ргмии его не юзал. Только xgmii и весь axis. Констрейны поставляются в скрипте tcl. Нет их там для rgmii?

 

До офиса доеду, гляну

 

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

А либа хороша, что для неё есть вся обвязка питоновская для симуляции в cocotb

Не могли бы скинуть точную ссылку на исходник переходник нужный? Запущу симуляцию его гляну

https://github.com/alexforencich/verilog-ethernet/blob/master/syn/vivado/rgmii_phy_if.tcl

Не ваши констрейны?

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


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

14 минут назад, new123 сказал:

Констрейны поставляются в скрипте tcl

Поиском посканировал set_input/output_delay: попадаются они очагово и ничего толком не констрейнят (так, скорее для затыкания варнингов). Я не понимаю, как без таких констрейнов могут работать внешние скоростные интерфейсы. Это вызывает очень сильные сомнения в серьёзности этой библиотеки.

16 минут назад, new123 сказал:

А либа хороша, что для неё есть вся обвязка питоновская для симуляции в cocotb

Ну, это кому cocotb катит. А если UVM?

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


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

я там свое сообщение дописал, возможно вы не увидели.
если скажите какой исходник, я его мейкну быстро и могу показать wave как оно работает

и еще констрейны для rgmii phy приложил, я так понял у вас речь про него (судя по тому, что вам нужен input_delay). для MAC, где rgmii в axis конвертится, инпуты вроде не нужны

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


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

38 минут назад, new123 сказал:

я там свое сообщение дописал, возможно вы не увидели.

Это я всё видел. Там внутри он констрейнит CDC, к собственно RGMII это отношения не имеет. Для Xilinx это вообще делать не надо, там в Vivado всё сразу грамотно сделано. Для внешних интерфейсов нужно задавать тайминги внешнего мира, чтобы STA адекватно оценивал результаты разводки конечного нетлиста. Для медленных сигналов обычно достаточно просто ложные пути прописать, но для быстрых, к коим относятся GMII/RGMII, так делать нельзя, там обязательно нужно констрейнить input/output задержки. И вот этого-то я там и не нашёл.

1 час назад, new123 сказал:

Не могли бы скинуть точную ссылку на исходник переходник нужный? Запущу симуляцию его гляну

А что толку запускать эту симуляцию? По функционалке оно работает скорее всего. Ну, так и мой первый вариант прекрасно работал. А вот после синтеза и разводки и правильными констрейнами ничо не сошлось. И пришлось дорабатывать описание, вставляя IDELAY. Косяки, возможно, вылезли бы на timing simulation. Но оно щас разве доступно?

 

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


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

3 hours ago, dxp said:

И не даёт покоя вопрос: а как же эта крутая библиотека, на которую исключительно положительные отзывы? Не знаю, как другие её части, но RGMII на приём там нерабочий от слова совсем! И отсутствие констрейнов внешнего интерфейса просто сразу ставит большой вопрос о применимости данной библиотеки. И сильно подрывает доверие ко всему остальному. Пока для меня это выглядит как обычный open-source, который автор просто выложил в каком-то виде, про который не ясно, он годный на что-то или нет.

 

У меня впечатления от этой либы такие - функционально вроде все работает но при использовании в конкретном  железе без  напильника не обойтись.
В частности в плане констрейнов и CDC.  Слишком уж часто это специфические вещи которые тяжело полноценно (и универсально) учесть в  общем коде библиотеки.  

 

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


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

17 минут назад, RobFPGA сказал:

Слишком уж часто это специфические вещи которые тяжело полноценно учесть в  общем коде библиотеки.  

Не знаю, как в остальном, но в той части, что я изучал (RGMII и вокруг него), он там постарался -- условная компиляция по параметрам, использование примитивов технологии: например, если указан параметр XILINX, то там реализация на примитивах BUFIO и BUFR (если 7 серия) или BUFG (если US/US+), IDDR, ODDR -- т.е. всё как положено по доке. Но элементы задержки по входным путям не поставил. А без этого оно не работает. Видимо, не досмотрел. А в железе он это не проверял. Иначе это не объяснить.

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


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

14 minutes ago, dxp said:

Видимо, не досмотрел. А в железе он это не проверял. Иначе это не объяснить.

Увы, все  возможные варианты в железе не учесть. 
Я вот сейчас как раз работаю с модулем MAC GMII из этой библиотеки  в ... ISE для Spartan-6.   И тоже  без IODELAY времянки не сходились. Увидев это поставил за 5 мин. IODELAY в топе  в простейшем FIXED варианте включения.   

Но учитывать в общей либе  все возможные варианты версий IODELAY (для разных типов и семейств FPGA), и их возможные вариантов включений это-ж ужас какой  сколько работы ... 

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


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

3 hours ago, dxp said:

И не даёт покоя вопрос: а как же эта крутая библиотека, на которую исключительно положительные отзывы? Не знаю, как другие её части, но RGMII на приём там нерабочий от слова совсем! И отсутствие констрейнов внешнего интерфейса просто сразу ставит большой вопрос о применимости данной библиотеки. И сильно подрывает доверие ко всему остальному. Пока для меня это выглядит как обычный open-source, который автор просто выложил в каком-то виде, про который не ясно, он годный на что-то или нет.

Ну вы же не ожидали в самом деле, что сложный модуль из Open-Source  источника удастся применить у себя без допиливания! Готовые, отлаженные компоненты в open-source - это скорее исключение, чем правило.

Так что ответ на ваш вопрос:

Библиотека от Alex Forencich. Продукт или пример?

- это хорошая референсная библиотека примеров RTL модулей. Не продукт. С ее помощью можно многому научиться, или ей можно воспользоваться как полуфабрикатом. Но для доведения до практически применимого результата придется еще постараться. Где-то больше, где-то меньше.

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


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

1 hour ago, RobFPGA said:

В частности в плане констрейнов и CDC. 

а вы кстати констрейны на его cdc переписывали? )

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


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

9 minutes ago, new123 said:

а вы кстати констрейны на его cdc переписывали? )

Естественно! Нет ...
Так как констрейнов для ISE в примерах нет. Поэтому ваял все сам.   

P.S. Это как раз то что мне не понравилось  в этой либе   - то что CDC модули "размазаны" в RTL коде. 
Логичнее бы было  выделить  их в отдельные модули  которые легко можно бы было адаптировать зависимости от семейства FPGA.  

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


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

9 minutes ago, RobFPGA said:

Естественно! Нет ...
Так как констрейнов для ISE в примерах нет. Поэтому ваял все сам.   

а констрейны вивады и ise разные вещи получается? я просто ни разу ise не открывал

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


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

2 minutes ago, new123 said:

а констрейны вивады и ise разные вещи получается? я просто ни разу ise не открывал

Да разные, и по синтаксису и по принципам  определения.   
По сравнению  с констрейнами в Vivado  констрейны в ISE боль и страдание ...

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


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

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

Но учитывать в общей либе  все возможные варианты версий IODELAY (для разных типов и семейств FPGA), и их возможные вариантов включений это-ж ужас какой  сколько работы ... 

В общем, я согласен. Но если он снизошёл до примитивов конкретной технологии, то надо доводить до конца (или не лезть в это вообще, оставляя портировать код тем, кому актуально). Ведь он всё сделал, кроме последнего шажка, но этот шажок оказался ключевым. Это вот хорошо, что вы знаете про этот нюанс с IODELAY, а менее опытные люди здесь обречены на проблемы, у них это будет не 5 минут. 

Я ранее делал подобное на Альтере, там другой подход - клок от PHY через dedicated clock pin заводится на PLL в zero compensation mode, где и осуществляется выравнивание клока под данные, там никаких примитивов не требовалось. А тут опыта с этим не было, пришлось разбираться.

44 минуты назад, Raven сказал:

Не продукт

Спасибо за мнение. Я пришёл к такому же выводу.

45 минут назад, Raven сказал:

С ее помощью можно многому научиться, или ей можно воспользоваться как полуфабрикатом. Но для доведения до практически применимого результата придется еще постараться. Где-то больше, где-то меньше.

Учиться по такому коду тяжело (документации нет, комментирован слабо, объём большой). Применять, допиливая... Verilog-2001? Нет уж, увольте, слишком привык к удобствам SV. Т.ч. либо брать как есть, либо переписывать, а это уже совсем другая работа.

Ну, а с RGMII для меня там конкретно подлянка вышла -- хорошо, что есть корка от Xilinx, посмотрел, как там сделано, нашёл IDELAY, пофтыкал на эту тему и убедился, что без него никак. Т.е. по факту, если бы не эта либа, я бы с задачей справился на пару-тройку дней быстрее. А реализация всё равно своя, с ней трудностей не возникло (там же просто примитивы надо аккуратно друг с другом соединить и всё). Самое сложное, имхо, в этой теме -- это правильно обконстрейнить, особенно входной интерфейс. И тут без референса я бы не справился.

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


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

4 hours ago, dxp said:

). В этом оба варианта совпадают (rx_clk через CC (Clock Capable) pin подаётся на BUFIO, с которого тактируются IDDR элементы, и на BUFR, через который тактируется регулярная логика). Но на этом совпадения заканчиваются. У Forencich'а принимаемые данные сразу идут на IDDR, а у Xilinx через IDELAY элемент (и это, как показали эксперименты, играет важную роль). При этом у Forencich'а совсем нет констрейнов по этому интерфейсу -- set_input_delay/set_output_delay. Ну, это как-то вообще не серьёзно -- такие интерфейсы без констрейнов не работают.

Если данные защелкиваются в iddr и клок сразу идет в IO клоковую цепь и на iddr, то в set_input_delay смысла нету. Что он может изменить?

Задержку данных нужно регулировать через iodelay, подбирая вручную или запускать автоподстройку. Иногда можно без линий задержки обойтись.

А задержки по входу не констрейнтить вообще или вписать небольшое отрицательное значение для холда если нет iodelay.

54 minutes ago, Raven said:

Ну вы же не ожидали в самом деле, что сложный модуль из Open-Source  источника удастся применить у себя без допиливания! Готовые, отлаженные компоненты в open-source - это скорее исключение, чем правило.

Так что ответ на ваш вопрос:

Библиотека от Alex Forencich. Продукт или пример?

- это хорошая референсная библиотека примеров RTL модулей. Не продукт. С ее помощью можно многому научиться, или ей можно воспользоваться как полуфабрикатом. Но для доведения до практически применимого результата придется еще постараться. Где-то больше, где-то меньше.

Именно!

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


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

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

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

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

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

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

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

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

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

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