kirill70674 5 February 19 Posted February 19 · Report post Здравствуйте, коллеги Ситуация: В package определена экспортируемая в C++ функция. На стороне C++ данная функция вызывается в случайный момент времени тредом, который к DPI не имеет отношения. Во время вызова функции из C++ симулятор Xcelium выдаёт следующие ошибки: "DPI Scope function call allowed only from context function" и "The C identifier "foo" representing an export task/function cannot be executed from a non-context area". Перед вызовом функции foo в стороннем треде я пробовал принудительно задавать контекст: svSetScope(svGetNameFromScope("foo_pkg")), но безуспешно. Я даже пробовал заранее сохранять переменную с контекстом (GLOBAL_SCOPE=svGetScope()) и перед вызовом устанавливать контекст: svSetScope(GLOBAL_SCOPE). Тоже безрезультатно. При вызове svSetScope(GLOBAL_SCOPE) DPI не видит контекста вообще и устанавливает его в NULL. На форуме Cadence нашёл заметку в которой автор решает описываемую проблему, используя функции __sync_lock_test_and_set и __sync_lock_release. Как и над какими переменными он их использует - не понятно. -- Сталкивался ли кто с подобной проблемой и как решил? Quote Share this post Link to post Share on other sites More sharing options...
kirill70674 5 September 4 Posted September 4 · Report post Проблема решена: У Mentor есть открытая библиотека UVMC, которая связывает SystemC и SystemVerilog. С её помощью в т.ч. можно пересылать general_purpose транзакции между языками в произвольные моменты времени в обоих направлениях. Т.о., пришлось отказаться от DPI в пользу SystemC. Переход может быть трудоёмким, но возможности открываются интересные 😉 P.S. В составе библиотеки есть и примеры использования, что существенно облегчает её интеграцию. Quote Share this post Link to post Share on other sites More sharing options...