Я пытаюсь понять, как создать 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 и полностью отсоединить его?
Вы не можете смешивать понятия потоков 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
Других решений пока нет …