Básicamente no tengo experiencia en ingeniería eléctrica o diseño de hardware, pero como ingeniero de software experimentado, recientemente me interesé en diseñar mi propia CPU. Seguí las instrucciones / ejercicios presentados en el libro "The Elements of Computing Systems / Nisan & Schocken", que sugiere un diseño de RAM similar a este:
CHIP RAM8 {
IN in[16], load, address[3];
OUT out[16];
PARTS:
DMux8Way(in=load,sel=address,a=a1,b=b1,c=c1,d=d1,e=e1,f=f1,g=g1,h=h1);
Register(in=in,load=a1,out=aout);
Register(in=in,load=b1,out=bout);
Register(in=in,load=c1,out=cout);
Register(in=in,load=d1,out=dout);
Register(in=in,load=e1,out=eout);
Register(in=in,load=f1,out=fout);
Register(in=in,load=g1,out=gout);
Register(in=in,load=h1,out=hout);
Mux8Way16(a=aout,b=bout,c=cout,d=dout,e=eout,f=fout,g=gout,h=hout,sel=address,out=out);
}
Así que hay un bus de "dirección", que determina de qué dirección leer. Opcionalmente, en el mismo ciclo, el valor del bus "in" se escribe en esa dirección de memoria si se establece el bit de "carga".
Ahora intenté dar un giro a la arquitectura sugerida por el libro, donde me gustaría leer las instrucciones y los datos de la RAM en un solo ciclo (el libro propone un ROM separado para las instrucciones). Se me ocurrió este diseño de RAM:
CHIP RAM8 {
IN in[16], load, address1[3],address2[3];
OUT out1[16], out2[16];
PARTS:
DMux8Way(in=load,sel=address1,a=a1,b=b1,c=c1,d=d1,e=e1,f=f1,g=g1,h=h1);
Register(in=in,load=a1,out=aout);
Register(in=in,load=b1,out=bout);
Register(in=in,load=c1,out=cout);
Register(in=in,load=d1,out=dout);
Register(in=in,load=e1,out=eout);
Register(in=in,load=f1,out=fout);
Register(in=in,load=g1,out=gout);
Register(in=in,load=h1,out=hout);
Mux8Way16(a=aout,b=bout,c=cout,d=dout,e=eout,f=fout,g=gout,h=hout,sel=address1,out=out1);
Mux8Way16(a=aout,b=bout,c=cout,d=dout,e=eout,f=fout,g=gout,h=hout,sel=address2,out=out2);
}
Básicamente, la única diferencia es que introduje un segundo bus de direcciones, por lo que puedo leer dos direcciones en paralelo al mismo tiempo introduciendo también un segundo mux en el diseño del chip.
Ahora tengo varias preguntas relacionadas con este diseño:
- A mi parecer, la introducción de otro mux parece bastante barato para leer dos elementos de datos de la RAM en un solo ciclo. Además, el diseño de hardware me parece totalmente sólido (como un noob de diseño de hardware total) y la simulación del chip parece probar el diseño. ¿Me falta un gran error / desventaja del diseño? ¿Existen contraints eléctricos en el diseño?
- ¿Este tipo de diseño es relevante cuando las lecturas de una memoria de jerarquía inferior toman varios ciclos de todos modos?
- ¿Este tipo de diseño (leer múltiples elementos de datos en paralelo desde la RAM) se utiliza en cualquier tipo de chips existentes listos para la producción?
- Si es así ... ¿qué tipo de chips?
- Si no ... ¿por qué?
Al buscar en Google, lo único que se me ocurrió fue el tema "PRAM", que se refiere a "máquinas paralelas", no a "memoria paralela". También parece que hay "DDR / QDR RAM" que no entiendo, ya que todavía están usando un solo bus para leer datos (¿están leyendo diferentes elementos de datos en los flancos de reloj ascendente / descendente?). ¡Pero supongo que este tipo de RAM no son realmente relevantes en lo que respecta a mi pregunta de diseño de todos modos, ya que necesitan múltiples ciclos para leer datos de todos modos, mientras que mi diseño está basado en el registro y puede leer la memoria de acceso aleatorio en un solo ciclo! / p>
Apreciaría cualquier tipo de información / aclaración sobre este tema :)