forked from Github_Repos/cvw
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Systemverilog
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Systemverilog
		
	
	
	
	
	
///////////////////////////////////////////
 | 
						|
// sd_top_tb.sv
 | 
						|
//
 | 
						|
// Written: Ross Thompson September 20, 2021
 | 
						|
// Modified: 
 | 
						|
//
 | 
						|
// A component of the Wally configurable RISC-V project.
 | 
						|
// 
 | 
						|
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
 | 
						|
//
 | 
						|
// MIT LICENSE
 | 
						|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this 
 | 
						|
// software and associated documentation files (the "Software"), to deal in the Software 
 | 
						|
// without restriction, including without limitation the rights to use, copy, modify, merge, 
 | 
						|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 
 | 
						|
// to whom the Software is furnished to do so, subject to the following conditions:
 | 
						|
//
 | 
						|
//   The above copyright notice and this permission notice shall be included in all copies or 
 | 
						|
//   substantial portions of the Software.
 | 
						|
//
 | 
						|
//   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 | 
						|
//   INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
 | 
						|
//   PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
 | 
						|
//   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
 | 
						|
//   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
 | 
						|
//   OR OTHER DEALINGS IN THE SOFTWARE.
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
`include "wally-config.vh"
 | 
						|
 | 
						|
 | 
						|
module sd_top_tb();
 | 
						|
 | 
						|
 | 
						|
  localparam g_COUNT_WIDTH = 8;
 | 
						|
 | 
						|
  logic a_RST;
 | 
						|
  logic i_SD_CMD;
 | 
						|
  logic o_SD_CMD;
 | 
						|
  logic o_SD_CMD_OE;
 | 
						|
  wire [3:0] i_SD_DAT;
 | 
						|
  logic o_SD_CLK;
 | 
						|
  logic [32:9] i_BLOCK_ADDR;
 | 
						|
  logic [g_COUNT_WIDTH-1:0] i_COUNT_IN_MAX;
 | 
						|
 | 
						|
  logic o_READY_FOR_READ;
 | 
						|
  logic i_READ_REQUEST;
 | 
						|
  logic [3:0] o_DATA_TO_CORE;
 | 
						|
  logic o_DATA_VALID;
 | 
						|
  logic o_LAST_NIBBLE;
 | 
						|
  logic [4095:0] ReadData;
 | 
						|
  logic o_SD_RESTARTING;
 | 
						|
  logic [2:0] o_ERROR_CODE_Q;
 | 
						|
  logic o_FATAL_ERROR;
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  // Driver
 | 
						|
  wire PAD;
 | 
						|
 | 
						|
  logic r_CLK;
 | 
						|
  
 | 
						|
 | 
						|
  // clock
 | 
						|
  
 | 
						|
  sd_top #(g_COUNT_WIDTH) DUT
 | 
						|
    (.CLK(r_CLK),
 | 
						|
    .a_RST(a_RST),
 | 
						|
    .i_SD_CMD(i_SD_CMD),
 | 
						|
    .o_SD_CMD(o_SD_CMD),
 | 
						|
    .o_SD_CMD_OE(o_SD_CMD_OE),
 | 
						|
    .i_SD_DAT(i_SD_DAT),
 | 
						|
    .o_SD_CLK(o_SD_CLK),
 | 
						|
    .i_BLOCK_ADDR(i_BLOCK_ADDR),
 | 
						|
    .o_READY_FOR_READ(o_READY_FOR_READ),
 | 
						|
     .o_SD_RESTARTING(o_SD_RESTARTING),
 | 
						|
     .o_ERROR_CODE_Q(o_ERROR_CODE_Q),
 | 
						|
     .o_FATAL_ERROR(o_FATAL_ERROR),
 | 
						|
    .i_READ_REQUEST(i_READ_REQUEST),
 | 
						|
    .o_DATA_TO_CORE(o_DATA_TO_CORE),
 | 
						|
    .ReadData(ReadData),     
 | 
						|
    .o_DATA_VALID(o_DATA_VALID),
 | 
						|
    .o_LAST_NIBBLE(o_LAST_NIBBLE),
 | 
						|
    .i_COUNT_IN_MAX(i_COUNT_IN_MAX),
 | 
						|
     .LIMIT_SD_TIMERS(1'b1));
 | 
						|
 | 
						|
  sdModel sdcard
 | 
						|
    (.sdClk(o_SD_CLK),
 | 
						|
    .cmd(PAD), 
 | 
						|
    .dat(i_SD_DAT));
 | 
						|
  
 | 
						|
  // tri state pad
 | 
						|
  // replace with I/O standard cell or FPGA gate.
 | 
						|
  assign PAD = o_SD_CMD_OE ? o_SD_CMD : 1'bz;
 | 
						|
  assign i_SD_CMD = PAD;
 | 
						|
  
 | 
						|
 | 
						|
  always
 | 
						|
    begin
 | 
						|
      r_CLK = 1; # 5; r_CLK = 0; # 5;
 | 
						|
    end
 | 
						|
  
 | 
						|
 | 
						|
  initial $readmemh("ramdisk2.hex", sdcard.FLASHmem);
 | 
						|
  
 | 
						|
  initial begin
 | 
						|
 | 
						|
    a_RST          = 1'b0;
 | 
						|
    i_BLOCK_ADDR   = 24'h100000;
 | 
						|
    i_COUNT_IN_MAX = '0;
 | 
						|
    i_READ_REQUEST = 1'b0;
 | 
						|
 | 
						|
    # 5;
 | 
						|
    i_COUNT_IN_MAX = -62;
 | 
						|
 | 
						|
    # 10;
 | 
						|
    a_RST = 1'b1;
 | 
						|
 | 
						|
    # 4800;
 | 
						|
    
 | 
						|
    a_RST = 1'b0;
 | 
						|
 | 
						|
    # 2000000;
 | 
						|
    i_READ_REQUEST = 1'b0;
 | 
						|
    # 10000;
 | 
						|
    i_READ_REQUEST = 1'b1;
 | 
						|
    # 10000;
 | 
						|
    i_READ_REQUEST = 1'b0;
 | 
						|
    
 | 
						|
  end
 | 
						|
 | 
						|
endmodule
 |