将周期精确的 SystemC 编码风格与不定时的编码风格联系起来
Connect Cycle-Accurate SystemC Coding Style with Untimed Coding Style
我有由合成器自动生成的周期精确的 SystemC 模块。我需要将此模块连接到包含未计时模块的库。我将提供一个来自图书馆的 class 和一个自动生成的 class 的例子来说明这个困境。
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 是一个非常基本的 class,它具有用于发送和接收数据的 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 模块编写套接字触发的包装器,将所有必要的计时信号设置为适当的值以模拟未计时的模型。还有其他方法可以解决这个问题吗?这是首选方式吗?
唯一的方法是创建一个包装器,将 TLM 事务转换为周期精确的协议。
这里棘手的部分是时钟生成。如果您只是在这个包装器中实例化 sc_clock
来驱动周期精确模型的时钟引脚,它将破坏整个模拟器的性能。因为即使周期精确模型什么都不做(空闲)也会模拟这个时钟。
我通常通过创建 is_idle
或 is_active
端口来解决这个问题,以指示模型是否需要时钟信号。
所以它是这样工作的:
- 复位模型空闲后,时钟发生器关闭。
- 当事务来自 TLM 套接字时钟生成器时打开
- TLM 交易转换为周期精确交易
- 响应事务周期精确模型断言 "is_active" 并开始数据处理
- 当周期精确模型处理完数据后,它会置低 "is_active" 信号,作为响应时钟发生器会关闭。
我有由合成器自动生成的周期精确的 SystemC 模块。我需要将此模块连接到包含未计时模块的库。我将提供一个来自图书馆的 class 和一个自动生成的 class 的例子来说明这个困境。
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 是一个非常基本的 class,它具有用于发送和接收数据的 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 模块编写套接字触发的包装器,将所有必要的计时信号设置为适当的值以模拟未计时的模型。还有其他方法可以解决这个问题吗?这是首选方式吗?
唯一的方法是创建一个包装器,将 TLM 事务转换为周期精确的协议。
这里棘手的部分是时钟生成。如果您只是在这个包装器中实例化 sc_clock
来驱动周期精确模型的时钟引脚,它将破坏整个模拟器的性能。因为即使周期精确模型什么都不做(空闲)也会模拟这个时钟。
我通常通过创建 is_idle
或 is_active
端口来解决这个问题,以指示模型是否需要时钟信号。
所以它是这样工作的:
- 复位模型空闲后,时钟发生器关闭。
- 当事务来自 TLM 套接字时钟生成器时打开
- TLM 交易转换为周期精确交易
- 响应事务周期精确模型断言 "is_active" 并开始数据处理
- 当周期精确模型处理完数据后,它会置低 "is_active" 信号,作为响应时钟发生器会关闭。