aboutsummaryrefslogblamecommitdiff
path: root/src/rtl/test_core.v
blob: 5b622c364b4a2f4e6abffca04d3db772e5f56bd7 (plain) (tree)




























































































































































































































                                                                        
//======================================================================
//
// test_core.v
// -----------
// A simple test core used during verification of the coretest test 
// module. The test core provies a few read and write registers
// that can be tested. Additionally it also provides an 8-bit data
// port directly connected to one of the internal registers.
//
//
// Author: Joachim Strombergson
// Copyright (c) 2014 SUNET
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or 
// without modification, are permitted provided that the following 
// conditions are met: 
// 
// 1. Redistributions of source code must retain the above copyright 
//    notice, this list of conditions and the following disclaimer. 
// 
// 2. Redistributions in binary form must reproduce the above copyright 
//    notice, this list of conditions and the following disclaimer in 
//    the documentation and/or other materials provided with the 
//    distribution. 
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
// COPYRIGHT OWNER 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.
//
//======================================================================

module test_core(
                 input wire           clk,
                 input wire           reset_n,
                 
                 input wire           cs,
                 input wire           we,
                 input wire [7 : 0]   address,
                 input wire [31 : 0]  write_data,
                 output wire [31 : 0] read_data,
                 output wire          error,

                 output wire [7 : 0]  debug
                );

  
  //----------------------------------------------------------------
  // Internal constant and parameter definitions.
  //----------------------------------------------------------------
  // Programming interface
  parameter ADDR_CORE_ID_0   = 8'h00;
  parameter ADDR_CORE_ID_1   = 8'h01;
  parameter ADDR_CORE_TYPE_0 = 8'h02;
  parameter ADDR_CORE_TYPE_1 = 8'h03;
  parameter ADDR_RW_REG      = 8'h10;
  parameter ADDR_DEBUG_REG   = 8'h20;

  parameter CORE_ID_0   = 32'h74657374; // "test"
  parameter CORE_ID_1   = 32'h636f7265; // "core"
  parameter CORE_TYPE_0 = 32'h30303030; // "00000"
  parameter CORE_TYPE_1 = 32'h30303162; // "001b"
  
  parameter RW_DEFAULT    = 32'h11223344;
  parameter DEBUG_DEFAULT = 8'h55;
  
  
  //----------------------------------------------------------------
  // Registers including update variables and write enable.
  //----------------------------------------------------------------
  reg [31 : 0] rw_reg;
  reg [31 : 0] rw_new;
  reg          rw_we;

  reg [7 : 0]  debug_reg;
  reg [7 : 0]  debug_new;
  reg          debug_we;
  
  
  
  //----------------------------------------------------------------
  // Wires.
  //----------------------------------------------------------------
  reg          tmp_error;
  reg [31 : 0] tmp_read_data;
  
  
  //----------------------------------------------------------------
  // Concurrent connectivity for ports etc.
  //----------------------------------------------------------------
  assign error     = tmp_error;
  assign read_data = tmp_read_data;
  assign debug     = debug_reg;
  
  
  //----------------------------------------------------------------
  // reg_update
  // Update functionality for all registers in the core.
  // All registers are positive edge triggered with synchronous
  // active low reset. All registers have write enable.
  //----------------------------------------------------------------
  always @ (posedge clk)
    begin: reg_update
      if (!reset_n)
        begin
          rw_reg    <= RW_DEFAULT;
          debug_reg <= DEBUG_DEFAULT;
        end
      else
        begin
          if (rw_we)
            begin
              rw_reg <= rw_new;
            end

          if (debug_we)
            begin
              debug_reg <= debug_new;
            end
        end
    end // reg_update

  
  //---------------------------------------------------------------
  // read_write_logic
  //
  // Read and write register logic.
  //---------------------------------------------------------------
  always @*
    begin: read_write_logic
      // Defafult assignments
      rw_new        = 32'h00000000;
      rw_we         = 0;
      debug_new     = 8'h00;
      debug_we      = 0;
      tmp_read_data = 32'h00000000;
      tmp_error     = 0;
      
      if (cs)
        begin
          if (we)
            begin
              // Write operations.
              case (address)
                ADDR_RW_REG:
                  begin
                    rw_new = write_data;
                    rw_we  = 1;
                  end

                ADDR_DEBUG_REG:
                  begin
                    debug_new = write_data[7 : 0];
                    debug_we  = 1;
                  end
                
                default:
                  begin
                    tmp_error = 1;
                  end
              endcase // case (address)
            end

          else
            begin
              // Read operations.
              case (address)
                ADDR_CORE_ID_0:
                  begin
                    tmp_read_data = CORE_ID_0;
                  end
                
                ADDR_CORE_ID_1:
                  begin
                    tmp_read_data = CORE_ID_1;
                  end

                ADDR_CORE_TYPE_0:
                  begin
                    tmp_read_data = CORE_TYPE_0;
                  end

                ADDR_CORE_TYPE_1:
                  begin
                    tmp_read_data = CORE_TYPE_1;
                  end

                ADDR_RW_REG:
                  begin
                    tmp_read_data = rw_reg;
                  end

                ADDR_DEBUG_REG:
                  begin
                    tmp_read_data = {24'h000000, debug_reg};
                  end

                default:
                  begin
                    tmp_error = 1;
                  end
              endcase // case (address)
            end
          
        end
    end // read_write_logic

endmodule // test_core

//======================================================================
// EOF test_core.v
//======================================================================