Ejecutando push $ reg usando una instrucción en ruta de datos de ciclo único

1

Así que sé cómo empujar un registro usando dos instrucciones, pero ¿cómo puedo empujar un registro en la pila usando una instrucción? Aquí está la ruta de datos de un solo ciclo

Estoy seriamente atrapado aquí

    
pregunta Joe Defill

1 respuesta

3

No hay absolutamente ninguna manera de responder con precisión a esta pregunta sin más contexto, pero voy a tomar una foto en la oscuridad solo por diversión:

Empujar a la pila implica escribir el contenido del registro Rdata en la memoria indicada por el registro de puntero de pila, [Rsp], y luego incrementar Rsp para que continúe apuntando a la parte superior de la pila.

Parece que para escribir en el ram, debes configurar MemWrite en el bloque "Control".

Mirando el bloque de "Memoria de datos" en la parte inferior derecha, necesitamos proporcionarle "Escribir datos" y "Dirección". La señal "Escribir datos" proviene de "Leer datos 2" del bloque "Registros".

Ahora no me queda claro al 100% qué se supone que debe generar "Leer datos 2", pero creo que se hace eco del contenido del registro indicado por "Leer registro 2", que es la Instrucción [20-16]. Por lo tanto, puede configurar Instrucción [20-16] = 0b00010 para colocar el valor de R2 en "Registro de lectura 2". Ok, entonces la Instrucción [20-16] debe ser el ID del registro cuyo contenido desea que se coloque en la pila.

Ahora, la entrada de "Dirección" proviene de la ALU. Las entradas de ALU parecen ser "Leer datos 1" del bloque "Registros", y ya sea "Leer datos 2" o Instrucción [15-0] (después de extender el signo a 32 bits), dependiendo de la señal AluSrc del Bloque de control.

De modo que se parece a "Leer registro 1", la instrucción [25-21] debe ser la identificación de su registro de puntero de pila para que la dirección de la parte superior de la pila se coloque en la línea ALU. No queremos que el valor insertado en la pila sea nuestro otro operando de ALU, así que configure AluSrc = 1 para que se MUX a partir de la Instrucción [15-0]. Por lo tanto, la instrucción [15-0] debe ser el tamaño de la escritura (4 bytes), de modo que el puntero de pila pueda incrementarse a la siguiente dirección. Para que esto suceda, el bloque de control de ALU necesita enviar una señal a la ALU indicando que la operación es una adición. Parece que puede establecer ALUOp en Control, a través de la Instrucción [26-31] o posiblemente a través de la Instrucción [0-5].

Después de esto, la dirección en la que escribas será Rsp + 4, y luego necesitas escribir esta dirección back en Rsp para que Rsp = Rsp + 4. Veamos que la salida del La ALU se enruta a un MUX dirigido por la señal MemToReg desde el bloque "Control". Creo que necesitamos configurar MemToReg = 0 para exponer la dirección en la salida de MUX (a diferencia de los datos en esa dirección). Luego, Rsp + 4 se enruta a "Escribir datos" en el bloque de Registros.

Ahora necesitamos configurar el valor "Escribir registro" en el bloque Registros. Dado que nuestro registro de puntero de pila se indicó a través de "Leer registro 1", a diferencia de "Leer registro 2", no podemos usar el valor MUX de la señal de "Leer registro 2" (y no hay forma de evitarlo, ya que los datos en el registro 2 está directamente vinculado a la línea "Escribir datos", por lo que no podemos colocar el puntero de pila en el registro 2). Creo que también debes habilitar la señal "RegWrite" del bloque de control para habilitar la reescritura.

Pero está bien, porque podemos configurar la señal de "registro de escritura" para que sea la instrucción [15-11] haciendo que RegDst se ejecute desde el bloque de Control = 1. Por lo tanto, la instrucción [15-11] debe volver a ser identificada por el id de la Apilar el registro de puntero. Sin embargo, notará que esto está en conflicto con lo que hicimos anteriormente, diciendo que la instrucción [15-0] debería ser 4. Por lo tanto, puede hacer que el puntero de su pila registre 0 para evitar este conflicto, complete la instrucción [15- 0] con -4 para usar el registro 31 como puntero de pila y hacer que la pila crezca hacia abajo, o puede consultar la documentación para el bloque de control de ALU y ver si hay una forma de evitar esto: se parece a los datos de la instrucción [5 0] también se envía a la ALU, aunque no está claro cómo se utilizan estos datos.

Luego, configure el resto del bloque de control de forma adecuada: "Salto" debe establecerse en 1, y MemRead probablemente debería estar desactivado.

Nuevamente, realmente necesita elaborar este diagrama. No me queda claro, por ejemplo, cómo se decide la salida del bloque de Control (especialmente teniendo en cuenta que tiene 9 salidas pero solo 6 bits de de entrada, así que a menos que me falte algo, no todas las combinaciones son posibles) o qué datos "control de ALU" envía a la ALU.

    
respondido por el Ponkadoodle

Lea otras preguntas en las etiquetas