我试图了解如何创建一个 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++ 创建一个线程并完全分离它吗?