Создание 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 и полностью отсоединить его?

1 ответ

Вы не можете смешивать понятия потоков 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

Другие вопросы по тегам