Una cosa que tendrás que considerar es si permites cualquier forma de instrucción multipalabra, o cualquier cosa que pueda "actuar" como una instrucción multipalabra; si lo haces, puede que entonces quieras considerar si usar palabras de instrucción adicionales después de la instrucción principal, o palabras prefijo antes de ella. Permitir prefijos y palabras de continuación puede aumentar la complejidad de la gestión de interrupciones, pero puede evitar la necesidad de encajar instrucciones poco utilizadas en el mismo espacio de opcode que las de uso común.
Si las instrucciones se obtienen en el ciclo anterior a su ejecución, se podría tener una instrucción de "bifurcación condicional" que o bien hiciera que se saltara la siguiente palabra de instrucción o bien que su contenido se transfiriera directamente al contador de programa; un diseño de este tipo podría añadir cierta complejidad adicional a la secuenciación de interrupciones, pero podría aliviar la necesidad de utilizar una gran parte del espacio de opcodes para instrucciones de "bifurcación", "salto" y "llamada", al tiempo que permitiría una gama mucho más amplia de condiciones de bifurcación de lo que sería posible de otro modo. Dado que una bifurcación que se toma generalmente requerirá un ciclo muerto después de la ejecución de la propia instrucción, independientemente de la procedencia de la dirección, hacer que la dirección provenga de la siguiente palabra que se ha obtenido, pero que no se ejecutará, no cuesta ningún tiempo extra.
Aunque mover la dirección de destino fuera de las instrucciones de bifurcación reducirá la cantidad de espacio de opcode que ocupan, un formato de opcode de 16 bits sigue siendo bastante ajustado. El uso de instrucciones prefijo puede ayudar en este sentido. Si, por ejemplo, uno quiere tener 32 registros, permitir que cualquier registro sea especificado independientemente como fuente1, fuente2, y destino requeriría 15 bits en el opcode, permitiendo un enorme total de dos instrucciones. No es muy útil. Por otro lado, sería bueno poder utilizar cualquiera de los 32 registros para cada uno de los tres operandos. Se podrían equilibrar los dos objetivos haciendo que cualquier operación de la ALU que no esté precedida por un prefijo utilice ocho bits para hacer dos selecciones de uno de dieciséis registros, pero que una operación de la ALU que siga inmediatamente a un prefijo utilice algunos bits del prefijo junto con ocho de la instrucción siguiente, para permitir la selección independiente de ambas fuentes y el destino del conjunto completo de 32. Las instrucciones que utilizan los registros superiores necesitarían dos palabras/ciclos en lugar de uno, pero en algunos casos esta compensación podría merecer la pena. La mayor dificultad con el uso de prefijos es que hay que evitar que se produzca una interrupción entre un prefijo y la siguiente instrucción, o bien asegurarse de que si se produce una interrupción, la instrucción posterior al prefijo seguirá utilizando los registros correctos [por ejemplo, haciendo que la lógica de almacenamiento del contador de programa guarde la dirección de la última instrucción sin prefijo ejecutada].
Utilizar instrucciones de varias palabras dificultará algunos aspectos del diseño, pero puede reducir la necesidad de tomar otras decisiones difíciles.
1 votos
Construye primero tu ALU y mira qué cables de control necesita. Después, conéctalos directamente al registro de "instrucción actual". Lo mismo para la lógica de control de acceso a memoria, y cualquier otra clase importante de opcodes. Luego usa los bits que sobren para seleccionar qué subcircuito se activa.
1 votos
También está el artículo original de Ken Chapman sobre su máquina de programación de estados de 8 bits KCPSM, también conocida como PicoBlaze. Describe cómo eligió las instrucciones y diseñó la ISA. dc.uba.ar/materias/disfpga/2010/c2/descargas/