Соедините стиль кодирования Cycle-Accurate SystemC со стилем кодирования Untimed

У меня есть точный цикл 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, которая устанавливает все необходимые сигналы синхронизации в соответствующие значения для эмуляции несвязанной модели. Есть ли другие способы решить эту проблему? Это предпочтительный способ?

0

Решение

Единственный способ — создать оболочку, которая будет переводить транзакции TLM в протокол с точным циклом.

Сложная часть здесь — генерация часов. Если вы просто создаете экземпляр sc_clock Внутри этой обертки для управления тактовыми импульсами модели с точным циклом это снизит производительность всего симулятора. Потому что эти часы будут смоделированы, даже когда модель с точным циклом ничего не делает (бездействует).

Я обычно решаю это, создавая is_idle или же is_active порт, который указывает, нужен ли модели тактовый сигнал.

Так что это работает так:

  1. После сброса модель не работает, тактовый генератор выключен.
  2. Когда транзакция поступает из TLM, включается генератор тактовых импульсов
  3. Транзакция TLM преобразуется в транзакцию с точностью до цикла
  4. В ответ на транзакцию с точностью до цикла модель утверждает «is_active» и начинает перехват данных
  5. Когда точная циклическая модель выполняется с обработкой данных, она отменяет сигнал «is_active», в ответ генератор тактовых импульсов выключен.
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector