el lenguaje de especificación SystemC


En esta tercera sesión del seminario teórico de la asignatura de lenguajes de especificación de sistemas del máster en computación, nos hemos adentrado durante las tres horas en el estudio del lenguaje de especificación de sistemas estándar OSCI SystemC. Ha sido un poco duro asistir a una clase un viernes por la tarde …

El lenguaje SystemC unifica la descripción hardware y software de un sistema embebido tomando como base el lenguaje de programación C++ con su paradigma de programación orientada a objetos. Sobre esta base se construye una librería estándar y un entorno de simulación orientado a eventos por parte de la organización OSCI.

Aparte de lo dado en el seminario, hay una referencia (aparte de la web de OSCI) donde se puede encontrar material de estudio y práctica de SystemC, que es el tutorial de Doulos.En este mismo sitio web podemos ver material de estudio y ejemplos del otro lenguaje de especificación que tiene una amplia difusión en la industria es System Verilog.

Partiendo de la base de que en un sistema se puede hacer una partición estructural y una partición funcional, hemos visto los mecanismos y recursos que provee SystemC en dichos aspectos.

En la partición estructural tenemos el concepto de módulo (module) como contenedor principal con puertos (ports) para comunicarse y conectarse entre sí. Estos puertos se conectan a canales (channel), que representan primitivas de conexión en donde se implementan los protocolos de comunicación entre procesos. Un ejemplo de canal es signal, que modela una señal física por un medio físico (cable) Los módulos se pueden agrupar en jerarquías y pueden modelar también canales con un comportamiento complejo.

En la partición funcional tenemos los procesos (process) que se encuentran definidos dentro de los módulos. Hay tres tipos de módulos: SC_METHOD, SC_THREAD y SC_CTHREAD. Cada uno modela un tipo concreto de función del sistema. El SC_METHOD por ejemplo no se puede bloquear con un wait(), cosa que si pueden hacer los otros dos (con los que por tanto se puede modelar concurrencia) El tercero incluye una semántica síncrona de ejecución según el patrón de tiempo de un reloj. Los procesos se pueden hacer sensibles a eventos, que son en si mismos objetos de primer orden en el lenguaje de programación SystemC (sc_event)

La sensibilidad a eventos puede ser estática o dinámica. Esta última se implementa con métodos como next_trigger() que puede tomar como argumento un objeto temporal del tipo sc_time o un evento (sc_event) Si el valor de ese objeto es cero entonces el disparo del evento se hace en el próximo ciclo delta (este es un concepto que vemos más adelante al estudiar con cierto detalle el proceso de simulación de SystemC) La sensibilidad estática se implementa con el método wait() que puede tener también como parámetros sc_time y sc_event. Se vio un ejemplo de implementación (poco claro, en mi opinión) de un sistema de semáforos en un cruce, para ver los conceptos del lenguaje en acción (módulos, procesos, eventos, partición estructural y partición funcional)

Después se vieron los canales primitivos básicos que implementa SystemC: sc_signal, sc_buffer y sc_fifo (canal con memoria) Es interesante notar la diferencia entre los dos primeros: en sc_signal solamente hay una transición (y por lo tanto un evento asociado al mismo) cuando se produce un cambio en su valor (p.e 0 -> 1, pero no 0 -> 0 ó 1 ->1) mientras que en sc_buffer siempre que “entra” un valor se produce un evento de cambio tanto si el valor es nuevo como si es el mismo que el anterior. Aparte de estos canales se pueden implementar canales de usuario propios más complejos con módulos y puertos. Fue interesante ver a implementación de sc_signal donde se podía ver todos los mecanismos utilizados de la programación orientada a objetos (programación genérica, interfaces, herencia, sobrecarga de funciones, polimorfismo en wait y next_trigger, etc.)

Me llamó la atención el hecho del uso de explicit en los constructores de clase con argumento. He buscado información sobre este asunto en la red. Por los visto se utiliza porque los constructores que tienen un argumento funcionan por defecto como operadores de conversión de tipo. El modificador explicit permite restringir este comportamiento por defecto. De hecho se indica que todos los constructores que admitan uno o más parámetros deben declararse como explícitos a no ser que se desee aprovechar la conversión implícita.

La descripción del comportamiento de incialización (RESET) y el tratamiento de excepciones fue otro de los temas tratados. Se hacen con el método watching() y una serie de macros: W_BEGIN, W_DO, W_ESCAPE y W_END.

Tengo apuntado que en algún momento se hizo referencia los modelos de computación. Se mencionó a Ptolemy de la Universidad de Berkeley como una implementación no estándar en Java de dichos modelos (KPN, CSP, …) Los modelos de computación se implementan en SystemC mediante los canales. Se puede implementar cualquier modelo siguiendo unas pautas concretas (SystemC + HetSC) La ventaja que tienen ciertos modelos de computación es que permiten hacer sistemas deterministas por construcción (con el trabajo por parte del programador de implementar el método de comunic ación o rendezvous evitando los deadlocks)

Finalmente se explicó el mecanismo de simulación de SystemC dirigido por eventos. Se trata de un mecanismo que avanza en dos coordenadas. La coordenada temporal y la coordenada de ciclos delta. El mecanismo de simulación es muy parecido al que usan en Verilog/VHDL. La limitación que pudiera suponer el uso de eventos discretos se ve compensada por la potencia descriptiva de C/C++. La secuencia de simulación se puede ver como grupos de ciclos delta separados entre sí por segmentos temporales de longitud variable. Un ciclo delta consta de dos pasos: evaluación y actualización. Los eventos actúan sobre esos pasos. La generación de eventos dentro de cada paso provoca la ejecución de funciones. Los eventos pueden mantenerse dentro de un paso (notifiy()), provocar que se pase al siguiente ciclo delta (notify(0)) o hacer que avance el tiempo en la simulación.

Aquí terminó la sesión con el propósito de proseguir con la descripción más detallada del funcionamiento del simulador.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s