Arnold Enginegger
699 subscribers
38 photos
4 videos
12 files
81 links
Тоже хочу в блогеры
Download Telegram
Продолжаю тыкать палкой интерфейсы совместно с опенсорсными тулами. На этот раз речь пойдет про массивы интерфейсов, в частности их применимость в портах модулей.

Следующий код компилируется в Verilator, Tabby CAD (Yosys+Verific) и в Vivado. Yosys с открытым плагином от Antmicro ругается на массив интерфейсов в описании портов модуля (Encountered unhandled type in process_port: interface_array).

interface iface;
logic a;
modport in(input a);
endinterface

module test_mod (iface.in x[2], output logic y);
assign y = x[0].a | x[1].a;
endmodule

module top (input logic [1:0] x, output logic y);
iface i[2]();
test_mod DUT (i, y);

assign i[0].a = x[0];
assign i[1].a = x[1];
endmodule

Одиночный интерфейс, не в виде массива, открытым плагином поддерживается и успешно синтезируется.

Порадовала утилита sv2v, которая преобразовала этот код в код на чистом верилоге, который успешно синтезировался Yosys без плагинов.

module top (x, y);
input wire [1:0] x;
output wire y;
genvar _arr_DA352;
generate
for (_arr_DA352 = 0; _arr_DA352 <= 1; _arr_DA352 = _arr_DA352 + 1) begin : i
wire a;
end
endgenerate
localparam _bbase_D0DCC_x = 0;
generate
if (1) begin : DUT
localparam _mbase_x = 0;
wire y;
assign y = top.i[0].a | top.i[1].a;
end
endgenerate
assign y = DUT.y;
assign i[0].a = x[0];
assign i[1].a = x[1];
endmodule

Можно заметить, что утилита сохранила иерархию интерфейсов. Т.е., например, констрейны не сломаются, т.к. пути к сигналам сохранятся. Можно безболезненно симулировать код в Icarus, не опасаясь поломки иерархии.
IEEE_Std_1800-2005.pdf
6.6 MB
В SV можно описать модуль с неопределенным (generic) интерфейсом (IEEE 1800-2005, стр.353). Но там же написано, что такой порт можно описывать только в стиле SV, т.е. в скобочках после имени модуля, а в стиле V95 нельзя. Первый раз встречаю отсутствие обратной совместимости в SV.
Наверное все использовали или видели такую конструкцию для генерации случайного числа в нужном диапазоне (в данном случае от 0 до 123):

a = $urandom % 123

Но не все обращают внимание на то, что такое выражение выдаст случайное число не с равномерным распределением (не всегда). Конкретно в этом случае вероятность получения чисел от 0 до 36 будет выше, чем всех остальных. При этом, чем меньше отношение интервала к максимальному случайному числу, тем больше будет неравномерность.

Функция $urandom выдаёт 32-битное число, т.е. максимальное значение 2^32 и неравномерность в примере выше будет настолько маленькая, что ни в каких реальных применениях вы её не заметите. Однако, если интервал сделать, например, 0.1 от максимального случайного числа, то неравномерность будет заметна уже на тысячах выборок.

Как можно догадаться, чтобы распределение не ломалось, нужно выбирать интервал равный степени двойки, чтобы весь интервал случайных чисел делился на него нацело.
Media is too big
VIEW IN TELEGRAM
Геннадий Зеленко (и Сергей Попов, инженеры и преподаватели, которые разработали Микро-80 и Радио-86РК) говорит, что все эти ваши Мили и Муры устарели и нормальному инженеру вообще не нужны. Так-то.
Запомните это хорошо! 😖
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
Мне тут пришло письмо от Элитана, что после шестилетнего перерыва они возобновляют продажу компонентов физлицам.
На картинке предложение по GW1N-UV2QN48C6.
Всегда говорил "констрейны" и даже не замечал, что некоторые люди пишут "констрейнты", пока на конференции не услышал это слово от докладчика. Немного удивился и задумался, может я тупой и неправильно пишу? Ведь правильно действительно "констрейнты".
Но оказалось, не один я такой. Более того, нас большинство :)
👍1
Интересно, возможно ли сделать полностью оптическую нейросеть на голографических структурах с применением нелинейной интерференции? Прямо как позитронный мозг в известных романах 🧠
Осилил наконец поддержку плагина SV для Yosys в SymbiYosys. Для успешной компиляции в скрипте sby нужно написать вот такие строки:

plugin -i systemverilog
read_systemverilog -formal -defer source.sv
read_systemverilog -link

Причём, если при синтезе можно обойтись только read_systemverilog без —defer (если один исходник), то тут никак.
Теперь sby поддерживает очень большую часть стандарта SV. А ещё говорят, что в плагин скоро завезут SVA. Такие дела.
Феранек пригласил на стрим товарища, который показал пример DC симуляции печатной платы (кусочка) с помощью опенсорсных тулов.
🔥2
В комментах на хабре упомянули опенсорсную библиотеку GRLIB с большим набором IP кор. Написана VHDL, но т.к. Yosys теперь умеет VHDL через GHDL, то можно пользоваться :)
Потыкал палкой плату Maixduino с нейропроцессором Kendryte K210. Просто охренительная штука за 3к рублей. Внутри два ядра RiscV, аудиопроцессор (пока не смотрел, что он умеет), аппаратный FFT и ускоритель сверточных сетей на 1TOPs.
Программировать можно на голом Си (есть SDK) или на MicroPython, который выдаёт консоль прямо в последовательный порт.
В сети много примеров, типа распознавания объектов, детектирования лиц и пр. Один из них я потестил. Результат на картинке :)
В общем, я под впечатлением. Пятнадцать лет назад для детектирования лиц с помощью каскадов Хаара нужен был неслабый такой комп, чтобы обрабатывать видеопоток в реальном времени. Сейчас это делает хреновинка с пол пачки сигарет вообще не напрягаясь.
2🔥2
Пока одни закрываются (ДКО Электронщик), другие открываются. Пришло письмо от Резонита:

Рады сообщить, что мы запустили онлайн сервис по закупке комплектации из наших складских запасов — магазин электронных компонентов shop.rezonit.ru. Номенклатура, представленная в магазине, формируется из компонентов, которые остаются от технологических запасов на нашем контрактном производстве и остатков складских программ. Это позволяет нам предложить инженерам-разработчикам и небольшим контрактным производителям электронные компоненты по цене значительно ниже среднерыночной — со скидками до 50%.
Копался в своих исходниках и нашёл такую конструкцию в тестбенче:

seq #("-__-_--____-__") seq0 (clock, s0);


Конструкция генерит последовательность по "временной диаграмме" в виде строки. Интересная идея. Я её где-то подсмотрел, но забыл где. Можно сделать более универсальный модуль, с какой нибудь умной генерацией, с условиями, остановками и пр. Для простых линейных тестбенчей было бы наверное полезно.
Вышел Qucs-S 1.1.0, в который добавили возможность симуляции чисто цифровых схем при помощи Icarus Verilog или FreeHDL.

Кто тут хотел схемки мышевозить?
Запилил небольшой бенчмарк для HDL симуляторов. Пока минималистично, и скрипты для запуска только на Icarus, Verilator и ModelSim/QuestaSim. Надеюсь люди добавят запуск других симуляторов.
Пока писал скрипт на баше, нашел классную штуку для линтинга shell-скриптов. За одно есть её онлайн версия, чтобы по-быстрому копипастом проверить скрипт.
Тул проверяет не только синтаксис, но и семантику. Например, предлагает более правильные конструкции, или предупреждает о deprecated.
🔥4
Добавил в бенчмарк скрипты для запуска разных симуляторов и результаты тестов. К сожалению, у меня нет возможности запустить 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) оба этих примера кушают не давясь.
Залипал на ютубе и наткнулся на интересный канал про электронику и радиосвязь. Рекомендую.
🔥1
В продолжение предыдущего поста. Кусочек кода из микрософтовского проекта cheriot-ibex с комментарием. Наверное тоже внезапно столкнулись с беспощадностью стандарта и необязательностью его исполнения 🙂