у меня есть fork-join_none
блокировать в forever
цикл в SV, который имеет два потока. Один поток — это вызов задачи в самом SV. Другой поток — это вызов функции, импортированной из CPP. Можно ли запустить эти два потока параллельно?
Я пытался это сделать, но происходит, когда функция CPP называется control, и управление не возвращается обратно в сторону SV, в результате чего другой поток в SV не работает.
Как запустить эти два параллельно ???
краткий ответ: нет.
Verilog поддерживает только однопоточную имитационную модель. Потоки Verilog никогда не работают параллельно. Таким образом, вы не можете сделать это.
Ничто не может помешать вам использовать параллельные потоки, как только вы находитесь внутри вызова c / c ++ (dpi), однако вам следует не попытка вызова любых экспортированных функций verilog из параллельных потоков без надлежащей синхронизации, в частности из отсоединенных потоков. Механизм моделирования, скорее всего, не безопасен для потоков.
function
не потребляет время симуляции. В SystemVerilog, чтобы потоки работали параллельно, оба должны в какой-то момент блокироваться, чтобы позволить другому потоку работать.
При использовании DPI код C / C ++ не имеет понятия, что он занимает много времени. Что вам нужно, это импортировать ваш код cpp как задачу, а затем в какой-то момент ему нужно вызвать экспортированную задачу SystemVerilog для блокировки.
Таким образом, можно использовать DPI для достижения параллелизма в C, вызывая экспортированные задачи в SystemVerilog. Однако понятие времени в мирах HDL и C сильно отличается. Смотрите мою статью DVCon Простые шаги к виртуальному прототипированию с использованием SystemVerilog DPI в котором обсуждаются некоторые вопросы отслеживания времени между двумя доменами.