next up previous
Next: Desarrollo de la práctica Up: Práctica 12. El fichero Previous: fr32x32.c

test_fr32x32.c

/*
 * test_fr32x32.c -- Testeo del Fichero de Registros de 32x32 bits (R2000).
 * Ultima modificación: 13-11-00.
 * gse.
 */

#include <stdio.h>
#include "defs.h"
#include "gates.h"
#include "decods.h"
#include "latches.h"
#include "flip-flops.h"
#include "fr32x32.h"
#include "clock.h"

#ifdef _FR_BIT_
void main() {
  FILE *data=fopen("data","w");
  FILE *data_sdl=fopen("data.sdl","w");
  int iters = 1000;
  WIRE
    in = GND,
    sel0 = GND,
    sel1 = GND,
    write = GND,
    out0 = GND,
    out1 = GND;
  FR_BIT bit;
  fprintf(data,"in write sel0 sel1 out0 out1");
  while(iters--) {
    Clock(iters,33,in);
    Clock(iters,47,write);
    Clock(iters,100,sel0);
    Clock(iters,200,sel1);
    bit.run(in,sel0,sel1,write,out0,out1);
    fprintf(data_sdl,"%3d %3d %3d %3d %3d %3d\n",
	    in,write,sel0,sel1,out0,out1);
  }
}
#endif

#ifdef _FR_32x32_
void main() {
  int i,j,k;
  FR_32x32 fr;
  WIRE
    in[32],   // Bus de datos de entrada
    addr0[5], // Dirección del primer registro leido
    addr1[5], // Dirección del segundo registro leido
    addr2[5], // Dirección del registro escrito
    write,    // Señal de habilitación de escritura sobre un registro
    out0[32], // Contenido del primer registro leido
    out1[32]; // Contenido del segundo registro leido

  printf("Simulación del fichero de registros del MIPS R2000\n");
  printf("(32 registros de 32 bits, reg[0] siempre a \"0\").\n\n");

  write = VCC; // A "1" para escribir cuando se produzca el flanco negativo

  printf("La primera operación que vamos a realizar es leer el contenido\n");
  printf("del registro 0, que según las especificaciónes de MIPS debiera ser\n");
  printf("siempre cero.\nVamos a leer el contenido del este registro por el bus\n");
  printf("de salida \"out0\".\n");
  printf("Para ello, hacemos \"addr0\"=00000.\nPresentamos el contenido del bus\n");
  printf("\"out0\" durante 25 iteraciones de simulación.\n");

  addr0[0] = addr0[1] = addr0[2] = addr0[3] = addr0[4] = GND;
  for(i=0;i<25;i++) {
    fr.run(in,addr0,addr1,addr2,write,out0,out1);
    printf("%3d",i);
    for(j=31;j>=0;j--) {
      printf("%4d",out0[j]);
    }
    printf("\n");
  }

  printf("A continuación, lo que vamos a realizar es escribir sobre el registro 1\n");
  printf("el valor \"0010 0011 0100 0101 0110 0111 1000 1001\".\n");
  printf("Para hacer esto haremos que \"write\" (que durante todo este tiempo\n");
  printf("ha estado a \"1\") describa un flanco de bajada (poniéndose a \"0\"),\n");
  printf("que el bus de dirección \"addr2\" sea igual a 00001 ");
  printf("y que el bus \"in\" tenga el contenido anteriormente indicado.\n");
  printf("Para saber cuando el registro ha sido escrito y puede ser leido,\n");
  printf("mostraremos el contenido del registro 1 a través del bus de salida\n");
  printf("\"out1\".\nPor tanto, haremos que \"addr1\" sea también igual a 00001.\n");
  printf("En primer lugar presentaremos el contenido del bus \"out1\" durante 5\n");
  printf("iteraciones, para mostrar que su contenido es estable.\n");

  addr1[0] = VCC; addr1[1] = addr1[2] = addr1[3] = addr1[4] = GND;
  addr2[0] = VCC; addr2[1] = addr2[2] = addr2[3] = addr2[4] = GND;
  in[31] = GND; in[30] = GND; in[29] = VCC; in[28] = GND;
  in[27] = GND; in[26] = GND; in[25] = VCC; in[24] = VCC;
  in[23] = GND; in[22] = VCC; in[21] = GND; in[20] = GND;
  in[19] = GND; in[18] = VCC; in[17] = GND; in[16] = VCC;
  in[15] = GND; in[14] = VCC; in[13] = VCC; in[12] = GND;
  in[11] = GND; in[10] = VCC; in[ 9] = VCC; in[ 8] = VCC;
  in[ 7] = VCC; in[ 6] = GND; in[ 5] = GND; in[ 4] = GND;
  in[ 3] = VCC; in[ 2] = GND; in[ 1] = GND; in[ 0] = VCC;
  for(i=0;i<5;i++) {
    fr.run(in,addr0,addr1,addr2,write,out0,out1);
    printf("%3d",i);
    for(j=31;j>=0;j--) {
      printf("%4d",out1[j]);
    }
    printf("\n");
  }
  
  printf("En este instante hacemos que \"write\" sea \"0\", con lo que da\n");
  printf("la orden de escritura.\n");
  
  write = GND;
  
  printf("Ahora presentaremos el contenido del bus \"out1\" durante\n");
  printf("25 iteraciones.\n");

  for(i=0;i<25;i++) {
    fr.run(in,addr0,addr1,addr2,write,out0,out1);
    printf("%3d",i);
    for(j=31;j>=0;j--) {
      printf("%4d",out1[j]);
    }
    printf("\n");
  }

  printf("Como puede verse, el fichero de registros emplea 7 ciclos de simulación\n");
  printf("en presentar a la salida el contenido de un registro que acaba de ser\n");
  printf("modificado.\n");

  printf("Ahora vamos a tratar de modificar el contenido del registro 0.\n");
  printf("Para ello, hacemos \"addr2\"=\"00000\" y provocaremos flancos de bajada\n");
  printf("sobre \"write\", conectando esta entrada a un reloj.\n");
  printf("Haremos además que \"addr0\"=\"00000\" para ver el resultado a través\n");
  printf("del bus \"out0\".\n");
  printf("Serán presentadas 100 iteraciones de simulación.\n");
  
  for(i=0;i<5;i++) addr0[i] = addr2[i] = GND;
  for(i=0;i<100;i++) {
    Clock(i,10,write);
    fr.run(in,addr0,addr1,addr2,write,out0,out1);
    printf("%4d",i);
    printf("%4d",write);
    for(j=31;j>=0;j--) {
      printf("%4d",out0[j]);
    }
    printf("\n");
  }
  
  printf("Sin embargo, si elegimos otro registro (por ejemplo, el registro 2)\n");
  printf("y hacemos el test anterior, si debemos obtener algún cambio a la salida.\n");
  printf("Presentamos 50 iteraciones.\n");

  addr0[1] = addr2[1] = VCC; // El resto valen GND
  for(i=0;i<50;i++) {
    Clock(i,10,write);
    fr.run(in,addr0,addr1,addr2,write,out0,out1);
    printf("%4d",i);
    printf("%4d",write);
    for(j=31;j>=0;j--) {
      printf("%4d",out0[j]);
    }
    printf("\n");
  }

  printf("Por último, mostramos el contenido de cada uno de los registros\n");
  printf("a través del bus de salida out0[], durante\n");
  printf("10 iteraciones de simulación:\n");
  for(j=0;j<32;j++) {
    printf("Registro %2d\n",j);
    addr0[0] = (j&1)*255;
    addr0[1] = ((j>>1)&1)*255;
    addr0[2] = ((j>>2)&1)*255;
    addr0[3] = ((j>>3)&1)*255;
    addr0[4] = ((j>>4)&1)*255;
    for(i=0;i<10;i++) {
      fr.run(in,addr0,addr1,addr2,write,out0,out1);
      printf("%4d",i);
      for(k=31;k>=0;k--) {
	printf("%4d",out0[k]);
      }
      printf("\n");
    }
  }
}
#endif




2000-11-13