OpenCores
URL https://opencores.org/ocsvn/minirisc/minirisc/trunk

Subversion Repositories minirisc

[/] [minirisc/] [trunk/] [verilog/] [testbench/] [test.v] - Rev 7

Compare with Previous | Blame | View Log

/////////////////////////////////////////////////////////////////////
////                                                             ////
////  Test Bench                                                 ////
////                                                             ////
////                                                             ////
////  Author: Rudolf Usselmann                                   ////
////          rudi@asics.ws                                      ////
////                                                             ////
////                                                             ////
////  D/L from: http://www.opencores.org/cores/minirisc/         ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
////                                                             ////
//// Copyright (C) 2000-2002 Rudolf Usselmann                    ////
////                         www.asics.ws                        ////
////                         rudi@asics.ws                       ////
////                                                             ////
//// This source file may be used and distributed without        ////
//// restriction provided that this copyright statement is not   ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
////                                                             ////
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
 
//  CVS Log
//
//  $Id: test.v,v 1.1 2002-09-27 15:35:41 rudi Exp $
//
//  $Date: 2002-09-27 15:35:41 $
//  $Revision: 1.1 $
//  $Author: rudi $
//  $Locker:  $
//  $State: Exp $
//
// Change History:
//               $Log: not supported by cvs2svn $
//
//
//
//
//
//
//
//
//
//
 
`timescale 1ns / 10ps
 
module test;
 
reg		clk;
reg		reset;
reg		tcki;
 
// Declare I/O Port connections
wire [7:0]	porta; // I/O Port A
wire [7:0]	portb; // I/O Port B
wire [7:0]	portc; // I/O Port C
 
wire [7:0]	portain;
wire [7:0]	portbin;
wire [7:0]	portcin;
 
wire [7:0]	portaout;
wire [7:0]	portbout;
wire [7:0]	portcout;
 
wire [7:0]	trisa;
wire [7:0]	trisb;
wire [7:0]	trisc;
 
// Declare ROM and rom signals
wire [10:0]	inst_addr;
wire [11:0]	inst_data;
 
 
always #10 clk = ~clk;
always #20 tcki = ~tcki;
 
// Instantiate one CPU to be tested.
mrisc u0(
   .clk		(clk),
   .rst_in	(reset),
   .inst_addr	(inst_addr),
   .inst_data	(inst_data),
 
   .portain	(portain),
   .portbin	(portbin),
   .portcin	(portcin),
 
   .portaout	(portaout),
   .portbout	(portbout),
   .portcout	(portcout),
 
   .trisa	(trisa),
   .trisb	(trisb),
   .trisc	(trisc),
 
   .tcki	(tcki),
   .wdt_en	(1'b1)
 
   );
 
// IO buffers for IO Ports
assign porta = trisa ? 8'bz : portaout;
assign portain = porta;
 
assign portb = trisb ? 8'bz : portbout;
assign portbin = portb;
 
assign portc = trisc ? 8'bz : portcout;
assign portcin = portc;
 
// Pullups for IO Ports
pullup ua0(porta[0]);
pullup ua1(porta[1]);
pullup ua2(porta[2]);
pullup ua3(porta[3]);
pullup ua4(porta[4]);
pullup ua5(porta[5]);
pullup ua6(porta[6]);
pullup ua7(porta[7]);
 
pullup ub0(portb[0]);
pullup ub1(portb[1]);
pullup ub2(portb[2]);
pullup ub3(portb[3]);
pullup ub4(portb[4]);
pullup ub5(portb[5]);
pullup ub6(portb[6]);
pullup ub7(portb[7]);
 
pullup uc0(portc[0]);
pullup uc1(portc[1]);
pullup uc2(portc[2]);
pullup uc3(portc[3]);
pullup uc4(portc[4]);
pullup uc5(portc[5]);
pullup uc6(portc[6]);
pullup uc7(portc[7]);
 
 
// Instantiate the Program RAM.
prog_mem u1 (
   .clk		(clk),
   .address	(inst_addr),
   .we		(1'b0),			// This testbench doesn't allow writing to PRAM
   .din		(12'b000000000000),	// This testbench doesn't allow writing to PRAM
   .dout	(inst_data)
);
 
// This is the only initial block in the test module and this is where
// you select what test you want to do.
 
initial
   begin
	$display ("\n\nMini-RISC.  Version 1.0\n\n");
 
	//$dumpfile ("mini-risc.vcd");
	//$dumpvars (0, test);
 
	clk = 0;
   	tcki = 0;
 
  	sanity1;
 
	$readmemh ("../scode/sanity2.rom", u1.mem);	run_code("Sanity 2 ");
 
	$readmemh ("../scode/rf1.rom", u1.mem);		run_code("Register File 1 ");
 
	$readmemh ("../scode/rf2.rom", u1.mem);		run_code("Register File 2 ");
 
	$readmemh ("../scode/rf3.rom", u1.mem);		run_code("Register File 3 ");
 
	//$readmemh ("scode/tmr_wdt.rom", u1.mem);	run_code("Timer / WDT ");
 
	//$dumpflush;
	$finish;
   end
 
 
task sanity1;
 
`define		GOOD	12'h0aa
`define		BAD	12'h0af
`define		SANITY1	"../scode/sanity1.rom"
 
    begin
  	$display ("========== Starting Sanity 1 Test ========== \n");
	reset = 1;
	repeat(10)	@(posedge clk);
	reset = 0;
 
	//$display ("Loading program memory with %s", `SANITY1);
	$readmemh (`SANITY1, u1.mem);
	while(inst_addr != `GOOD & inst_addr != `BAD)	@(posedge clk);
 
	if(inst_addr == `GOOD)
	   begin
		$display("Sanity1 test PASSED !!!");
	   end
	else
	if(inst_addr == `BAD)
	   begin
		$display("Sanity1 test FAILED !!!");
	   end
	else
		$display("Sanity1 test status UNKNOWN !!!");
 
 
	repeat(4)	@(posedge clk);
	$display("=============================================\n\n\n");
 
   end 
endtask
 
task run_code;
input [16*8-1:0]	str;
 
 
    begin
  	$display ("========== Starting %s Test ========== \n",str);
	reset = 1;
	repeat(10)	@(posedge clk);
	reset = 0;
 
	//$display ("Loading program memory with %s", `SANITY2);
	//$readmemh (`SANITY2, u1.mem);
 
	repeat(10)	@(posedge clk);
	while(porta == 8'h00)	@(posedge clk);
 
 
	if(porta == 8'h01)
	   begin
		$display("Test %s PASSED !!!",str);
	   end
	else
	if(porta == 8'hff)
	   begin
		$display("Test %s FAILED in test %d !!!", str, portb);
	   end
	else
		$display("Test %s status UNKNOWN (%h test: %d) !!!", str, porta, portb);
 
 
	repeat(4)	@(posedge clk);
	$display("\n=============================================\n\n\n");
 
   end 
endtask
 
/*
always @(posedge clk)
   if(!reset)
      begin
	if( |u0.w ===1'bx )	$display("%t: Warning :W went unknown",$time);
	if( |u0.pc ===1'bx )	$display("%t: Warning :PC went unknown",$time); 
	if( |u0.status ===1'bx )	$display("%t: Warning :STATUS went unknown",$time); 
      end
*/
 
reg [8*8-1:0] inst_string;
 
always @(inst_data) begin
   casex (inst_data)
      12'b0000_0000_0000: inst_string = "NOP     ";
      12'b0000_001X_XXXX: inst_string = "MOVWF   ";
      12'b0000_0100_0000: inst_string = "CLRW    ";
      12'b0000_011X_XXXX: inst_string = "CLRF    ";
      12'b0000_10XX_XXXX: inst_string = "SUBWF   ";
      12'b0000_11XX_XXXX: inst_string = "DECF    ";
      12'b0001_00XX_XXXX: inst_string = "IORWF   ";
      12'b0001_01XX_XXXX: inst_string = "ANDWF   ";
      12'b0001_10XX_XXXX: inst_string = "XORWF   ";
      12'b0001_11XX_XXXX: inst_string = "ADDWF   ";
      12'b0010_00XX_XXXX: inst_string = "MOVF    ";
      12'b0010_01XX_XXXX: inst_string = "COMF    ";
      12'b0010_10XX_XXXX: inst_string = "INCF    ";
      12'b0010_11XX_XXXX: inst_string = "DECFSZ  ";
      12'b0011_00XX_XXXX: inst_string = "RRF     ";
      12'b0011_01XX_XXXX: inst_string = "RLF     ";
      12'b0011_10XX_XXXX: inst_string = "SWAPF   ";
      12'b0011_11XX_XXXX: inst_string = "INCFSZ  ";
 
      // *** Bit-Oriented File Register Operations
      12'b0100_XXXX_XXXX: inst_string = "BCF     ";
      12'b0101_XXXX_XXXX: inst_string = "BSF     ";
      12'b0110_XXXX_XXXX: inst_string = "BTFSC   ";
      12'b0111_XXXX_XXXX: inst_string = "BTFSS   ";
 
      // *** Literal and Control Operations
      12'b0000_0000_0010: inst_string = "OPTION  ";
      12'b0000_0000_0011: inst_string = "SLEEP   ";
      12'b0000_0000_0100: inst_string = "CLRWDT  ";
      12'b0000_0000_0101: inst_string = "TRIS    ";
      12'b0000_0000_0110: inst_string = "TRIS    ";
      12'b0000_0000_0111: inst_string = "TRIS    ";
      12'b1000_XXXX_XXXX: inst_string = "RETLW   ";
      12'b1001_XXXX_XXXX: inst_string = "CALL    ";
      12'b101X_XXXX_XXXX: inst_string = "GOTO    ";
      12'b1100_XXXX_XXXX: inst_string = "MOVLW   ";
      12'b1101_XXXX_XXXX: inst_string = "IORLW   ";
      12'b1110_XXXX_XXXX: inst_string = "ANDLW   ";
      12'b1111_XXXX_XXXX: inst_string = "XORLW   ";
 
      default:            inst_string = "-XXXXXX-";
   endcase
   //$display("Executing[%h] %s",inst_addr, inst_string);
end
 
 
endmodule
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.