我有一个周期精确的SystemC模块,由合成器自动生成。我需要将此模块连接到包含不定时模块的库。我将从库中提供一个类,并提供一个自动生成的类的示例来说明这种困境。
debugdev.h(来自库)
class debugdev
: public sc_core::sc_module
{
public:
tlm_utils::simple_target_socket<debugdev> socket;
sc_out<bool> irq;
debugdev(sc_core::sc_module_name name);
virtual void b_transport(tlm::tlm_generic_payload& trans,
sc_time& delay);
virtual unsigned int transport_dbg(tlm::tlm_generic_payload& trans);
};
debugdev是一个非常基本的类,它具有用于发送和接收数据的tlm套接字连接器以及相关的tlm方法,如b_transport。 https://www.doulos.com/knowhow/systemc/tlm2/tutorial__1/
add.h(由合成器自动生成)
#ifndef _add_HH_
#define _add_HH_
#include "systemc.h"
#include "AESL_pkg.h"
namespace ap_rtl {
struct add : public sc_module {
// Port declarations 8
sc_in< sc_logic > ap_start;
sc_out< sc_logic > ap_done;
sc_out< sc_logic > ap_idle;
sc_out< sc_logic > ap_ready;
sc_in< sc_lv<32> > a;
sc_in< sc_lv<32> > b;
sc_out< sc_lv<32> > c;
sc_out< sc_logic > c_ap_vld;
// Port declarations for the virtual clock.
sc_in_clk ap_virtual_clock;
// Module declarations
add(sc_module_name name);
SC_HAS_PROCESS(add);
~add();
sc_trace_file* mVcdFile;
ofstream mHdltvinHandle;
ofstream mHdltvoutHandle;
static const sc_logic ap_const_logic_1;
static const sc_logic ap_const_logic_0;
// Thread declarations
void thread_ap_done();
void thread_ap_idle();
void thread_ap_ready();
void thread_c();
void thread_c_ap_vld();
void thread_hdltv_gen();
};
}
using namespace ap_rtl;
#endif
add.h具有敏锐的时间意识。信号ap_start,ap_done,ap_idle,ap_ready,c_ap_vld和ap_virtual_clock确保模块具有非常特定的时序约束,以便它在定时模拟中运行。
我解决这个问题的最佳尝试是在add模块周围编写一个套接字触发的包装器,它将所有必要的定时信号设置为适当的值,以模拟一个不定时的模型。还有其他方法可以解决这个问题吗?这是首选方式吗?
答案 0 :(得分:0)
唯一的方法是创建一个将TLM事务转换为周期精确协议的包装器。
这里的棘手部分是时钟生成。如果你只是在这个包装器中实例化sc_clock
来驱动周期精确模型的时钟引脚,它将会破坏整个模拟器的性能。因为即使周期精确模型什么都不做(空闲),也会模拟这个时钟。
我通常通过创建is_idle
或is_active
端口来解决此问题,该端口指示模型是否需要时钟信号。
所以它的工作原理如下: