System Verilog DPI - Запуск параллельных потоков один в cpp, а другой в SV - PullRequest
0 голосов
/ 27 августа 2018

У меня есть блок fork-join_none в цикле forever в SV, который имеет два потока.Один поток - это вызов задачи в самом SV.Другой поток - это вызов функции, импортированной из CPP.Можно ли запустить эти два потока параллельно?

Я пробовал это, но происходит, когда функция CPP называется control, а управление не возвращается обратно в сторону SV, из-за чего другой поток в SV не работает.

Как запустить эти два параллельно ???

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

A function не потребляет время симуляции.В SystemVerilog, чтобы потоки работали параллельно, оба должны в какой-то момент блокироваться, чтобы позволить другому потоку работать.

При использовании DPI код C / C ++ не имеет понятия, что он занимает много времени.Вам нужно импортировать ваш код cpp как задачу, а затем в какой-то момент ему нужно вызвать экспортированную задачу SystemVerilog для блокировки.Таким образом, можно использовать DPI для достижения параллелизма в C, вызывая экспортированные задачи в SystemVerilog.Однако понятие времени в мирах HDL и C сильно отличается.См. Мою статью DVCon «Простые шаги по созданию виртуального прототипирования с использованием SystemVerilog DPI », в которой рассматриваются некоторые вопросы отслеживания времени между двумя доменами.

0 голосов
/ 27 августа 2018

краткий ответ: нет.Verilog поддерживает только однопоточную имитационную модель.Потоки Verilog никогда не работают параллельно.Итак, вы не можете сделать это.

Ничто не может помешать вам использовать параллельные потоки, как только вы находитесь внутри вызова ac ​​/ c ++ (dpi), однако вы должны не пытаться вызывать любые экспортированные функции verilog из параллельных потоков безправильная синхронизация, в частности от оторванных потоков.Механизм моделирования, скорее всего, не безопасен для потоков.

...