Commits

Lucas Chiesa  committed d7a03c2

Agrego la memoria con el testbench de sebastian. Agrego el testbench de sebastian a mi alu, obteniendo los mismos resultados.

  • Participants
  • Parent commits 210e0ba

Comments (0)

Files changed (3)

 		endcase
 	end
 endmodule
-
+/*
 module alu_mips_test;
 	parameter TESTS=4;
 	reg signed [31:0] aluInA;
 	// Leo todos los datos a probar.
 	initial
 	begin
-		$readmemh("alu.hex", data);
+		$readmemh("./alu.hex", data);
+		$display(data);
 	end
 
 	initial
 	end
 
 endmodule
+*/
+
+// alu_mips.v
+module alu_mips_test();
+
+	reg signed [31:0] aluInA, aluInB;
+	reg[3:0] aluControl;
+	wire signed [31:0] aluResult;
+	wire aluZero;
+
+	alu_mips alu_mips_tb(aluInA, aluInB, aluControl, aluResult, aluZero, aluOverflow); 
+
+		initial //Initial es un always que se ejecuta una sola vez
+		begin
+
+			$dumpfile("alu_mips.vcd");//Le digo como llamar al archivo de simulacion
+		  	$dumpvars;//Le dice, tira en ese archivo todas las variables	
+		end
+
+		initial
+		begin
+			$display("  ");
+			$display("################################ Testbench #############################################");
+			aluInA = 1;
+			aluInB = 1;
+			aluControl = 4'b0000;
+			#10;
+			$display("Prueba 1 op. AND");
+			$display("Entrada A: %b",aluInA);
+			$display("Entrada B: %b",aluInB);
+			$display("Resultado: %b",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+			aluInA = 2;
+			aluInB = 1;
+			aluControl = 4'b0000;
+			#10;
+			$display("  ");
+			$display("Prueba 2 op. AND");
+			$display("Entrada A: %b",aluInA);
+			$display("Entrada B: %b",aluInB);
+			$display("Resultado: %b",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+			
+			aluInA = 4;
+			aluInB = 2;
+			aluControl = 4'b0001;
+			#10;
+			$display("  ");
+			$display("Prueba 1 op. OR");
+			$display("Entrada A: %b",aluInA);
+			$display("Entrada B: %b",aluInB);
+			$display("Resultado: %b",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+			aluInA = 12;
+			aluInB = 12;
+			aluControl = 4'b0001;
+			#10;
+			$display("  ");
+			$display("Prueba 2 op. OR");
+			$display("Entrada A: %b",aluInA);
+			$display("Entrada B: %b",aluInB);
+			$display("Resultado: %b",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+
+			aluInA = 2147483647;
+			aluInB = 1;
+			aluControl = 4'b0010;
+			#10;
+			$display("  ");
+			$display("Prueba 1 op. SUMA");
+			$display("Entrada A: ",aluInA);
+			$display("Entrada B: ",aluInB);
+			$display("Resultado: ",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+			aluInA = 2147483647;
+			aluInB = -2147483647;
+			aluControl = 4'b0010;
+			#10;
+			$display("  ");
+			$display("Prueba 2 op. SUMA");
+			$display("Entrada A: ",aluInA);
+			$display("Entrada B: ",aluInB);
+			$display("Resultado: ",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+			aluInA = 65535;
+			aluInB = 10;
+			aluControl = 4'b0010;
+			#10;
+			$display("  ");
+			$display("Prueba 3 op. SUMA");
+			$display("Entrada A: ",aluInA);
+			$display("Entrada B: ",aluInB);
+			$display("Resultado: ",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+			aluInA = 0;
+			aluInB = -2147483647;
+			aluControl = 4'b0010;
+			#10;
+			$display("  ");
+			$display("Prueba 4 op. SUMA");
+			$display("Entrada A: ",aluInA);
+			$display("Entrada B: ",aluInB);
+			$display("Resultado: ",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+
+			aluInA = 2147483647;
+			aluInB = 2147483647;
+			aluControl = 4'b0110;
+			#10;
+			$display("  ");
+			$display("Prueba 1 op. RESTA");
+			$display("Entrada A: ",aluInA);
+			$display("Entrada B: ",aluInB);
+			$display("Resultado: ",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+			aluInA = -256;
+			aluInB = 2147483647;
+			aluControl = 4'b0110;
+			#10;
+			$display("  ");
+			$display("Prueba 2 op. RESTA");
+			$display("Entrada A: ",aluInA);
+			$display("Entrada B: ",aluInB);
+			$display("Resultado: ",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+
+			aluInA = 2147483647;
+			aluInB = 65535;
+			aluControl = 4'b0110;
+			#10;
+			$display("  ");
+			$display("Prueba 3 op. RESTA");
+			$display("Entrada A: ",aluInA);
+			$display("Entrada B: ",aluInB);
+			$display("Resultado: ",aluResult);
+			$display("Salida Overflow: ",aluOverflow);			
+			$display("Salida aluZero: ",aluZero);
+		end
+endmodule	
+
+

File memory_mips.v

+
+module memory_mips
+	#(parameter SIZE=32,
+	parameter NMEM=20
+	)
+	(
+	input wire clk, 
+	input wire memoryWrite,
+	input wire memoryRead,
+	input wire [SIZE-1:0] memoryWriteData,
+	input wire [SIZE-1:0] memoryAddress,
+	output reg [SIZE-1:0] memoryOutData
+	);
+
+	reg [SIZE-1:0] memory [NMEM-1:0];
+	wire [SIZE-3:0] add_small;
+
+	assign add_small = (memoryAddress >> 2);
+
+	always @(posedge clk)
+	begin
+		if (memoryRead == 1'b1)
+			memoryOutData <= memory[memoryAddress];
+		else if (memoryWrite == 1'b1)
+			memory[memoryAddress] <= memoryWriteData;
+	end
+
+endmodule
+
+module memory_mips_test();
+
+	reg clk, memoryWrite, memoryRead;
+	reg[31:0] memoryWriteData, memoryAddress;
+	wire[31:0] memoryOutData;
+
+	memory_mips dut (.clk(clk),.memoryWrite(memoryWrite),.memoryRead(memoryRead),
+		.memoryWriteData(memoryWriteData),.memoryAddress(memoryAddress),
+		.memoryOutData(memoryOutData));
+
+	initial
+	begin 
+		$dumpfile("memory_mips.vcd");//Le digo como llamar al archivo de simulacion
+	  	$dumpvars;//Le dice, tira en ese archivo todas las variables	
+
+		//Para simular en el entorno "dve" de Sinopsys
+		//$vcdpluson;
+		//$monitor(clk, memoryWrite, memoryRead, memoryWriteData, memoryOutData, memoryAddress);
+	end	
+
+	always //Bloque concurrente con el resto, que esta todo el tiempo ejecutando el clock
+	begin
+		clk = 0;	
+		//While sin condicion			
+		forever #1 clk = ~clk;//Cuidado, si los tiempos de espera son muy largos respecto del clock, este no conmuta y las salidas no cambian!!!
+	end
+	
+	initial 
+	begin
+	$display("############################### Testbench ##############################");
+	
+	$display("  ");
+	$display(" Escritura ");
+	memoryRead = 0;
+	memoryWrite = 1;
+	memoryAddress = 0;
+	memoryWriteData = 10;
+	#10;
+	$display("Address escrito: ", memoryAddress);
+	
+	$display("  ");
+	$display(" Escritura ");
+	memoryRead = 0;
+	memoryWrite = 1;
+	memoryAddress = 1;
+	memoryWriteData = 11;
+	#10;
+	$display("Address escrito: ", memoryAddress);
+
+	$display("  ");
+	$display(" Escritura ");
+	memoryRead = 0;
+	memoryWrite = 1;
+	memoryAddress = 18;
+	memoryWriteData = 118;
+	#10;
+	$display("Address escrito: ", memoryAddress);
+
+	$display("  ");
+	$display(" Escritura ");
+	memoryRead = 0;
+	memoryWrite = 1;
+	memoryAddress = 19;
+	memoryWriteData = 119;
+	#10;
+	$display("Address escrito: ", memoryAddress);
+
+	$display("  ");		
+	$display(" Lectura ");
+	memoryRead = 1;
+	memoryWrite = 0;
+	memoryAddress = 0;
+	#10;
+	$display("Dato obtenido: ", memoryOutData);
+
+	$display("  ");		
+	$display(" Lectura ");
+	memoryRead = 1;
+	memoryWrite = 0;
+	memoryAddress = 1;
+	#10;
+	$display("Dato obtenido: ", memoryOutData);
+
+	$display("  ");		
+	$display(" Lectura ");
+	memoryRead = 1;
+	memoryWrite = 0;
+	memoryAddress = 18;
+	#10;
+	$display("Dato obtenido: ", memoryOutData);
+
+	$display("  ");		
+	$display(" Lectura ");
+	memoryRead = 1;
+	memoryWrite = 0;
+	memoryAddress = 19;
+	#10;
+	$display("Dato obtenido: ", memoryOutData);
+
+	#30;
+	$finish;
+	
+	end
+
+endmodule

File regfile_mips.v

 	reg [4:0] add1;
 	reg [4:0] add2;
 	reg [4:0] addw;
-	
+
 	reg regWrite;
 	reg clk;
 
 	regfile_mips dut (.addReadReg1(add1),.addReadReg2(add2),.addrWriteReg(addw),
 		.dataWrite(datow),.data1(dato1),.data2(dato2),.regWrite(regWrite),.clk(clk));
 
-
 	initial
 	begin
 		clk = 0;