Столкнулся с очередным багом Верилятора: функция
Запостил issue.
PS: Ни слова про опенсорс. Уверен, что ошибку быстро исправят ;)
Дополнение. Такое поведение наблюдается только при seed == 0. Посмотрел исходники, там есть тест на равенство
$random (и $urandom тоже) с одинаковым начальным сидом генерит разные последовательности. Этого конечно не должно быть, и другие симы это подтверждают - проверил на Икарусе и Квесте. Однако, семейство функций $dist_* работает правильно. Так что если вам понадобится в одной программе генерить одинаковые случайные последовательности, пользуйтесь $dist_uniform вместо $random/$urandom.Запостил issue.
PS: Ни слова про опенсорс. Уверен, что ошибку быстро исправят ;)
Дополнение. Такое поведение наблюдается только при seed == 0. Посмотрел исходники, там есть тест на равенство
$random с одинаковым seed, но seed устанавливается в 10.GitHub
$random sequences with the same seed do not equal · Issue #5074 · verilator/verilator
Generating random numbers using $random and $urandom with the same seed produces different sequences. At the same time, $dist_* functions with the same seed produces identical numbers. Test code: `...
👍2
Мне сказали, чтобы я шел в жопу со своими issue 🙂
> Verilator follows C's seeding conventions where seed 0 means "pick a new seed". For compatibility reasons we are unlikely to change this. Don't use zero.
> Verilator follows C's seeding conventions where seed 0 means "pick a new seed". For compatibility reasons we are unlikely to change this. Don't use zero.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😱1🌚1
Вышел релиз 0.0.12 тула для конвертации системверилога в верилог - sv2v. В новой версии исправили множество ошибок и добавили некоторые полезные улучшения. Например,
Напомню, что проект sv2v изначально разрабатывался с целью обеспечить поддержку SV в синтезаторе Yosys. В связи с этим, преобразование несинтезируемого SV в нём на зачаточном уровне.
always_comb и always_latch, которые преобразуются в обычный always, теперь выполняются в нулевом времени, как этого требует стандарт. Список наиболее значимых изменений найдёте по ссылке и в списке закрытых issue.Напомню, что проект sv2v изначально разрабатывался с целью обеспечить поддержку SV в синтезаторе Yosys. В связи с этим, преобразование несинтезируемого SV в нём на зачаточном уровне.
GitHub
Release v0.0.12 · zachjs/sv2v
Breaking Changes
Removed deprecated CLI flags -d/-e/-i, which have been aliased to -D/-E/-I with a warning since late 2019
New Features
unique, unique0, and priority case statements now produce ...
Removed deprecated CLI flags -d/-e/-i, which have been aliased to -D/-E/-I with a warning since late 2019
New Features
unique, unique0, and priority case statements now produce ...
👍7
Doka запостил ссылку на список проектов на гитхабе, отсортированных по популярности. Список давно не обновлялся и не включал в себя SystemVerilog, по этому я сделал форк и обновил данные. Оставил только Verilog и VHDL, и добавил SystemVerilog и Bluespec. К сожалению, в списке поиска гитхаба больше нет HDL языков 🤷♀️
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - punzik/arl-hdl: lists of most popular repositories for most favoured programming languages (according to StackOverflow)
lists of most popular repositories for most favoured programming languages (according to StackOverflow) - punzik/arl-hdl
🔥5🎉1
Вышел второй номер журнала FPGA-Systems Magazine :: FSM :: № BETA (state_1)! Много интересного. От меня тоже есть небольшая заметка про быстрое вычисление медианы. Качайте, читайте. Вопросы и комменты можно оставлять в специальной группе.
Кент Казино
Кент Казино зеркало | Официальный сайт Kent Casino
Кент Казино — рабочее зеркало для быстрого входа без ограничений. 🔓 Активируйте 110% бонус на первый депозит 🎁 и фриспины после регистрации.
❤3
Внезапно узнал, что вот уже четыре месяца товарищ Martin Povišer пилит фронтенд для yosys на базе парсера slang. Если затея выгорит, то это будет самая полная поддержка SV в yosys. И не только в yosys, наверное.
Товарищ добавил тесты своего фронтенда в CHIPS Alliance sv-tests dashboard, и хотя ещё много нужно сделать, уже есть на что посмотреть. Будем следить.
Товарищ добавил тесты своего фронтенда в CHIPS Alliance sv-tests dashboard, и хотя ещё много нужно сделать, уже есть на что посмотреть. Будем следить.
GitHub
GitHub - povik/yosys-slang: SystemVerilog frontend for Yosys
SystemVerilog frontend for Yosys. Contribute to povik/yosys-slang development by creating an account on GitHub.
🔥4
Коллеги, вы не сталкивались с торможением GTKWave? Версия, которая на GTK3, отжирает целое ядро процессора просто показывая временную диаграмму. Если поставить курсор, то видно как он нервно моргает, как будто вся диаграмма постоянно перерисовывается. На версии GTK2 такого поведения не наблюдал, там всё летает.
Форенчич два года назад завёл issue на похожую тему, но обсуждение пошло куда-то не туда. А проблема осталась. И судя по тому, что больше таких репортов нет, проблема не сильно распространенная. Возможно даже дело не в программе, а в видеодровах, как однажды было с KiCAD-ом.
В общем, подожду выхода GTKWave4 (а там обещают полностью переработанный рендер) на версии с GTK2.
Форенчич два года назад завёл issue на похожую тему, но обсуждение пошло куда-то не туда. А проблема осталась. И судя по тому, что больше таких репортов нет, проблема не сильно распространенная. Возможно даже дело не в программе, а в видеодровах, как однажды было с KiCAD-ом.
В общем, подожду выхода GTKWave4 (а там обещают полностью переработанный рендер) на версии с GTK2.
GitHub
Performance problems in 3.3.113/gtk3 · Issue #173 · gtkwave/gtkwave
I recently upgraded from 3.3.111 to 3.3.113 on Arch Linux and I am running in to some seriously bad performance problems in gtkwave. It almost seems to be effectively hanging when fully zoomed out ...
🤔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: ноль - нижнее подчеркивание, единица - нижнее подчеркивание строкой выше. Ну и несомненный минус - передать через телетайп такое будет затруднительно🤪
Вот эти символы:
Возможно в вашем любимом шрифте они будут смотреться криво. Увы. В Йосевке смотрится прекрасно😍
Нашел в юникоде несколько подходящих символов для подобного документирования вейвформ. Там есть ещё варианты, но эти два мне как-то понравились больше всех. Первый более красивый и наглядный, но надо "рисовать" через строку, т.к. иначе соседние вейвы сливаются. Второй - можно в каждой строке. Несомненный плюс обоих - для одного сигнала нужна одна строка, а не так, как в ASCII: ноль - нижнее подчеркивание, единица - нижнее подчеркивание строкой выше. Ну и несомненный минус - передать через телетайп такое будет затруднительно
Вот эти символы:
🭼 🭽 🭾 🭿 🮀 ▔ ▁ ╳
⎽ ▄
Возможно в вашем любимом шрифте они будут смотреться криво. Увы. В Йосевке смотрится прекрасно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3✍1🔥1🎉1
Про асинхронный сброс и Verilator.
Вот типичный код асинхронного сброса:
Обычно, код работает так же, как в железе. Однако, если в начале симуляции нет клока, то сброс может не сработать. Так выйдет, если
Очевидное решение - в объявлении
Или так:
Однако, и здесь есть нюанс: Verilator не захотел регистрировать это событие, и не выполнил код процесса. Раньше такого в Вериляторе быть не могло, потому что до недавнего времени он был чисто clock-accurate симулятором. А раз клок всегда был, то события
В связи со всем вышесказанным думаю самым правильным решением было бы присвоение
Запилил issue
Вот типичный код асинхронного сброса:
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
GitHub
Fix reaction to the edge event at zero time · Issue #5499 · verilator/verilator
The always @(posedge a) block does not triggered on change of a in zero time. The SV standard says that the "initial value of a static variable as part of the variable declaration (including s...
🔥8👍1🙏1
В комментах товарищ @Xtyll спросил, не упала ли скорость симуляции в Вериляторе после добавления событийного шедулинга. Сообщаю: не упала.
Добавил тест Верилятора 4-й версии в свой бенчмарк - разница в результатах с версией 5 на уровне погрешности. Для надежности сделал ещё тест на реальном проекте. Там тоже разницы нет. Вот как-то так.
Добавил тест Верилятора 4-й версии в свой бенчмарк - разница в результатах с версией 5 на уровне погрешности. Для надежности сделал ещё тест на реальном проекте. Там тоже разницы нет. Вот как-то так.
Telegram
Arnold Enginegger
Запилил небольшой бенчмарк для HDL симуляторов. Пока минималистично, и скрипты для запуска только на Icarus, Verilator и ModelSim/QuestaSim. Надеюсь люди добавят запуск других симуляторов.
🔥5
В "соседнем чатике" стырил ссылку на интересный канал. Коллега исследует возможности опенсорса для электромагнитной симуляции печатных плат. SI, PI, вот это вот всё на открытых тулах. Интересно, и картинки красивые, стоит посмотреть 😍
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2
radicle.dev
Radicle: the sovereign forge
Sovereign code infrastructure.
Завёл себе ноду Radicle, и поставил на сервер веб-интерфейс. Интересная штука, попробую поюзать.
Если кто не знает, Radicle - это распределенный хостинг гитовых реп. Типа GitHub, только без центрального хранилища. Работает на таком же принципе, как BitTorrent - человек клонирует репу и становится её сидером. Что интересно, "социальные артефакты" - issue, пулл-реквесты (и потенциально другое, т.к. система расширяемая) - хранятся в той же репе, что и код, но не пересекаются с ним. 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
Telegram
Arnold Enginegger
Запомните это хорошо! 😖
👍10
Коллега в комментарии к предыдущему посту навел меня на ещё один вариант квази-initial с поддержкой неблокирующих присваиваний:
Во-первых тут не нужна дополнительная переменная, во-вторых последовательность запусков теперь такая же, как у обычного initial. Блок always выполнится один раз и остановится на строчке
P.S.: В предыдущем посте я в спешке обозвал неблокирующие блокирующими. Надеюсь, никто не заметил😭
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
veryl-lang.org
Veryl: A Modern Hardware Description Language
Veryl is a hardware description language which is designed as a SystemVerilog alternative.
🤨9👍2🤯2😁1
Коллега любезно поделился ссылкой на занятную статью про то, как всё плохо с безопасностью в открытых EDA. Ну как занятную. Такое мнение всё чаще появляется в публичном пространстве. Однако, я думаю, что дело не только и не столько в открывшихся фактах саботажа в СПО, а в осознании неспособности коммерческих разработчиков сохранить лидерство в обозримом будущем. Они просто бесятся, и со мной согласен Олоф (ну или я с ним 😊).
Semiconductor Engineering
Security Concerns Weigh Down Open-Source EDA
Issues vary by application and how and where it's used, but many tools already contain some open-source code.
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Запилил энкодер PAL/NTSC на плисе для ретрокопьютинга. На выходе 8-битный r-2r ЦАП и эмиттерный повторитель. Хорошо видна интермодуляция цветности и яркости, у буржуев называемая Dot Crawl.
Давно хочу переделать на S-Video (это когда яркость и цветность по отдельным проводам), да всё времени нет. Но обязательно сделаю.
Давно хочу переделать на S-Video (это когда яркость и цветность по отдельным проводам), да всё времени нет. Но обязательно сделаю.
🔥19👍4🏆2
Хорошее замечание и ещё один аргумент в срачах спорах про сбросы. Получается (без учёта других аргументов), что тотальный сброс можно делать любым - синхронным или асинхронным, а частичный (только control path, например) лучше синхронным, чтобы в случае чего синтезатор смог сымитировать его на логике.
Telegram
Сергей Кривченко in icDesignCommunity
Нет, я именно про корректно написанный код) Приведу тогда пример:
Сигналы синхронного "сброса" и "загрузки" общие для целого LAB-а (у Cyclone IV в 1 LAB-е содержится 16 LE). Допустим, есть сигнал 'valid' и шина данных 8 битная. Если мы заведем синхронный…
Сигналы синхронного "сброса" и "загрузки" общие для целого LAB-а (у Cyclone IV в 1 LAB-е содержится 16 LE). Допустим, есть сигнал 'valid' и шина данных 8 битная. Если мы заведем синхронный…
👍3