Telegram Group & Telegram Channel
В 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 😊).

В качестве примера написал небольшой тестовый код.



group-telegram.com/enginegger/61
Create:
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

View MORE
Open in Telegram


Telegram | DID YOU KNOW?

Date: |

Following this, Sebi, in an order passed in January 2022, established that the administrators of a Telegram channel having a large subscriber base enticed the subscribers to act upon recommendations that were circulated by those administrators on the channel, leading to significant price and volume impact in various scrips. The Russian invasion of Ukraine has been a driving force in markets for the past few weeks. Telegram, which does little policing of its content, has also became a hub for Russian propaganda and misinformation. Many pro-Kremlin channels have become popular, alongside accounts of journalists and other independent observers. Friday’s performance was part of a larger shift. For the week, the Dow, S&P 500 and Nasdaq fell 2%, 2.9%, and 3.5%, respectively. "The result is on this photo: fiery 'greetings' to the invaders," the Security Service of Ukraine wrote alongside a photo showing several military vehicles among plumes of black smoke.
from es


Telegram Arnold Enginegger
FROM American