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: |

"There are a lot of things that Telegram could have been doing this whole time. And they know exactly what they are and they've chosen not to do them. That's why I don't trust them," she said. "He has to start being more proactive and to find a real solution to this situation, not stay in standby without interfering. It's a very irresponsible position from the owner of Telegram," she said. To that end, when files are actively downloading, a new icon now appears in the Search bar that users can tap to view and manage downloads, pause and resume all downloads or just individual items, and select one to increase its priority or view it in a chat. These administrators had built substantial positions in these scrips prior to the circulation of recommendations and offloaded their positions subsequent to rise in price of these scrips, making significant profits at the expense of unsuspecting investors, Sebi noted.
from pl


Telegram Arnold Enginegger
FROM American