Si estoy escribiendo un procesador en VHDL, ¿cómo puedo hacer que un ensamblador facilite las pruebas?

2

Siempre que haya escrito un diseño de microprocesador simple en VHDL en el que he decidido qué instrucciones tiene que hacer para cada tarea, entonces tendré que escribir el código de prueba en un lenguaje de máquina que sea tedioso y propenso a errores.

Un simple ensamblador sería como un "procesador de texto liviano" donde puede convertir las instrucciones de ensamblaje a código de máquina al analizar el texto del programa de lenguaje ensamblador. Cada instrucción de ensamblaje es mnemotécnica y el analizador también descubrirá cómo ajustar los parámetros en la palabra de instrucción de la máquina generada, por ejemplo, nombre del registro, nombre de la variable e.t.c

¿Existe una solución fácil para desarrollar un ensamblador de esta naturaleza?

    
pregunta quantum231

3 respuestas

2

Puh, escribir un ensamblador en realidad implicaría escribir un analizador, y luego escribir algún tipo de sintaxis abstracta Árbol a instrucciones convertidor.

Creo que esto, si quieres hacerlo de la manera más simple, se puede hacer definiendo una gramática (es decir, un conjunto de instrucciones y registros y formatos de valores inmediatos y cómo combinarlos) y luego generar un analizador para eso. Puedes seguir el camino de Bison / Yacc / flex sobre eso, pero escucho cosas buenas sobre ANTLR, así que lo intentaré.

En el medio, probablemente querrá implementar un clang o un back-end de GCC. Eso tendría el efecto secundario "agradable" que luego podría compilar, por ejemplo. C a su conjunto de instrucciones.

    
respondido por el Marcus Müller
1

Existe tal cosa como un ensamblador genérico de microcódigo; mcasm es solo un ejemplo que encontré en una búsqueda rápida.

A medida que sucede, el año pasado escribí un nuevo procesador, pero estoy usando un micro-ensamblador de cosecha propia que un colega escribió en Ruby, que reescribí sustancialmente. Es muy sencillo; básicamente, le permite definir símbolos que representan campos de bits cuyos valores contienen números específicos de bits y unir esos campos para crear palabras de instrucción completas. También le permite etiquetar instrucciones y usar esas etiquetas como argumentos para saltar / llamar instrucciones, etc.

Entonces la sintaxis termina pareciéndose a esto:

loop1:
    add, reg1, reg2;  // this is a comment
    jump, nc, loop1;
    
respondido por el Dave Tweed
1

Si su conjunto de instrucciones es pequeño y simple, un ensamblador podría ser tan simple como un grupo de instrucciones de cambio / caso. Si todas sus instrucciones utilizan los mismos bits para los operandos, podría separar su manejo del controlador de instrucciones principal. Un simple algoritmo en C sería:

  1. Lee una línea de texto.
  2. Llama a strtok () para dividir la línea en tokens.
  3. Interpreta el primer token como una instrucción. Use un montón de sentencias if / else con strcmp () para encontrar el código de operación, luego guárdelo en la palabra de salida.
  4. Interpreta los otros tokens como operandos. O con los bits apropiados en la palabra de salida.
  5. Si los pasos 3 o 4 fallaron, finalice con un mensaje de error útil. De lo contrario, escriba la palabra de salida completa en el archivo de salida.
  6. Repetir.

Sería aún más fácil en un lenguaje de alto nivel como Python. Las características más complejas podrían incluir:

  • Etiquetas con nombre para instrucciones de rama
  • Valores constantes
  • Direcciones de memoria para código y datos

Si quieres hacer algo complicado, las sugerencias en la respuesta de Marcus son útiles. Pero si solo quieres probar tu proyecto, lo mantendré simple.

    
respondido por el Adam Haun

Lea otras preguntas en las etiquetas