将周期精确的 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_idleis_active 端口来解决这个问题,以指示模型是否需要时钟信号。

所以它是这样工作的:

  1. 复位模型空闲后,时钟发生器关闭。
  2. 当事务来自 TLM 套接字时钟生成器时打开
  3. TLM 交易转换为周期精确交易
  4. 响应事务周期精确模型断言 "is_active" 并开始数据处理
  5. 当周期精确模型处理完数据后,它会置低 "is_active" 信号,作为响应时钟发生器会关闭。