16位的RISC_CPU

源代码在线查看: test.v

软件大小: 430 K
上传用户: quzhengjie
关键词: RISC_CPU
下载地址: 免注册下载 普通下载 VIP

相关代码

								//------------------------------------------- test.v 文件的开始 -----------------------------------------------------				/***********************************************************************				***  模块功能:test模块通过运行5个不同的汇编程序对cpu模块进行完整的逻辑测试				***            和验证。仿真程序在加栽后会自动执行,运行的结果在人机交互的显示				***            屏上显示。本模块是不可综合的行为模块,用于对CPU模块进行RTL级和				***            门级逻辑功能的全面仿真验证。 				************************************************************************/				`include "cpu.v"				`include "rom.v"				`include "ram.v"				`include "decoder.v"				`timescale 1ns/1ns				module test;				  reg         clk;				  reg         reset_n;				  wire        wr;				  wire        rd;				  wire        halt;				  wire [12:0] addr;				  wire [15:0] rddata;				  wire        rom1_sel;				  wire        ram1_sel;				  wire [15:0] rom1_data;				  wire [15:0] ram1_data;				  reg  [23:0] mnemonic;				  reg  [12:0] ip_status;				  wire  [1:0] cpu_status;				  integer   test;				  integer   i;				  parameter S0=2'd0, S1=2'd1, S2=2'd2, S3=2'd3;				  				  assign cpu_status=cpu1.state;				  always #50 clk=~clk;				  				  always@(cpu1.opcode)				  	case(cpu1.opcode)				  		3'd0:  mnemonic				  		3'd1:  mnemonic				  		3'd2:  mnemonic				 		3'd3:  mnemonic				 		3'd4:  mnemonic				  		3'd5:  mnemonic				  		3'd6:  mnemonic				  		3'd7:  mnemonic				 		default:  mnemonic				 		endcase				  				  always@(posedge halt)				  	begin				  		#250;				  		$display("\n**********************************************");				  		$display("**A halt instruction has been processed!!!");				  		$display("************************************************");				  	end									  					  always@(posedge clk)				  	begin: MONITOR				  	case(test)				  		1:  begin				  		   				  		    				  		         case(cpu1.state)				  			      S0:				  			       ip_status				  			      S1:				  			    				  			        $strobe("%t        %s        %h        %h           %h ",				  			    	      $time, mnemonic, ip_status,addr,rddata);				  	            endcase				  	        end				  		    				  		2: begin					                            				                   case(cpu1.state)				  			          S0:				  			          ip_status				  			          S1:				  			          $strobe("%t        %s        %h        %h        %h",				  			    	      $time, mnemonic, ip_status,addr,rddata);				  		            endcase				  		   end 				                  				         				  		3:begin				  		   $display("\n***   RUNNING CPUtest3 - An Executable Program   ***");  				                   $display("*** This program should calculate the fibonacci  ***");				                   $display("\n    TIME      FIBONACCI NUMBER");				                   $display(  "  ---------   -----------------");				                    while (test == 3)				                      begin				                        wait (cpu1.opcode==3'b001)    // display Fib. No. at end of program loop				                        $strobe("%t     %d", $time,ram1.ram[10'h2]);				                        wait ( cpu1.opcode != 3'b001);				                      end				        end       				  		4:begin				  		   $display("\n***   RUNNING CPUtest4 - An Executable Program   ***");  				                   $display("*** This program should calculate the N  N2   SUM  ***");				                   $display("\n       TIME         N+1       N2       SUM ");				                   $display(  "     ---------      ---      ----     -----");				                    while (test == 4)				                      begin 				                        wait  ({cpu1.opcode,cpu1.opaddr} == 16'b100_11000_0000_0110)  				                        $strobe("%t     %d     %d      %d", $time,ram1.ram[10'h2],ram1.ram[10'h3],ram1.ram[10'h1]);				                        wait ({cpu1.opcode,cpu1.opaddr} != 16'b100_11000_0000_0110);				                      end				         end       				  		  				  						  						  	endcase					    end								  				  initial				    begin				    	clk=1;				    	mnemonic=0;				    	ip_status=0;  					    	$timeformat(-9,1,"ns",12);				    	display_debug_message;				    	sys_reset;				    	test1;				    	$stop;				    	test2;				    	$stop;				    	test3;				    	$stop;				    	test4;				    	$stop;				    	test5;				    	$stop;				    end					  				  task display_debug_message;				    begin				    	$display("\n*************************************************");				    	$display("**The following debug task are avilable:**");				    	$display("* \"test1; \" to load the 1st diagnostic program. *");				        $display("*  \"test2; \" to load the 2nd diagnostic program. *");				        $display("*  \"test3; \" to load the Fibonacci program.      *");				        $display("*  \"test4; \" to load the 自然数平方和 program.      *");				        $display("*  \"test5; \" to load the 加解密 program.      *");				        $display("*****************************************************\n");				    end				  endtask				  				  task test1;				    begin				      test = 0;				      disable MONITOR;				      $readmemb("test1.pro", rom1.memory);				      $display("Rom loading successfully!");				      $readmemb("test1.dat", ram1.ram);				      $display("Ram loading successfully!");				                    $display("\n*** RUNNING CPUtest1 - The Basic CPU Diagnostic Program ***");				                    $display("\n     TIME         INSTR       PC      ADDR         DATA  ");				                    $display("    ----------      ----     -----     -----       ----- ");				      #20;				      test = 1;				      #7400;				      sys_reset;				    end				  endtask				  				  task test2;				    begin				      test = 0;				      disable MONITOR;				      $readmemb("test2.pro", rom1.memory);				      $display("Rom loading successfully!");				      $readmemb("test2.dat", ram1.ram);				      $display("Ram loading successfully!");				                   $display("\n*** RUNNING CPUtest2 - The Advanced CPU Diagnostic Program ***");				                   $display("\n     TIME       INSTR        PC         ADDR     DATA  ");				                   $display("   ----------      ---        -----       -----    ---- ");				      //#1;				      test = 2;				      #5800;				      sys_reset;				    end				  endtask				  				  task test3;				    begin				      test = 0;				      disable MONITOR;				      $readmemb("test3.pro", rom1.memory);				      $display("Rom loading successfully!");				      $readmemb("test3.dat", ram1.ram);				      $display("Ram loading successfully!");				      //#1;				      test = 3;				      #76000;				      sys_reset;				    end				  endtask  				 task test4;				    begin				      test = 0;				      disable MONITOR;				      $readmemb("test4.pro", rom1.memory);				      $display("Rom loading successfully!");				      $readmemb("test4.dat", ram1.ram);				      $display("Ram loading successfully!");				      //#1;				      test = 4;				      #4238000;				      				      sys_reset;				    end				  endtask  				  task test5;				    begin				      test = 0;				      disable MONITOR;				      $readmemb("test5.pro", rom1.memory);				      $display("Rom loading successfully!");				      $readmemb("test5.dat", ram1.ram);				      $display("Ram loading successfully!");				      //#1;				      test = 5;				      #3800000;				      $display("\n***   RUNNING CPUtest5 - An Executable Program   ***");  				      $display("*** 这个程序将一块随机数据加密后再解密  计算完毕统一显示如下:  ***");				      $display("        No           原始数据         加密数据          解密数据   ");				      $display("-------------------------------------------------------------------");  				      for (i=0;i				      $display("     %d          %d              %d             %d   ",				      i+1,ram1.ram[16'h60+i],ram1.ram[16'h80+i],ram1.ram[16'ha0+i]);				      sys_reset;				    end				  endtask  				  task sys_reset;				    begin				      reset_n = 1;				      #70;				      reset_n = 0; 				      #150;				      reset_n = 1;  				    end				  endtask 				  				  CPU cpu1(.clk(clk),				          .reset_n(reset_n),				          .rddata(rddata),				          .wr(wr),				          .rd(rd),				          .halt(halt),				          .addr(addr)				          );				  				  decoder decoder1(.addr(addr),				                  .rom_sel(rom1_sel),				                  .ram_sel(ram1_sel)				                  );				                  								  rom rom1( .ena(rom1_sel),					         .read(rd),					         .addr(addr[10:0]),					         .data(rddata[15:0])					         );				  				  ram ram1( .ena(ram1_sel),					         .write(wr),					         .read(rd),					         .addr(addr[9:0]),					         .data(rddata[15:0])					          );				endmodule			

相关资源