aboutsummaryrefslogblamecommitdiff
path: root/src/rtl/coretest_hashes.v
blob: 567d4f7c344aa4e306b9fa2384d0e633346a33e2 (plain) (tree)
















































































































































































































































































                                                                        
//======================================================================
//
// coretest_hashes.v
// -----------------
// Top level wrapper that creates the Cryptech coretest system.
// The wrapper contains instances of the external interface and the
// cores to be tested, as well as address and data muxes.
//
//
// Authors: Joachim Strombergson, Paul Selkirk
// 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 coretest_hashes(
                       input wire          clk,
                       input wire          reset_n,

                       // External interface.
                       input wire          SCL,
                       input wire          SDA,
                       output wire         SDA_pd,

                       output wire [7 : 0] debug
                      );


  //----------------------------------------------------------------
  // Internal constant and parameter definitions.
  //----------------------------------------------------------------
  parameter I2C_SHA1_ADDR       = 7'h1e;
  parameter I2C_SHA256_ADDR     = 7'h1f;
  parameter I2C_SHA512_224_ADDR = 7'h20;
  parameter I2C_SHA512_256_ADDR = 7'h21;
  parameter I2C_SHA384_ADDR     = 7'h22;
  parameter I2C_SHA512_ADDR     = 7'h23;

  parameter MODE_SHA_512_224    = 2'h0;
  parameter MODE_SHA_512_256    = 2'h1;
  parameter MODE_SHA_384        = 2'h2;
  parameter MODE_SHA_512        = 2'h3;


  //----------------------------------------------------------------
  // Wires.
  //----------------------------------------------------------------
  // i2c connections
  wire          i2c_rxd_syn;
  wire [7 : 0]  i2c_rxd_data;
  reg           i2c_rxd_ack;
  reg           i2c_txd_syn;
  reg  [7 : 0]  i2c_txd_data;
  wire          i2c_txd_ack;
  wire [6 : 0]  i2c_device_addr;

  // sha1 connections.
  reg           sha1_rxd_syn;
  reg  [7 : 0]  sha1_rxd_data;
  wire          sha1_rxd_ack;
  wire          sha1_txd_syn;
  wire [7 : 0]  sha1_txd_data;
  reg           sha1_txd_ack;

  // sha256 connections.
  reg           sha256_rxd_syn;
  reg  [7 : 0]  sha256_rxd_data;
  wire          sha256_rxd_ack;
  wire          sha256_txd_syn;
  wire [7 : 0]  sha256_txd_data;
  reg           sha256_txd_ack;

  // sha512 connections.
  reg  [1 : 0]  sha512_mode;
  reg           sha512_rxd_syn;
  reg  [7 : 0]  sha512_rxd_data;
  wire          sha512_rxd_ack;
  wire          sha512_txd_syn;
  wire [7 : 0]  sha512_txd_data;
  reg           sha512_txd_ack;


  //----------------------------------------------------------------
  // Core instantiations.
  //----------------------------------------------------------------
  i2c_core i2c(
               .clk(clk),
               .reset(!reset_n), // active high

               .SCL(SCL),
               .SDA(SDA),
               .SDA_pd(SDA_pd),
               .i2c_addr_low(I2C_SHA1_ADDR),
               .i2c_addr_high(I2C_SHA512_ADDR),
               .i2c_device_addr(i2c_device_addr),

               .rxd_syn(i2c_rxd_syn),
               .rxd_data(i2c_rxd_data),
               .rxd_ack(i2c_rxd_ack),

               .txd_syn(i2c_txd_syn),
               .txd_data(i2c_txd_data),
               .txd_ack(i2c_txd_ack)
               );

  sha1 sha1(
            .clk(clk),
            .reset_n(reset_n),

            .rx_syn(sha1_rxd_syn),
            .rx_data(sha1_rxd_data),
            .rx_ack(sha1_rxd_ack),

            .tx_syn(sha1_txd_syn),
            .tx_data(sha1_txd_data),
            .tx_ack(sha1_txd_ack)
           );

  sha256 sha256(
                .clk(clk),
                .reset_n(reset_n),

                .rx_syn(sha256_rxd_syn),
                .rx_data(sha256_rxd_data),
                .rx_ack(sha256_rxd_ack),

                .tx_syn(sha256_txd_syn),
                .tx_data(sha256_txd_data),
                .tx_ack(sha256_txd_ack)
                );

  sha512 sha512(
                .clk(clk),
                .reset_n(reset_n),

                .mode(sha512_mode),

                .rx_syn(sha512_rxd_syn),
                .rx_data(sha512_rxd_data),
                .rx_ack(sha512_rxd_ack),

                .tx_syn(sha512_txd_syn),
                .tx_data(sha512_txd_data),
                .tx_ack(sha512_txd_ack)
                );

  //----------------------------------------------------------------
  // address_mux
  //
  // Combinational data mux that handles addressing between
  // cores using the I2C device address.
  //----------------------------------------------------------------
  always @*
    begin : address_mux
      // Default assignments.
      i2c_rxd_ack     = 0;
      i2c_txd_syn     = 0;
      i2c_txd_data    = 8'h00;

      sha1_rxd_syn    = 0;
      sha1_rxd_data   = 8'h00;
      sha1_txd_ack    = 0;

      sha256_rxd_syn  = 0;
      sha256_rxd_data = 8'h00;
      sha256_txd_ack  = 0;

      sha512_rxd_syn  = 0;
      sha512_rxd_data = 8'h00;
      sha512_txd_ack  = 0;
      sha512_mode     = 2'b00;

      case (i2c_device_addr)
        I2C_SHA1_ADDR:
          begin
            sha1_rxd_syn    = i2c_rxd_syn;
            sha1_rxd_data   = i2c_rxd_data;
            i2c_rxd_ack     = sha1_rxd_ack;
            i2c_txd_syn     = sha1_txd_syn;
            i2c_txd_data    = sha1_txd_data;
            sha1_txd_ack    = i2c_txd_ack;
          end

        I2C_SHA256_ADDR:
          begin
            sha256_rxd_syn  = i2c_rxd_syn;
            sha256_rxd_data = i2c_rxd_data;
            i2c_rxd_ack     = sha256_rxd_ack;
            i2c_txd_syn     = sha256_txd_syn;
            i2c_txd_data    = sha256_txd_data;
            sha256_txd_ack  = i2c_txd_ack;
          end

        I2C_SHA512_224_ADDR:
          begin
            sha512_rxd_syn  = i2c_rxd_syn;
            sha512_rxd_data = i2c_rxd_data;
            i2c_rxd_ack     = sha512_rxd_ack;
            i2c_txd_syn     = sha512_txd_syn;
            i2c_txd_data    = sha512_txd_data;
            sha512_txd_ack  = i2c_txd_ack;
            sha512_mode     = MODE_SHA_512_224;
          end

        I2C_SHA512_256_ADDR:
          begin
            sha512_rxd_syn  = i2c_rxd_syn;
            sha512_rxd_data = i2c_rxd_data;
            i2c_rxd_ack     = sha512_rxd_ack;
            i2c_txd_syn     = sha512_txd_syn;
            i2c_txd_data    = sha512_txd_data;
            sha512_txd_ack  = i2c_txd_ack;
            sha512_mode     = MODE_SHA_512_256;
          end

        I2C_SHA384_ADDR:
          begin
            sha512_rxd_syn  = i2c_rxd_syn;
            sha512_rxd_data = i2c_rxd_data;
            i2c_rxd_ack     = sha512_rxd_ack;
            i2c_txd_syn     = sha512_txd_syn;
            i2c_txd_data    = sha512_txd_data;
            sha512_txd_ack  = i2c_txd_ack;
            sha512_mode     = MODE_SHA_384;
          end

        I2C_SHA512_ADDR:
          begin
            sha512_rxd_syn  = i2c_rxd_syn;
            sha512_rxd_data = i2c_rxd_data;
            i2c_rxd_ack     = sha512_rxd_ack;
            i2c_txd_syn     = sha512_txd_syn;
            i2c_txd_data    = sha512_txd_data;
            sha512_txd_ack  = i2c_txd_ack;
            sha512_mode     = MODE_SHA_512;
          end

        default:
          begin
          end
      endcase // case (i2c_device_addr)
    end // address_mux

endmodule // coretest_hashes

//======================================================================
// EOF coretest_hashes.v
//======================================================================