Simulando la CPU de fijación de aprendizaje

La última vez que miré un simple procesador de RISC de 16 bits dirigido a los estudiantes. Necesitaba un poco de asistencia en la documentación, así como si tuviera un archivo faltante, sin embargo, me las arreglé para que simule la utilización de una herramienta gratuita en la herramienta de Internet llamada EDA Playground. Esta vez, lo llevaré con los detalles del código, así como exactamente cómo ejecutar la simulación.

Querrá referirse a la publicación anterior si ya no lo revisó. Los diagramas, así como las tablas, proporcionan una descripción general de alto nivel que le ayudará a comprender los archivos discutidos en esta publicación.

Si deseaba realmente programar esto en un FPGA genuino, tendrías un poco de trabajo que hacer. La memoria, así como la inicialización del registro se realiza en un método que funciona bien para la simulación, sin embargo, no funcionará en un FPGA genuino. De todos modos, vamos a empezar!

Archivo por archivo

Si toma cada datos individualmente, ninguno de ellos es extremadamente difícil de entender. Aquí hay un resumen rápido (estoy utilizando los nombres de datos que utilizaré en mi simulación en Internet):

PARAMETER.V: esto es como un Datos de inclusión que establece algunas definiciones fundamentales para cada otro archivo.

PROG.V – Esta es la memoria de la dirección. Un módulo simple, se necesita una dirección, así como presenta datos para esa dirección. La Directiva de $ READMEMB lee los datos de un DATOS (TEST.PROG).

Register.v – El archivo de registro. Esto es casi como la memoria de la dirección, sin embargo, tiene dos puertos revisados, así como puede componerlo.

data.v – la memoria RAM. Esto es casi como los registros, sin embargo, más grandes, así como con un solo puerto revisado. Hay algún código de simulación que abre un DATOS, así como imprime los comentarios de la memoria, sin embargo, eliminé que, como era solo para la depuración. El contenido preliminar proviene del archivo test.data.

Alu.V: creerías que esto sería complicado, sin embargo, no lo es. Solo toma dos entradas, así como hace algo para producir la salida. Algo simple como agrega o resta. El siempre @ (*) le dice a VeriLog a no producir lógica relojes para esto. Simplemente se convierte en algunas puertas simples, así como MUXES.

DataPath_Unit.V: este es uno de los archivos más complejos, aunque si te cavas, verás que es principalmente a granel. Estos datos producen todos los recursos (como los registros, así como los recuerdos), así como los cables juntos.

Control_Unit.V: un módulo más más largo, esto solo implementa la tabla de dirección, configurando las líneas de control en función de la instrucción actual.

Alucontrol.v: estos datos decodifican instrucciones para la ALU. Faltaba en la publicación original. Curiosamente, hay una CPU más similar en el mismo sitio que tiene un archivo alucontrol, sin embargo, está claramente para un conjunto de dirección diferente. Sin embargo, comenzando a mantener los datos, así como utilizar la tabla de estilo, pude recrearlo. Si [FPGA4Studientes] corrige esto, los archivos pueden parecer extremadamente diferentes.

Diseño.sv: se requieren estos datos para el simulador de EDAPLAYGROUNDOGRO. Contiene los elementos de nivel superior (la ruta de datos, así como la unidad de control). Dado que Edaplayground solo procesa este archivo, es necesario incluir los otros archivos mencionados anteriormente. Esto causa algunas advertencias, ya que cada una de ellas tiene una directiva de escala de tiempo, sin embargo, esto es inofensivo.

TESTBENCH.SV: la banca de test no forma parte del diseño genuino, sin embargo, solo establece la simulación, así como recopila los resultados. Tuve que modificarlo un poco para trabajar con Edaplayground, sin embargo, la operación es la misma. Solo produce una CPU, lo alimenta un reloj, así como deja que se ejecute por un tiempo. El programa de prueba, así como los contenidos de la memoria, están en test.prog, así como Test.Data.

Simulación

Puedes hacer una de las dos cosas. Puede abrir mi copia del estilo listo para ir, sin embargo, que puede no ser su mejor opción. Le sugiero que solo vaya a EDAPLAYGROY y producir un nuevo proyecto Verilog. Luego comience a mover los archivos de la publicación original. Te encontrarás con errores, así como archivos faltantes. Mira exactamente cuántos puedes arreglar. Si te perturnes, puede utilizar mi copia para ayudarlo si se pone de cerca. Descubrirás más de esa manera.

Si elige intentarlo, aquí hay algunos consejos sobre Edaplaygroyground. No se necesita un requisito UVM / OVM, ni necesita ningún tipo de otras bibliotecas. Utilizé Icarus VeriLog 0.9.7, sin embargo, es probable que sea más probable que utilice cualquier tipo de herramientas de verilog disponibles. Usted desea inspeccionar la casilla de verificación EPWAVE, así como el requisito de agregar esto a la parte inicial de TestBench:

inicial
empezar
$ DumpFile (“Dump.vcd”);
$ Dumpvars;
Use la indicación + junto a las pestañas Nombre de datos para realizar nuevos archivos. EDAPLAYGROY tiene un límite de diez archivos por panel. Recuerde, tendrá que incluir cualquier tipo de archivos .v que produce en testbench.sv o design.sv. No se requiere incluir los archivos de datos, ya que los otros archivos los utilizan indirectamente.

¡Correr!

Una vez que haya funcionado todos los errores, puede presionar Ejecutar, así como recibirá el visor de la forma de onda, EPWAVE. Tu hasve Para agregar señales de tasa de interés para que pueda ver la CPU en el trabajo. Sería divertido agregar algunos dispositivos de E / S en la memoria o algunos puertos de depuración para que pueda ver las cosas un poco mejor. Por lo general, veré el mostrador del programa, así como el registro, componer el puerto para obtener un concepto de lo que está pasando dentro.

El código original tenía un programa que ejercía una gran cantidad de instrucciones. Lo comenté, así como lo reemplazé con esto:

0000_0100_0000_0000 // 0000: toneladas R0 <- MEM (R2 + 0) Dado que R2 = 0 esto pone 1 en R0 0000_0100_0100_0000 // 0002: toneladas exactamente lo mismo en R1 (R1 siempre contendrá 1) // Place 8 (byte), 4 (palabra): 0010_0000_0101_0000 // 0004: R2 = R0 + R1 0001_0010_1000_0000 // 0006: MEM [R1] = R2 (es decir, MEM [1] = R2 0000_0010_0000_0000 // 0008: R0 = MEM [R1] 1101_0000_0000_0011 // 000a: Saltar al lugar # 4 (CPU se multiplicará por 2, así como agregar 2) // No hay dirección en 000c, sin embargo, PC se colgará allí mientras procesa el salto Debe poder cumplir con el valor incremental que compone a la memoria, así como ver el ciclo del contador del programa nuevamente para colocar 4 con cada bucle. Aquí hay una sesión típica: Deje fuera una gran cantidad de señales interiores, sin embargo, puede ver que la dirección de memoria 1 se establece en 2, así como a 3 en las primeras dos iteraciones del bucle. Juego final ¿Es esta una gran CPU académica? No estoy seguro. Existen algunas CPU más simples, sin embargo, son muy pequeñas, ya que son difíciles o son extremadamente poco prácticas. Cualquier cosa más desafiante de lo que esto es más probable, tanto para morder para un principiante. Si bien creo que debería tener algún conocimiento de Verilog fundamental antes de abordar algo como esto, la documentación fue un poco escasa (y confusa) en algunas áreas. Obviamente, fue genial, ya que lo tengo trabajando, sin embargo, si está comenzando, lo más probable es que aprecie un poco más de asistencia y explicaciones. ¿Tienes una CPU de verilog académica preferida? Todavía estoy buscando a una persona que sea "justo".

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post