У меня есть точный цикл 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, которая устанавливает все необходимые сигналы синхронизации в соответствующие значения для эмуляции несвязанной модели. Есть ли другие способы решить эту проблему? Это предпочтительный способ?
Единственный способ — создать оболочку, которая будет переводить транзакции TLM в протокол с точным циклом.
Сложная часть здесь — генерация часов. Если вы просто создаете экземпляр sc_clock
Внутри этой обертки для управления тактовыми импульсами модели с точным циклом это снизит производительность всего симулятора. Потому что эти часы будут смоделированы, даже когда модель с точным циклом ничего не делает (бездействует).
Я обычно решаю это, создавая is_idle
или же is_active
порт, который указывает, нужен ли модели тактовый сигнал.
Так что это работает так:
Других решений пока нет …