使用不定时编码样式连接循环精确的SystemC编码样式

时间:2017-12-19 14:41:02

标签: c++ sockets timing data-transfer systemc

我有一个周期精确的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模块周围编写一个套接字触发的包装器,它将所有必要的定时信号设置为适当的值,以模拟一个不定时的模型。还有其他方法可以解决这个问题吗?这是首选方式吗?

1 个答案:

答案 0 :(得分:0)

唯一的方法是创建一个将TLM事务转换为周期精确协议的包装器。

这里的棘手部分是时钟生成。如果你只是在这个包装器中实例化sc_clock来驱动周期精确模型的时钟引脚,它将会破坏整个模拟器的性能。因为即使周期精确模型什么都不做(空闲),也会模拟这个时钟。

我通常通过创建is_idleis_active端口来解决此问题,该端口指示模型是否需要时钟信号。

所以它的工作原理如下:

  1. 复位模型空闲后,时钟发生器关闭。
  2. 当事务来自TLM套接字时钟发生器时
  3. TLM tranaction转换为周期准确的交易
  4. 响应交易周期准确的模型断言&#34; is_active&#34;并开始数据处理
  5. 当使用处理数据完成周期精确模型时,它会取消断言&#34; is_active&#34;信号,响应时钟发生器关闭。