Можно ли вызвать функцию экспорта в обратном вызове VPI?
У меня есть следующий сценарий: у меня есть обратный вызов vpi, который запускается при срабатывании подтверждения. В этом обратном вызове я хочу вызвать функцию verilog системы экспорта, которую я пытался установить setSvScope перед экспортом, но симулятор выдает мне некоторые ошибки.
2 ответа
Вызов подпрограммы, экспортированной в DPI, из подпрограммы, которая не была импортирована в DPI, не определяется LRM 1800-2012 (см. Раздел 35.5.3 Задачи и функции контекста)
Экспортируемая подпрограмма DPI при вызове нуждается в двух ключевых фрагментах информации, чтобы вести себя как любая другая подпрограмма, которая была бы вызвана SystemVerilog вместо C. Она нуждается в контексте области и контексте процесса.
Для области возможно иметь несколько экспортов DPI с тем же именем. Фактически, в модуле может быть пара импорта / экспорта DPI, и этот модуль создается несколько раз. Даже при том, что импорт вызывает тот же самый код C, его контекст устанавливается из области вызывающего, и эта область совпадает с экспортированной областью. DPI обеспечивает svSetScope
подпрограмма, чтобы сделать это явно, если неявная импортированная подпрограмма DPI не делает этого.
Для процесса есть много вещей, которые вы можете сделать, как disable
или приостановить его. DPI не предоставляет никакого механизма, чтобы установить это явно.
Некоторые инструменты (например, Questa) предоставляют механизм для этого для ограниченного набора вариантов использования. Например, вы можете вызвать только экспортированный DPI function
из не-DPI импортированного кода C/C++. Задача не может быть вызвана, потому что она может блокироваться, что мешает любому контексту процесса.
Обычно, когда vpi вызывает функцию обратного вызова, в настоящее время содержимое DPI недоступно. Итак, вам нужно посмотреть его перед вызовом экспортированного dpi:
svScope scope = svGetScopeFromName("path.to.your.export.scope");
svSetScope(scope);
где область действия - это та, которая экспортирует функцию. Для экспорта из глобальной области $unit
может быть использовано для имени области.