IIC2343 / Syllabus-2024-2

44 stars 0 forks source link

[Proyecto | Etapa 2] Ayuda con Stack #122

Open matias-m6reno opened 3 weeks ago

matias-m6reno commented 3 weeks ago

Hola, ¿como están?, somos el grupo 62

Llevamos varias horas intentando reparar el proyecto y no logramos encontrar el problema. El problema pasa en el stack, resulta que PUSH A no guarda el valor de A o el SP da cualquier valor. Hemos probado cambiando muchas cosas, pero siempre luego de un PUSH A al leer la memoria en la dirección SP, vemos un 0 o no el valor que debería ser.

Probamos cambiar el load a 0 (antes era un 1 lógico) y cambiar datain de "0000 0000 0000" a "1111 1111 1111". Tambien creamos el RegSP como design source para que tenga 12 bits. Intentamos buscar en distintas direcciones el valor de A después de PUSH A, pero no se guardaba en ningun lugar que sepamos. Verificamos varias veces el opcode, el cual esta así: 00100000001000100 que corresponde a la concatenación de las señales del excel.

Describimos el registro de esta forma:

inst_RegSP : RegSP port map ( clock => clock, clear => clear, load => '0', up => incSP, down => decSP, datain => "111111111111", dataout => regSP_dataout );

Notamos también, en las siguientes instrucciones... // PUSH A C0: MOV A,5 // A=5 PUSH A // SP (FFF) = 5 MOV A,0 // A=0 NOT B,A // B=FFFF MOV A,(B) // A = mem[FFF] = SP = 5 CMP A,5 // A==5? JEQ C1 JMP mal

Cuando se ejecuta NOT B,A debería ser FFFF, pero en realidad es 1000, esto lo demostramos restándole un 4095 lógico a B que nos dio un 1 lógico en B.

Gracias de antemano

Geeermy commented 3 weeks ago

Hola @matias-m6reno.

Si configuras la entrada load en 0, tu registro SP nunca actualizará su valor a 1111111111111111, por lo que su valor inicial será 0 y nunca usarás el valor de SP en la dirección inicial. Para corroborar que ese es el problema, ejecuta el siguiente fragmento de código:

MOV A,3
PUSH A
MOV B,(0)

Si se da que B = 3, entonces efectivamente tu SP parte en 0 y estás escribiendo en la dirección 0 de memoria, lo que es incorrecto.

Un arreglo rápido es cambiar la forma en la que instancias SP a lo siguiente:

inst_RegSP : RegSP port map (
clock => clock,
clear => '0',
load => clear,
up => incSP,
down => decSP,
datain => "111111111111",
dataout => regSP_dataout
);

La señal clear solo se activa al principio para limpiar los registros. Por ende, al instanciarlo de esta forma evitas que se limpie y haces que se guarde el valor correcto al principio de la ejecución del programa. Avísame si esto funciona.

PD: No compartas más código ni combinación de señales, por favor. Si necesitas entregar más información, hazlo en las issues del repositorio de tu grupo.

Saludos.

matias-m6reno commented 3 weeks ago

Hola, intente el primer test que nos proporcionas. El resultado del B fue 2, no 3. Sinceramente no se que pueda significar esto.

Estoy sintetizando los cambios en el código (disculpas por adjuntarlo, no volverá a pasar) de todos modos. Cambiando la arquitectura termina dando lo mismo (0302). No se que significa esto, voy a probar mostrar en el display el stack como recomendo un compañero. Gracias de antemano y saludos

Edit: Mostrando en el display 0000 junto con los 12 bits del RegSP y corriendo el codigo que me proporcionaste, veo 0FFF y luego 0FFE asi que creo que está usando el final

Geeermy commented 3 weeks ago

@matias-m6reno en este caso, sugiero cambiar MOV A,3 por otro valor, por ejemplo MOV A,7. Esto te ayudará a ver si consistentemente guardas un valor una unidad menor o no.

matias-m6reno commented 3 weeks ago

Ok, probé cambiar a MOV A,7. el resultado fue 0702, es decir que se guarda en (0) un 2 por alguna razon. Probé reinciar la Basys y hacer la instrucción sin el PUSH: MOV B,(0) sto con la Basys limpia me dio 0000. Volví luego a hacer el MOV A,7 PUSH A MOV B,(0) lo que me volvio a retornar 0702, creo que esto significa que PUSH A guarda por alguna razon un 2 en la direccion 0, ahora, no se porque un 2 ni tampoco por que lo hace en la direccion 0. Mostrando en el display 0000 junto con los 12 bits del RegSP y corriendo PUSH A, veo 0FFF y luego 0FFE asi que creo que deberia estare usando el final.

Espero puedas ayudarme, de todas formas muchas gracias

Geeermy commented 3 weeks ago

Revisaré tu repositorio y te contactaré en él, ya que parece ser un error de implementación de tu grupo.

Saludos.