group-telegram.com/enginegger/61
Create:
Last Update:
Last Update:
В Yosys есть интересная фича, которой, похоже, нет в других синтезаторах - возможность вызова функций DPI для установки параметров и инициализации регистров.
Для этого достаточно подключить библиотеку .so командой plugin:
plugin -i my_lib.so
А затем импортировать функцию в код на SV и вызвать:
import "DPI-C" function integer my_func (integer);
localparam PARAM1 = my_func(PARAM0);
Т.к. библиотека подгружается один раз при старте yosys, можно использовать статические и глобальные переменные для сохранения контекста.
Фича может быть весьма полезной. Например, в ЦОСе часто нужно предвычислять всякие коэффициенты. Использовать для этого генерируемые внешними скриптами таблицы не очень прикольно, т.к. теряется возможность параметризации модуля. Рассчитывать силами SV тоже не сильно здорово, потому что обычно это работает медленно и синтезатор поддерживает далеко не все возможности языка (в Yosys, например, очень сложно полноценно использовать real - можно вычислять выражения с плавающей точкой, но нельзя создавать переменные).
А через DPI можно вызвать не только Си-функции, но и например Python (sic!), или мою любимую Scheme. Они достаточно просто эмбеддятся в Си.
Есть и ограничения:
1. Поддерживаются только типы integer, real, shortreal и chandle. Жаль, что нельзя передавать строки, но если очень хочется, то можно воспользоваться костылём - передавать до 8 символов через аргумент типа chandle. Это указатель, и на 64-разрядных машинах его длина 8 байт.
2. В качестве аргументов подходит не всё. Например, можно передать итератор цикла во время инициализации памяти (
mem[n] = init_func(n)
), но нельзя передать саму инициализируемую переменную (some_func(mem[n])
), ругается на нестатический аргумент.3. Нельзя вызвать функцию, которая возвращает void, yosys почему-то путает этот вызов с вызовом таска и ругается, что такого таска нет. Если всё же нужно вызвать такую функцию, то нужно вызвать её с присвоением возврата чему нибудь - переменной в initial, или неиспользуемому параметру. Запостил issue по этому поводу (Под номером 4096 😊).
В качестве примера написал небольшой тестовый код.
BY Arnold Enginegger

Share with your friend now:
group-telegram.com/enginegger/61