SystemC

SystemC es un lenguaje de modelado y simulación especialmente para el desarrollo de sistemas electrónicos complejos que incluyen componentes de hardware y software.

A diferencia de los lenguajes de descripción de hardware puros como VHDL y Verilog-HDL , SystemC no es un lenguaje de programación propio, sino una biblioteca de clases C ++ . Está definido en el estándar IEEE actual 1666-2011. Una implementación de código abierto del estándar también está disponible bajo la licencia Apache 2.0 . Como biblioteca de clases, SystemC C ++ amplía los elementos del lenguaje que se utilizan para el modelado de hardware. Al mismo tiempo, la biblioteca tiene un núcleo de simulador para que los modelos descritos con SystemC se puedan ejecutar y probar.

SystemC se utiliza principalmente para modelar en niveles más altos de abstracción, p. Ej. B. utilizado para el modelado de nivel de transacción (TLM) . Por lo tanto, SystemC es particularmente adecuado para diseños a nivel de sistemas electrónicos , donde la provisión temprana de un prototipo virtual para la evaluación de alternativas de diseño es de gran importancia. Los diseños clásicos de RTL serían demasiado complejos e inflexibles aquí.

Otra ventaja de SystemC es no solo el rápido desarrollo de prototipos, sino también el rendimiento de simulación significativamente mejorado en niveles más altos de abstracción. Los modelos diseñados en SystemC en el nivel de transancción pueden tener un rendimiento de simulación que es alrededor de mil veces más rápido que los modelos RTL . Esto significa que también se pueden simular programas más complejos y se pueden sopesar alternativas de diseño con respecto a la partición de componentes de hardware y software. Pero también es posible modelar circuitos sintetizables en el nivel de transferencia de registro con SystemC como sustituto de VHDL o Verilog.

Dado que SystemC no es un lenguaje independiente, sino una biblioteca pura (de clases ) para C ++, todos los elementos típicos del lenguaje de los lenguajes de descripción de hardware convencionales deben asignarse a construcciones simples del lenguaje C ++. Esto trae a SystemC la desventaja de una sobrecarga sintáctica que los lenguajes de descripción de hardware convencionales no tienen. Proporcionar una variedad de preprocesadores : las macros ayudan a mitigar un poco este efecto. El desarrollador tiene mucha más libertad para expresarse, pero esto suele entrar en conflicto con la capacidad de sintetizar el modelo de hardware.

SystemC es adecuado, como B. también el lenguaje de modelado E , para el modelado de protocolos y periféricos, con el fin de utilizarlo para comprobar la impecabilidad de un circuito digital. Sin embargo, SystemC no es solo un lenguaje de modelado, sino también su propio núcleo de simulación. Esto está contenido en la biblioteca SystemC (por ejemplo, en cada implementación de referencia del OSCI), de modo que se crea un simulador ejecutable con el comportamiento del código fuente compilando un código fuente del sistema. Sin embargo, SystemC también es compatible con herramientas de simulación comerciales como Modelsim .

Muchas universidades están trabajando en programas eficientes para la síntesis de circuitos a partir de modelos SystemC. Algunas empresas ofrecen soluciones que pueden generar listas de red para ASIC o FPGA a partir de ciertos códigos SystemC . En 2005, la versión 2.1 de la descripción de referencia SystemC fue ratificada por la asociación internacional de ingeniería IEEE como el estándar IEEE 1666-2005, que fue reemplazado por 1666-2011 en 2012. Este estándar representa el LRM (Language Reference Manual) actual y está disponible como descarga gratuita desde el IEEE (ver enlaces web). En 2007, la implementación de referencia de código abierto de OSCI (Open SystemC Initiative) se actualizó a la versión 2.2 para ser totalmente compatible con IEEE 1666 LRM.

En 2016, el Sistema de extensión de señal mixta analógica C AMS fue ratificado como estándar (IEEE 1666.1-2016). Una implementación de referencia de código abierto está disponible como descarga gratuita (ver enlaces web).

sintaxis

Dado que SystemC es una biblioteca de clases para C ++, aquí solo se dan las construcciones típicas de SystemC.

Módulos

Los módulos se utilizan para dividir sistemas más complejos en partes manejables. Forman bloques de construcción, son accesibles externamente a través de puertos y, a su vez, pueden contener módulos. La sintaxis es

SC_MODULE (Modulname) {
// Modulinhalt
};

El constructor crea una instancia del módulo

SC_CTOR (Modulname) {. . . }

dio cuenta.

Señales y puertos

Los puertos forman la interfaz entre el módulo y el mundo exterior. Hay tres tipos de puertos y, como cuarto tipo, señales:

sc_in<Porttyp> PortInName; // Eingang
sc_out<Porttyp> PortOutName; // Ausgang
sc_inout<Porttyp> PortInOutName; // Bidirektional
sc_signal<Signaltyp> SigName; // Signal

Procesos

La funcionalidad de los módulos está formada por procesos. Hay tres tipos de procesos.

Los procesos de método se llaman cuando cambia una señal de la lista de sensibilidad y, una vez ejecutados, el control se devuelve al simulador. Por

SC_METHOD (Funktionsname);

se instala una determinada función que debe declararse en el módulo de antemano. La lista de sensibilidad está a través

sensitive << Signal1 << Signal2 . . .

generado.

A diferencia de los procesos de método, los procesos de subprocesos solo se inician una vez y se ejecutan por el mismo bucle una y otra vez, en el que los comandos wait () se utilizan para interrumpir temporalmente.

SC_THREAD (Funktionsname);

Los procesos de subprocesos sincronizados son procesos de subprocesos síncronos cuyas acciones solo son visibles en el siguiente borde del reloj . A diferencia de los procesos de subprocesos, no hay ninguna especificación de la lista de sensibilidad, pero el segundo argumento en la llamada

SC_CTHREAD (Funktionsname, Taktflanke);

especifica qué flanco de la señal de reloj activa el proceso.

ejemplo

Un sumador en SystemC:

#include "systemc.h"

SC_MODULE(adder) {        // Moduldeklaration (eine Art Klasse)
  sc_in<int> a, b;        // Zwei Eingangs-Ports (a und b)
  sc_out<int> sum;        // Ein Ausgangs-Port

  SC_CTOR(adder) {
    SC_THREAD(doit);
    sensitive <<a <<b;
  }

  void doit() {
    while(true) {
      sum.write(a.read() + b.read());
      wait();
    }
  }
};

Ver también

literatura

  • Frank Kesel, modelado de sistemas digitales con SystemC. Desde RTL hasta modelado a nivel de transacciones . 2012. ISBN 978-3-486-70581-2

enlaces web

Evidencia individual

  1. SystemC. Consultado el 8 de febrero de 2019 .
  2. ^ G. Martin: SystemC: del lenguaje a las aplicaciones, de las herramientas a las metodologías . En: 16º Simposio sobre Diseño de Sistemas y Circuitos Integrados, 2003. SBCCI 2003. Actas. Septiembre de 2003, pág. 3– , doi : 10.1109 / SBCCI.2003.1232796 ( ieee.org [consultado el 8 de febrero de 2019]).
  3. Frank Kesel: Modelado de sistemas digitales con SystemC, desde RTL hasta modelado a nivel de transacciones . De Gruyter, Berlín, Boston 2012, ISBN 978-3-486-70581-2 , págs. 17 , doi : 10.1524 / 9783486718959 ( degruyter.com [consultado el 8 de febrero de 2019]).