Arnold Enginegger
699 subscribers
38 photos
4 videos
12 files
81 links
Тоже хочу в блогеры
Download Telegram
Forwarded from позитивслэк (Bogdan)
Цифровой синтез: RISC-V

Неожиданно затесался в приложение книги "Цифровой синтез: RISC-V".
Штош, теперь, хочешь не хочешь, надо брать. Спасибо Вождю!

P.s. кстати топовые каналы, рекомендую подписаться =)

#book
@postivelsack
🔥7👍21🤮1💩1🖕1
Возможно это глупый вопрос, но я рискну. Представьте, что у вас есть слейв, принимающий 32 бита по AXIS-подобной шине (хендшейк valid/ready) и выполняющий обработку данных побайтно. Возможны два варианта действий:

1. В режиме ожидания вы держите ready в единице. Как только приходит valid, защелкиваете все 32 бита в регистр, снимаете ready и начитаете побайтную обработку. По окончании поднимаете ready.

2. В режиме ожидания держите ready в нуле. По приходу valid начитаете побайтную обработку, снимая байты непоследственно с шины. По окончании дергаете ready.

В общем, оба варианта приемлемы, т.к. в спеке на AXI не требуется, чтобы ready был активен до прихода valid, а однажды выставленный valid не может быть снят до прихода ready. С другой стороны, второй вариант может порушить времянки, если данные от мастера формируются через комбинационные цепи. И возможны проблемы с арбитражем, если арбитр полагается на ready.

Что вы думаете по этому поводу? В комментах создам опрос, заходите.
🤮1💩1🖕1
Столкнулся с очередным багом Верилятора: функция $random$urandom тоже) с одинаковым начальным сидом генерит разные последовательности. Этого конечно не должно быть, и другие симы это подтверждают - проверил на Икарусе и Квесте. Однако, семейство функций $dist_* работает правильно. Так что если вам понадобится в одной программе генерить одинаковые случайные последовательности, пользуйтесь $dist_uniform вместо $random/$urandom.

Запостил issue.

PS: Ни слова про опенсорс. Уверен, что ошибку быстро исправят ;)

Дополнение. Такое поведение наблюдается только при seed == 0. Посмотрел исходники, там есть тест на равенство $random с одинаковым seed, но seed устанавливается в 10.
👍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.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😱1🌚1
🔥112👍2🤔1
Вышел релиз 0.0.12 тула для конвертации системверилога в верилог - sv2v. В новой версии исправили множество ошибок и добавили некоторые полезные улучшения. Например, always_comb и always_latch, которые преобразуются в обычный always, теперь выполняются в нулевом времени, как этого требует стандарт. Список наиболее значимых изменений найдёте по ссылке и в списке закрытых issue.
Напомню, что проект sv2v изначально разрабатывался с целью обеспечить поддержку SV в синтезаторе Yosys. В связи с этим, преобразование несинтезируемого SV в нём на зачаточном уровне.
👍7
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