Создание C ++ testbench для управления Verilog DUT

Я пытаюсь понять, как создать C ++ testbench для стимулирования DUT в Verilog. Допустим, у меня есть простой сценарий:

// Testbench Top.
module tb_top();

import "DPI-C" function void wait_for_input_ready();
initial
wait_for_input_ready();

import "DPI-C" function void notify_input_ready();
always @(posedge clk or negedge rst)
begin
// based on some condition here I want to send input-ready notify.
notify_input_ready();
end

endmodule

А вот мой код C ++:

test_case.h

    extern "C" void wait_for_input_ready();
extern "C" void notify_input_ready();

test_case.cpp

    #include "test_case.h"
std::conditional_variable cond_var;
std::mutex input_mutex;
bool input_ready = false;

void wait_for_input_ready()
{
std::unique_lock<std::mutex> lock(input_mutex);

while(input_ready != true)
cond_var.wait(lock, [&]{return input_ready == true;});  // This is where the problem happens.
}

void notify_input_ready()
{
std::unique_lock<std::mutex> lock(input_mutex);
is_ready = true;
cond_var.notify_one(); // Unblock to wait statement.
}

В этом примере оператор wait для условной переменной блокируется навсегда и не позволяет симулятору выполнять какие-либо другие части кода Verilog. Так каков правильный подход здесь? Должен ли я создать поток в C ++ внутри функции wait_for_input_ready и полностью отсоединить его?

0

Решение

Вы не можете смешивать понятия потоков SystemVerilog с потоками C ++. С точки зрения DPI все выполняется в одном потоке. Если вы хотите, чтобы код C ++ отображался так, как если бы он был потоком SystemVerilog, вам необходимо импортировать код C ++ в качестве задачи и вызывать экспортированную задачу SystemVerilog.

Несколько ссылок, которые вы можете прочитать:
https://s3.amazonaws.com/verificationacademy-news/DVCon2013/Papers/MGC_DVCon_13_Easy_Steps_Towards_Virtual_Prototyping_Using_the_SystemVerilog_DPI.pdf

https://verificationacademy.com/forums/ovm/how-maintain-database-c-function-if-firmware-hardware-co-simulation-used#reply-37204

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]