Advertisement
kekellner

Lab10 - Ej03 - RAM y su Testbench

Nov 8th, 2021
1,849
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module RAM(
  2.           input csRAM, weRAM,
  3.           input [11:0] address,
  4.           inout [3:0] data);
  5.  
  6.     reg [3:0] data_out;
  7.     reg [3:0] memory [0:4095];
  8.  
  9.     assign data = (csRAM && !weRAM) ? data_out : 4'bzzzz;
  10.  
  11.     // Reading from RAM
  12.     always @ (address or csRAM or weRAM) // Siempre que la dirección o los bits de configuración cambien ejecute el código
  13.         if (csRAM && !weRAM)
  14.             data_out = memory[address];
  15.  
  16.     // Writing to RAM
  17.     always @ (address or csRAM or weRAM or data) // Como la memoria es asíncrona debemos revisar también si se está cambiando el dato en el puerto (data)
  18.         if (csRAM && weRAM)
  19.             memory[address] = data;
  20.  
  21. endmodule
  22.  
  23.  
  24. module tb();
  25.  
  26.     reg cs, we;
  27.     reg [11:0] address;
  28.     reg [3:0] rData;
  29.     wire [3:0] data;
  30.  
  31.     /*
  32.         El funcionamiento de la RAM es en ambas direcciones: leer y escribir.
  33.         Por lo tanto lo que conectemos en el puerto inout 'data' debe poder colocarse
  34.         en alta impedancia y también en un valor estable.
  35.         Es posible asignar 4'bzzzz a rData para que el puerto inout tenga alta impedancia.
  36.         Y luego asignar 4'b0101 (o cualquier otro valor) para que el puerto inout
  37.         reciba un dato como tal.
  38.     */
  39.     assign data = rData;
  40.  
  41.     RAM DUT (cs, we, address, data);
  42.  
  43.     initial begin
  44.         cs = 0; we = 0; address = 12'd0; rData = 4'b0000;
  45.         $monitor("cs: = %b we = %b address = %b data = %b", cs, we, address, data); // Es importante que lo que monitoreemos sea la variable 'data' y no 'rData' porque queremos ver lo que le escribimos a la RAM y luego lo que leemos de ella
  46.  
  47.         #1
  48.         $display("----- Escribir a la RAM -----");
  49.         cs = 1; we = 1; address = 12'd0; rData = 4'b1100;
  50.         #1
  51.         cs = 1; we = 1; address = 12'd1; rData = 4'b0011;
  52.         #1
  53.         cs = 1; we = 1; address = 12'd10; rData = 4'b0101;
  54.         #1
  55.         cs = 1; we = 1; address = 12'd255; rData = 4'b1010;
  56.  
  57.         #1
  58.         $display("------- Leer de la RAM ------");
  59.         cs = 1; we = 0; address = 12'd10; rData = 4'bzzzz; // Importante colocar 'rData' en alta impedancia para que la RAM pueda escribir en el wire 'data'. Si no se hace algunos valores salen en 'x' porque hay contención.
  60.         #1
  61.         cs = 1; we = 0; address = 12'd0;
  62.         #1
  63.         cs = 1; we = 0; address = 12'd255;
  64.         #1
  65.         cs = 1; we = 0; address = 12'd1;
  66.     end
  67.  
  68. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement