El codiseño surge como un desarrollo conjunto de componentes de hardware y software para obtener un diseño completo de un sistema específico.
Desde no hace mucho tiempo atrás se comenzó a trabajar intensivamente en técnicas de especificación, diseño y síntesis de sistemas mixtos de hardware y software, teniendo siempre en cuenta que los desarrollos deben poseer dos cualidades importantes: capacidad de simulación de las diferentes etapas de síntesis del sistema, por un lado, y por otro lado, la posibilidad de particionado del sistema en sub-sistemas relativamente independientes que podrán ser implementados oportunamente en hardware (FPGA, ASIC) o software (sobre la base de programas corriendo sobre una plataforma estándar a partir de microprocesadores).
En general es aceptable pensar el sistema como una descripción en algún lenguaje de especificación determinado (apto para la especificación de sistemas de este tipo) y a partir del mismo aplicar ciertas transformaciones (que involucran tomas de decisión determinadas) para `depurarlo' gradualmente hasta obtener una instancia del sistema expresada como dos conjuntos de
tareas `materializables' en software y en hardware.
Entonces, el punto de partida del desarrollo de un sistema dedicado es una descripción funcional en un lenguaje de alto nivel que permita la descripción de: procesos (tareas) concurrentes con mecanismos de sincronización y comunicación; comportamientos diferentes, con transiciones entre unos y otros definidas por eventos; y descomposiciones jerárquicas. Además la descripción tiene que ser simulable.
El lenguaje estudiado es Ada, que fue creado precisamente para la programación de sistemas en tiempo real. Por tanto no cabe duda de que permite especificar y simular el funcionamiento de sistemas dedicados. Además tiene una estructura parecida a la del lenguaje de descripción de circuitos VHDL que se utilizará para la especificación de los procesadores y de las interfaces de comunicación. Aún así, el lenguaje adolece de algunas deficiencias, ya que no soporta implícitamente transiciones de estados y descomposición jerárquica; dos características necesarias a la hora de especificar requerimientos de un sistema embebido.
El trabajo propone soluciones que permiten modelizar descomposiciones jerárquicas a más de un nivel descritas en un metalenguaje a partir del cual se puedan generar las estructuras de código Ada necesarias para soportar descripciones jerárquicas.
A partir de estas estructuras es posible definir sistemas embebidos completos partiendo de descripciones jerárquicas completas, que puedan ser simulados en el enterno Ada y posteriormente sintetizados convenientemente a fin de proveer sendas descripciones de procesos materializables en hardware y software además de los canales de comunicación necesarios.