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 »
Loosely time y temporal decoupling
Este estilo de codificación permite tan sólo 2 puntos de tiempo en cada transacción, correspondientes a la llamada y al retorno de la función b_transport. (usando el protocolo base, esto se correspondo con el inicio de la petición y el inicio de la respuesta de la transacción).Podemos elegir que estos dos puntos sean el mismo (y la transacción ocurre en tiempo 0)
El tiempo que se pasa como parámetro en la función b_transport indica el tiempo de inicio (y de respuesta) de la transacción respecto al tiempo actual de simulación. En el uso normal (sin usar temporal decoupling), este valor será siempre 0. El target de la transacción puede usar wait() dentro de la función b_transport para simular su tiempo de respuesta, etc.
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();
};
Interfaces, sockets, DMI y demás
Interfaces
Cuando usamos el canal normal para comunicar un Initiator con un Target usamos los interfaces que se definen en TLM2.0. De hecho, un Initiator crea una transacción y la pasa como argumento al método del interface (ya sea bloqueante o no). Este método lo implementa el Target que recibe la transacción y hace con ella lo que deba (la ejecuta). Este camino se conoce como forward path. Una vez el Target ha ejecutado la transacción, debe retornar al Initiator, y puede hacerse de dos formas distintas: a través de llamadas a métodos desde el Target al Initiator (a este camino se le llama el backward path; o usando el retorno del método del interface (se conoce como return path).
Continue reading »
Estilos de codificación (Coding Styles)
En TLM-2 se contemplan 3 modos distintos de modelado (llamados Coding Styles en los documentos oficiales) : Untimed, Loosely-timed y Approximately.timed. Cada uno de ellos sirve para un propósito determinado, y para modelar distintos tipos de sistemas. También debemos tener en cuenta el coste de simulación de cada modo (menos costoso Untimed, más costoso el Approximatelly-timed).
Continue reading »
Bienvenido
Empiezo este blog con la intención de hablar, comentar, informar, aprender sobre el mundo SystemC-TLM.