Telegram Group Search
Добавил в бенчмарк скрипты для запуска разных симуляторов и результаты тестов. К сожалению, у меня нет возможности запустить VCS и Xcelium локально, по этому пришлось обратиться к людям. К счастью, нашелся человек, прогнавший тесты на этих симуляторах, но по причине NDA попросил не раскрывать версии и железо, на которых они запускались. Как результат - табличка с относительным временем выполнения бенчмарка разными симуляторами.
Тест, конечно, немного однобокий, т.к. не использует высокоуровневые конструкции SV и несинтезируемое подмножество, но какое-никакое представление даёт.
Очередная gotcha в SystemVerilog. По стандарту, как известно, always_ff не разрешает multidrive. Я это давно знал, но не знал, что это касается и initial. Вот на такой код большинство симуляторов (Modelsim, XSIM, VCS, Xcelium) ругается:

  logic r;
initial r = 1'b1;
always_ff @(posedge clock) r <= ~r;


Но не все, Icarus и Verilator не ругаются.

Однако, следующий код для Modelsim и XSIM уже корректный (для VCS и Xcelium по-прежнему нет):

  logic [7:0] ram[256];
initial $readmem("init.mem", ram);
always_ff @(posedge clock) ram <= ...;


При этом, все синтезаторы, которые у меня есть (Yosys, Vivado и Quartus Std) оба этих примера кушают не давясь.
Залипал на ютубе и наткнулся на интересный канал про электронику и радиосвязь. Рекомендую.
В продолжение предыдущего поста. Кусочек кода из микрософтовского проекта cheriot-ibex с комментарием. Наверное тоже внезапно столкнулись с беспощадностью стандарта и необязательностью его исполнения 🙂
Снова поагитирую за sv2v. Он умеет преобразовывать в синтезируемый верилог параметризуемые функции, таски и структуры в виде статических шаблонных классов. Вещь весьма полезная в некоторых ситуациях и ещё один плюсик в пользу использования SV в т.ч. с Yosys :)
Добавил в бенчмарк ещё один симулятор под названием CVC, точнее его открытую версию OSS CVC. Симулятор не поддерживает SV (только некоторые элементы, например типы logic и bit, и интерфейс DPI), но заявлена полная поддержка IEEE 1364 2005. Из-за этого пришлось использовать тул sv2v для конвертации исходников.
Симулятор компилирует верилог в исполняемый файл (через трансляцию в Си), но умеет работать и в режиме интерпретатора с соответствующей потерей в производительности. В отличие от верилятора в CVC сигналы 4-state, по этому иксы присутствуют. Умеет PLI и DPI, поддерживает specify и соответственно симуляцию с задержками, быстро симуляет примитивы, умеет собирать статистику переключений (toggle coverage). В описании написано, что "best solution for machine generated Verilog simulation", годен для "very large gate-level" симуляции. А ещё он умеет дампить память :)
В общем, в копилочку опенсорсных симов (лицензия, правда, какая-то своя).
Недавно в соседнем чатике интересовались возможностью разбора шин и протоколов внутри GTKWave с рисованием на временной диаграмме красивых цветных состояний. Так вот, это там есть. Фича называется "Transaction Filter" (там еще есть "Translation Filter", которая попроще и предназначена для простого переименования значений сигналов, например машинного кода в мнемонику).

Суть её в том, что вы пишете программу, которая в стандартный ввод получает сформированный GTKWave так называемый "упрощенный VCD" для выбранных пользователем сигналов, а в стандартный вывод выплёвывает новый сигнал/сигналы с именами состояний шины и цветовой маркировкой штанов. Т.е. ваша программа получает полный трек, по которому можно восстановить состояния шины с транзакциями. Писать можно на всём, что умеет принимать ввод и печатать вывод, в т.ч. на скриптовых языках.
Как всегда, не обошлось без подводных камней, для обхода которых даже пришлось запускать GTKWave в отладчике. Подробности описывать не буду, приведу только алгоритм на псевдо-С, который точно соответствует тому, чего ждёт GTKWave. Остальное можно прочитать в документации.

while (!eof) {
str = read_line();

if (str == "$comment data_end ...") {
println("$name ..."); flush();
...
println("$finish ..."); flush();
}
}

Скажу только, что нужно обязательно делать flush после каждой новой строки (о чём сказано в документации), и отвечать после каждого бандла VCD (о чём в документации не сказано).

Чуть позже выложу либу на Scheme для парсинга VCD и работы с распарсенными сигналами.

PS: можно было написать более подробно, но не хочется тележный пост превращать в портянку. По этому спрашивайте в комментах.
Я тут периодически ругаю VHDL (в шутку, конечно☺️), но вот интересный факт: несмотря на его многословность, библиотека примитивов для симуляции ПЛИС GoWin занимает всего на 18% больше места, чем то же самое на верилоге. А по строкам и того меньше - 13% (19070 строк на VHDL против 16767 на Verilog).
Позавчера в плисочате коллега предложил вычислять синусы с помощью широко известной в узких кругах формулы Марвина Минского, которую он (Минский), по собственному признанию, придумал случайно:

sin = sin + (cos >> shift)
cos = cos - (sin >> shift)

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

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

На графике сверху слева круг, построенный по значениям синуса и косинуса (несколько сотен периодов). Красным цветом обозначены значения из генератора, зеленым - референсные значения честных синуса и косинуса такой же разрядности. На графике сверху справа два периода синусоиды - референсная и полученная из генератора. Два графика ниже - спектры комплексных сигналов, полученных как (cos + isin). Зеленый - референсный, красный - из генератора.

В общем, вывод можно сделать следующий. Для рисования кругов метод годный, особенно если разрядность побольше - визуально разница между честным кругом и "нечестным" совсем не заметна. Применять в ЦОС - тут нужно хорошечно подумать. Наверное в чём-то не очень чувствительном к искажениям. Из графиков видно, что постоянную составляющую у меня получилось скомпенсировать, а вот фазовый сдвиг между синусом и косинусом нет (сдвиг проявляется в виде диагонально сплюснутого круга и в виде зеркальной палки на отрицательной части спектра). Даже небольшой имбаланс фаз, в одну выборку длиной, вызывает заметное отражение на спектре. Хотя, и здесь могут быть варианты, например использовать синус и косинус по отдельности.

PS: на уровни не смотрите, ибо окно, fft processing gain и пр.
Для тех, кто не в курсе про существование самого большого и толкового ресурса по ПЛИС в телеге, знайте:

👉 Чат: https://www.group-telegram.com/fpgasystems
👉 Новости: https://www.group-telegram.com/fpgasystems_events

Оттуда вы найдёте ходы в другие не менее интересные плисовые, околоплисовые и электронные каналы. Лайк и подписка!
В одной панельке отверстия диаметром 0.8 просверлены карбид-вольфрамовым сверлом для печатных плат. В другой отверстия 0.85 просверлены фрезой "кукуруза" 0.8. Разница на лицо. Сверло при заходе в текстолит немного произвольно смещается, а обратно в соосность уже не может вернуться, т.к. боком не пилит. Кукуруза при входе наверное тоже смещается, но потом возвращается на место и отверстие получается ровно там, где планировалось. Наверное для свёрел нужны обороты побольше бытовых 10тыс./мин.
Чёт я не понял, куда делось комментирование к предыдущему посту. Надеюсь, здесь оно будет.
2025/02/25 15:59:44
Back to Top
HTML Embed Code: