0

我试图了解如何创建一个 C++ 测试平台来驱动 Verilog 中的 DUT 的激励。假设我有一个简单的场景:

// 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();

测试用例.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.
    }

在此示例中,条件变量上的等待语句将永远阻塞,并且不会让模拟器执行 Verilog 代码的任何其他部分。那么这里的正确方法是什么?我应该在 wait_for_input_ready 函数中用 C++ 创建一个线程并完全分离它吗?

4

1 回答 1

3

您不能将 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

于 2015-10-19T07:11:03.257 回答