aboutsummaryrefslogtreecommitdiff
path: root/src/rtl/coretest_hashes.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtl/coretest_hashes.v')
-rw-r--r--src/rtl/coretest_hashes.v273
1 files changed, 273 insertions, 0 deletions
diff --git a/src/rtl/coretest_hashes.v b/src/rtl/coretest_hashes.v
new file mode 100644
index 0000000..567d4f7
--- /dev/null
+++ b/src/rtl/coretest_hashes.v
@@ -0,0 +1,273 @@
+//======================================================================
+//
+// 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
+//======================================================================