Arnold Enginegger
699 subscribers
38 photos
4 videos
12 files
81 links
Тоже хочу в блогеры
Download Telegram
Doka запостил ссылку на список проектов на гитхабе, отсортированных по популярности. Список давно не обновлялся и не включал в себя SystemVerilog, по этому я сделал форк и обновил данные. Оставил только Verilog и VHDL, и добавил SystemVerilog и Bluespec. К сожалению, в списке поиска гитхаба больше нет HDL языков 🤷‍♀️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🎉1
Вышел второй номер журнала FPGA-Systems Magazine :: FSM :: № BETA (state_1)! Много интересного. От меня тоже есть небольшая заметка про быстрое вычисление медианы. Качайте, читайте. Вопросы и комменты можно оставлять в специальной группе.
3
Внезапно узнал, что вот уже четыре месяца товарищ Martin Povišer пилит фронтенд для yosys на базе парсера slang. Если затея выгорит, то это будет самая полная поддержка SV в yosys. И не только в yosys, наверное.
Товарищ добавил тесты своего фронтенда в CHIPS Alliance sv-tests dashboard, и хотя ещё много нужно сделать, уже есть на что посмотреть. Будем следить.
🔥4
Коллеги, вы не сталкивались с торможением GTKWave? Версия, которая на GTK3, отжирает целое ядро процессора просто показывая временную диаграмму. Если поставить курсор, то видно как он нервно моргает, как будто вся диаграмма постоянно перерисовывается. На версии GTK2 такого поведения не наблюдал, там всё летает.
Форенчич два года назад завёл issue на похожую тему, но обсуждение пошло куда-то не туда. А проблема осталась. И судя по тому, что больше таких репортов нет, проблема не сильно распространенная. Возможно даже дело не в программе, а в видеодровах, как однажды было с KiCAD-ом.
В общем, подожду выхода GTKWave4 (а там обещают полностью переработанный рендер) на версии с GTK2.
🤔1
Вы наверное знаете, что в стандарте верилога есть ключевое слово macromodule, которое ничем не отличается от module, за исключением того, что "An implementation may choose to treat module definitions beginning with the macromodule keyword differently". Интересно, откуда растут ноги у этого macromodule и используется ли где нибудь возможность интерпретировать его отлично от module?
Я нашел документ, в котором сказано, что в macromodule можно описывать только wire и операции с ними. Никаких переменных/регистров и процедурных присваиваний, только assign. Интересно, откуда эта информация, если в стандарте об этом ни слова?
🤔5
По мотивам вот этого: https://t.me/vlsihub/598
Нашел в юникоде несколько подходящих символов для подобного документирования вейвформ. Там есть ещё варианты, но эти два мне как-то понравились больше всех. Первый более красивый и наглядный, но надо "рисовать" через строку, т.к. иначе соседние вейвы сливаются. Второй - можно в каждой строке. Несомненный плюс обоих - для одного сигнала нужна одна строка, а не так, как в ASCII: ноль - нижнее подчеркивание, единица - нижнее подчеркивание строкой выше. Ну и несомненный минус - передать через телетайп такое будет затруднительно 🤪

Вот эти символы:
🭼 🭽 🭾 🭿 🮀 ▔ ▁ ╳
⎽ ▄


Возможно в вашем любимом шрифте они будут смотреться криво. Увы. В Йосевке смотрится прекрасно 😍
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍31🔥1🎉1
Forwarded from Andrey S
И снова здравствуйте. (из моего 2008)
🔥11👍3
Про асинхронный сброс и Verilator.

Вот типичный код асинхронного сброса:

always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) ...
else ...
end


Обычно, код работает так же, как в железе. Однако, если в начале симуляции нет клока, то сброс может не сработать. Так выйдет, если rst_n присвоить 0 в нулевом времени через инициализацию в объявлении. Как можно догадаться, в этом случае события negedge rst_n не случится, т.к. по стандарту присвоение в объявлении выполняется раньше присвоения в процессах.

Очевидное решение - в объявлении rst_n присвоить 1 (или вообще ничего не присваивать, X->0 тоже считается за negedge), а в initial - 0:

logic rst_n = 1'b1;
initial rst_n = 1'b0;


Или так:

logic rst_n;
initial begin
rst_n = 1'b1;
rst_n = 1'b0;
end


Однако, и здесь есть нюанс: Verilator не захотел регистрировать это событие, и не выполнил код процесса. Раньше такого в Вериляторе быть не могло, потому что до недавнего времени он был чисто clock-accurate симулятором. А раз клок всегда был, то события negedge rst_n можно было не дожидаться, процесс вызвался бы при первом posedge clk. Но сейчас он стал фактически полноценным event-driven, по этому наверное дожен справляться с такими вещами.

В связи со всем вышесказанным думаю самым правильным решением было бы присвоение rst_n единицы, а как минимум в следующем цикле симуляции сбрасывать его в ноль:

logic rst_n = 1'b1;
initial #1 rst_n = 1'b0;


Запилил issue
🔥8👍1🙏1
В комментах товарищ @Xtyll спросил, не упала ли скорость симуляции в Вериляторе после добавления событийного шедулинга. Сообщаю: не упала.

Добавил тест Верилятора 4-й версии в свой бенчмарк - разница в результатах с версией 5 на уровне погрешности. Для надежности сделал ещё тест на реальном проекте. Там тоже разницы нет. Вот как-то так.
🔥5
В "соседнем чатике" стырил ссылку на интересный канал. Коллега исследует возможности опенсорса для электромагнитной симуляции печатных плат. SI, PI, вот это вот всё на открытых тулах. Интересно, и картинки красивые, стоит посмотреть 😍
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2
Завёл себе ноду Radicle, и поставил на сервер веб-интерфейс. Интересная штука, попробую поюзать.
Если кто не знает, Radicle - это распределенный хостинг гитовых реп. Типа GitHub, только без центрального хранилища. Работает на таком же принципе, как BitTorrent - человек клонирует репу и становится её сидером. Что интересно, "социальные артефакты" - issue, пулл-реквесты (и потенциально другое, т.к. система расширяемая) - хранятся в той же репе, что и код, но не пересекаются с ним. Radicle использует гитовые неймспейсы для хранения этих вещей.
Интересующимся рекомендую зайти на сайт и почитать юзер мануал и инфу по протоколу. Познавательно.
👀7🔥6🤔1
Возвращаясь к напечатанному. Как известно, Verilator не поддерживает неблокирующие присваивания в initial, и даже превращает их в блокирующие, если проигнорировать предупреждение. Это наследие cycle-accurate природы симулятора и в современных реалиях, когда он стал по сути event-driven, может приводить к гонкам.

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

К сожалению, первые два не сильно пригодны, когда у вас уже написаны таски, которые не хочется переписывать. А последний, авторский, теперь и вовсе не работает. Раньше работал, но потом Верилятор стал лучше соответствовать стандартам 😏 (на других симамах он и раньше не работал).

В общем, в результате небольшого эксперимента, опытным путём был выработан следующий способ, одинаково работающий на всех имеющихся в моём распоряжении симуляторах:

logic start_trigger;
initial begin
start_trigger = 1'b0;
#0;
start_trigger = 1'b1;
end

always @(start_trigger) begin
// Здесь делаем то, что обычно делаем в initial
end


Такой квази-initial работает так же, как обычный, за исключением того, что выполняется после всех настоящих initial. При этом, внутри него можно использовать неблокирующие присваивания и задержки.
Надеюсь, что Верилятор больше не поломают, и способ будет годен до тех пор, пока не появится настоящая поддержка неблокирующих присваиваний в initial.

P.S.: Это третий вариант (после авторского). Второй недавно сломали 😏
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Коллега в комментарии к предыдущему посту навел меня на ещё один вариант квази-initial с поддержкой неблокирующих присваиваний:

always begin
// Здесь вставлять код
@(0);
end


Во-первых тут не нужна дополнительная переменная, во-вторых последовательность запусков теперь такая же, как у обычного initial. Блок always выполнится один раз и остановится на строчке @(0) - это ожидание события, которое никогда не произойдёт. Проверил, работает. Можно пользоваться.

P.S.: В предыдущем посте я в спешке обозвал неблокирующие блокирующими. Надеюсь, никто не заметил 😭
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
По совету друзей взялся попробовать новый язык Veryl - более лучший верилог для синтеза. Решил переписать на нём маленький код для маленькой ПЛИС, и сразу же столкнулся с неразрешимой проблемой: нельзя задать начальное значение регистру. На гитхабе есть закрытая issue по этому поводу, в которой автор "в грубой форме" рекомендовал использовать сброс. Для асиков это конечно правильно, но в плисах начальная инициализация - это допустимо, и используется достаточно часто, например когда сброса вообще нет.

Вот такая боль на старте. Придется этот код выносить в модуль на верилоге 😑
Please open Telegram to view this post
VIEW IN TELEGRAM
🤨9👍2🤯2😁1
Коллега любезно поделился ссылкой на занятную статью про то, как всё плохо с безопасностью в открытых EDA. Ну как занятную. Такое мнение всё чаще появляется в публичном пространстве. Однако, я думаю, что дело не только и не столько в открывшихся фактах саботажа в СПО, а в осознании неспособности коммерческих разработчиков сохранить лидерство в обозримом будущем. Они просто бесятся, и со мной согласен Олоф (ну или я с ним 😊).
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Запилил энкодер PAL/NTSC на плисе для ретрокопьютинга. На выходе 8-битный r-2r ЦАП и эмиттерный повторитель. Хорошо видна интермодуляция цветности и яркости, у буржуев называемая Dot Crawl.

Давно хочу переделать на S-Video (это когда яркость и цветность по отдельным проводам), да всё времени нет. Но обязательно сделаю.
🔥19👍4🏆2
Хорошее замечание и ещё один аргумент в срачах спорах про сбросы. Получается (без учёта других аргументов), что тотальный сброс можно делать любым - синхронным или асинхронным, а частичный (только control path, например) лучше синхронным, чтобы в случае чего синтезатор смог сымитировать его на логике.
👍3
30 ноября, заключительная FPGA-Systems совместно с YADRO, онлайн.

Встречаемся в последнюю субботу ноября на трансляции — регистрируйтесь, чтобы получить ссылку на стрим на одной из популярных платформ (Youtube, Rutube, VK).

В программе:

•‎ Запуск AMDGPU и работа с HDMI на ПЛИСе.
•‎ Опыт применения Chisel/Scala для проектирования сложных систем.
•‎ Чем прототипирование отличается от разработки на ПЛИС.
•‎ Обзор обновления линейки BMTI.
•‎ Индустриальные подходы к верификации RISC-V ядер, доступные каждому.
•‎ Советы по применению Extended Useful Skew и не только!

Участие бесплатное, регистрация обязательна.

До встречи!
👍3🔥21
Если вы не сможете прийти, не успели зарегистрироваться или встретите субботу не в Москве, подключайтесь к трансляции заключительной в этом году FPGA-Systems на Youtube, Rutube или VK.

В программе:

11:10 - Введение в проектирование RTL цифровых систем средствами Chisel/Scala
11:50 - Генерация преднамеренных ошибок в UVM-тесте
12:30 - Проектирование интегральной схемотехники в российских САПР
14:00 - Как мы AMD GPU на ПЛИС с RISC-V Linux запускали
14:40 - Open Source Step-and-Compare: делаем индустриальный подход к верификации RISC-V доступным каждому
15:20 - Увеличиваем производительность, искажая время: Extended Useful Skew
16:20 - Работаем с HDMI на ПЛИС
17:00 - Что нового у BMTI? Смотрим на обновление линейки коммунистических ПЛИС

Пишите вопросы докладчикам - если не успеем задать их сразу после доклада, выступающих попросим зайти в комментарии в трансляциях и ответить вам там.

p.s. Записи автоматически останутся доступны по тем же ссылкам, что и трансляции. Нарезка отдельных докладов появится на тех же каналах в течение 2 недель после мероприятия.

p.p.s. Слайды с мероприятия появятся в течение недели после митапа на его сайте.
Немного поигравшись с Veryl пишу отзыв. Если кратко: потенциал есть, но пока не готов.

Не буду лить воду, пойду по фактам. Плюсы языка:

➡️Полярность сброса и клока можно выбрать при сборке. Очень полезная фича, но есть некоторые проблемы с передачей этих знаний в подключаемые модули на верилоге. Есть автоматическая инверсия сброса, если в вериложном модуле сброс не той полярности. Но пока нет инверсии клока и никак не передать информацию о типе сброса - синхронный он или асинхронный.
➡️Фигурные скобки в качестве операторных скобок конечно выглядят гораздо приятней многословных begin/end и module/endmodule.
➡️Нет разделения на блокирующее и неблокирующее присваивание. Язык предназначен для написания только синтезируемого кода, по этому синхронные присваивания - неблокирующие, асинхронные - блокирующие.
➡️if/else как выражение (expression). Как бы реверанс в сторону функциональных языков, но по сути синтаксический сахар над тернарным оператором.
➡️Дженерики! Наконец-то шаг в сторону метапрограммирования. Шаг скромный, но в верилоге этого очень не хватает.
➡️Есть поддержка аннотации CDC. Если вдруг вы небезопасно передаёте данные из домена в домен, транслятор даст вам по рукам.
➡️Какая-никакая стандартная библиотека с FIFO и некоторыми полезными модулями (кое кто из чата FPGA Systemc был бы очень рад).

Теперь минусы:

➡️Нет приведения ширины. Есть приведение к типу, и как бы можно объявить новый тип с нужной шириной и к нему приводить. Но это лишняя писанина, и результирующий верилог не поддерживается парсером Yosys'а. Такая вот шляпа.
➡️В конструкции вида a = {b, '1} единица не расширяется до размера a, и код в неизменном виде попадает в верилог. Т.е. это ошибка и в верилоге и в вериле, что несколько расстраивает. Выражение как бы очевидное, но авторы решили сохранить совместимость с верилогом. А ещё линтер на это не ругается (а Верилятор ругается).
➡️Нельзя объявить несколько переменных одного типа с одной декларации. Для каждой переменной надо писать var бла_бла: тип;.
➡️Невозможно задать начальное значение регистру или памяти. ROM в принципе можно описать в виде const (которое транслируется в localparam), но RAM только через readmem. Авторы говорят, что для асиков это не нужно, а проблемы плисоводов их не волнуют. Конструкция initial поддерживает только вывод сообщений.

По инфраструктуре. В отличие от верилога, у которого только стандарт, Veryl "из коробки" имеет форматтер, линтер и language server. Это очень удобно. Например, на добавление полноценной поддержки языка с в Emacs у меня ушли сутки. А это форматирование с отступами, подсветка синтаксиса, подсветка ошибок в реальном времени, автодополнение, хождение по коду и попапы.

Кроме перечисленного, в комплекте с транслятором есть система документирования с поддержкой markdown и wavedrom, система юнит-тестирования с интегрированными тестбенчами на верилоге, и система сборки, которая умеет подгружать зависимости.

Есть и недостатки:

➡️Нет настроек форматирования, есть только настройка длины таба.
➡️У линтера есть только настройки стиля, языковых настроек нет. Например, нет предупреждения о неявном приведении ширины.
➡️При касте сброса транслятор может менять имя сигнала, добавляя к нему префикс или суффикс (настраиваемо). При этом он это делает и для портов вериложных модулей. По этому, если включена эта опция, при имплементации вериложного модуля к именам портов клока и сброса надо прибавлять префикс r#. Но это скорее ошибка, которую нужно исправлять.
➡️Часто неправильно указывает положение ошибки, особенно если забыли или лишняя точка с запятой.

В общем, впечатления от языка двойственные. С одной стороны линтер, language server и дженерики. С другой - ощущение, что пишешь на верилоге с новым синтаксисом и старыми проблемами. А зачем мне старые проблемы? Мне нужны новые 😄

PS: Дописывая пост заглянул в репозиторий. Две недели назад вышла новая версия, в которой добавили приведение ширины. Вот так может и допишут до продакшена.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥5
В очередной раз пригодился мой китайский фрезер CNC-3018. Выпилил втулки, чтобы уменьшить диаметр отверстий в печатной плате с 1мм до 0.8мм. Заготовка - текстолит толщиной 2мм. На фото видно, что втулки выпилены не до конца, а до фольги на обратной стороне - это чтобы они не вывалились во время фрезерования и не сломались об фрезу. Потом я их вырезал канцелярским ножом.

Диаметр втулок я сделал чуть больше 1мм, чтобы входили с натягом. Несмотря на толщину стенки, получилось достаточно прочно, при запрессовке пока ни одна не сломалась.

Заусенцы на фото - это остатки стружек. На самом деле поверхность чистая и гладкая ☺️

Фреза - кукуруза 0.8мм, горизонтальная подача - 2мм/с, вертикальная 0.5мм/с.
🔥21