连接循环准确的Systemc编码样式,具有未达到的编码样式
Connect Cycle-Accurate SystemC Coding Style with Untimed Coding Style
我具有由合成器自动生成的循环精确的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套接字连接器以及B_Transport等关联的TLM方法。https://www.doulos.com/knowhow/syhow/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确保在模块上确保非常具体的时序约束,以便它在定时模拟中表现出来。
我解决此问题的最佳尝试是在添加模块上编写一个插座触发的包装器,该模块将所有必要的时序信号设置为适当的值,以模拟不合时宜的模型。还有其他方法可以解决这个问题吗?这是首选的方式吗?
唯一的方法是创建一个将TLM交易转换为周期精确协议的包装器。
棘手的部分是时钟生成。如果您只是在此包装器内实例化sc_clock
即可驱动周期精确模型的时钟销,它将杀死整个模拟器的性能。因为即使循环准确模型什么都没做(闲置),也会模拟此时钟。
我通常通过创建is_idle
或is_active
端口来解决此问题,该端口指示模型是否需要时钟信号。
这样就这样起作用:
- 重置模型闲置后,时钟生成器关闭。
- 当交易来自TLM插座时钟发电机时
- TLM Tranaction转换为周期精确的交易
- 响应事务周期准确的模型,主张" is_Active"并启动数据处理
- 使用处理数据完成周期准确的模型时,它会删除" IS_ACTIVE"信号,在响应时钟生成器中关闭。