Primero recordemos qué significa el estilo loosely-timed: en este estilo usamos la función bloqueante b_transport y por tanto tenemos dos puntos de sincronización asociados a cada transacción, que corresponden al inicio y al fin de la misma. Estos dos puntos pueden estar en el mismo tiempo de simulación o estar separados (en el caso de tener los dos puntos de sincronización en el mismo instante de simulación, estaríamos en el caso untimed). Continue reading »
Ejemplo DMI
Vamos con el Direct Memory Interface (DMI) que tenemos definido en TLM-2.0. DMI viene a ser “pasar” de transacciones, protocolos y todo eso. Es decir, el Target pasa un puntero de su región de memoria (o parte de ella) al Initiator para que acceda directamente sin usar transacciones. Así ganamos en velocidad de simulación, ya que todo es mucho más sencillo. Esto del DMI está enfocado a dispositivos tipo memoria (de ahi lo de Direct Memory Interface 😉 ) conectados a módulos que accedan muchísimas veces a esos dispositivos de memoria, como por ejemplo CPUs o DMAs. Pero no eso no quita que lo podamos usar en cualquiera de nuestros módulos :-).
Continue reading »
Ejemplo de Untimed
Vamos con el primer ejemplo…
Initiator
Empezamos con los includes de las cabeceras necesarias
#include
using namespace sc_core;
#include "tlm.h"
#include "tlm_utils/simple_initiator_socket.h"
Primero incluimos systemc (previsible, eh?) y luego tlm.h (también previsible).
Por último incluimos el socket mas sencillo de todos para este ejemplo.
A continuación declaramos la classe Initiator
class Initiator: sc_module
{
public:
tlm_utils::simple_initiator_socket initiator_socket;
SC_HAS_PROCESS(Initiator);
Initiator(sc_module_name name_);
private:
void initiator_thread();
};