diff --git a/.gitmodules b/.gitmodules index 85fb57afa1284abf83b913add0ae9423289d5dda..a565e9c361c9ae7b80ba9d4df355a5ae62f723e4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "sha-2-accelerator"] - path = sha-2-accelerator - url = git@git.soton.ac.uk:soclabs/sha-2-accelerator.git [submodule "accelerator-wrapper"] path = accelerator-wrapper url = git@git.soton.ac.uk:soclabs/accelerator-wrapper.git @@ -13,3 +10,6 @@ [submodule "CHIPKIT"] path = CHIPKIT url = git@git.soton.ac.uk:soclabs/CHIPKIT.git +[submodule "secworks-sha256"] + path = secworks-sha256 + url = git@git.soton.ac.uk:soclabs/secworks-sha256.git diff --git a/engine.flist b/engine.flist new file mode 100644 index 0000000000000000000000000000000000000000..53f50b25c75c6e141a907f9a57d5eb0a91f375d3 --- /dev/null +++ b/engine.flist @@ -0,0 +1,29 @@ +//----------------------------------------------------------------------------- +// Accelerator Engine Filelist +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Verilog Command File for Top-level Accelerator Wrapper +//----------------------------------------------------------------------------- + +// ============= Verilog library extensions =========== ++libext+.v+.vlib + +// ============= Accelerator Module search path ============= +-y $(ACC_ENGINE_DIR)/src/rtl/ +-y $(ACC_ENGINE_DIR)/src/interfaces/stream/rtl/ ++incdir+$(ACC_ENGINE_DIR)/src/rtl ++incdir+$(ACC_ENGINE_DIR)/src/interfaces/stream/rtl + +$(ACC_ENGINE_DIR)/src/rtl/sha256.v +$(ACC_ENGINE_DIR)/src/rtl/sha256_core.v +$(ACC_ENGINE_DIR)/src/rtl/sha256_k_constants.v +$(ACC_ENGINE_DIR)/src/rtl/sha256_w_mem.v + +$(ACC_ENGINE_DIR)/src/interfaces/stream/rtl/sha256_stream.v diff --git a/engine/set_env.sh b/engine/set_env.sh new file mode 100755 index 0000000000000000000000000000000000000000..1d911c6a74d52d2b1a76237a76fba6cc702d1565 --- /dev/null +++ b/engine/set_env.sh @@ -0,0 +1,50 @@ +#----------------------------------------------------------------------------- +# SoC Labs Environment Setup Script +# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +# +# Contributors +# +# David Mapstone (d.a.mapstone@soton.ac.uk) +# +# Copyright 2023, SoC Labs (www.soclabs.org) +#----------------------------------------------------------------------------- +#!/bin/bash + +# Get Root Location of Design Structure +if [ -z $DESIGN_ROOT ]; then + # If $DESIGN_ROOT hasn't been set yet + DESIGN_ROOT=`git rev-parse --show-superproject-working-tree` + + if [ -z $DESIGN_ROOT ]; then + # If not in a submodule - at root + DESIGN_ROOT=`git rev-parse --show-toplevel` + fi + + # Source Top-Level Sourceme + source $DESIGN_ROOT/set_env.sh +else + # Set Environment Variable for this Repository + export ACC_ENGINE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" + + # If this Repo is root of workspace + if [ $ACC_ENGINE_DIR = $DESIGN_ROOT ]; then + echo "Design Workspace: $DESIGN_ROOT" + export DESIGN_ROOT + # Set Default Simulator + export SIMULATOR="ivlog" + fi + + # Source environment variables for all submodules + for d in $ACC_ENGINE_DIR/* ; do + if [ -e "$d/.git" ]; then + if [ -f "$d/set_env.sh" ]; then + # If .git file exists - submodule + source $d/set_env.sh + fi + fi + done + + # Add Scripts to Path + export PATH="$PATH:/$ACC_ENGINE_DIR/flow" +fi + diff --git a/sha-2-accelerator b/sha-2-accelerator deleted file mode 160000 index 9e2febd604e16500e40cd71ab10d06675b2bfd93..0000000000000000000000000000000000000000 --- a/sha-2-accelerator +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9e2febd604e16500e40cd71ab10d06675b2bfd93 diff --git a/wrapper/src/wrapper_secworks_sha256.sv b/wrapper/src/wrapper_secworks_sha256.sv new file mode 100644 index 0000000000000000000000000000000000000000..aaf27cbf4df097b7e07631f3f3ae27eca7f1fa6b --- /dev/null +++ b/wrapper/src/wrapper_secworks_sha256.sv @@ -0,0 +1,330 @@ +//----------------------------------------------------------------------------- +// SoC Labs Basic Example Accelerator Wrapper +// A joint work commissioned on behalf of SoC Labs; under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright 2023; SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module wrapper_secworks_sha256 #( + parameter AHBADDRWIDTH=12, + parameter INPACKETWIDTH=512, + parameter CFGSIZEWIDTH=64, + parameter CFGSCHEMEWIDTH=2, + parameter OUTPACKETWIDTH=256 + ) ( + input logic HCLK, // Clock + input logic HRESETn, // Reset + + // AHB connection to Initiator + input logic HSELS, + input logic [AHBADDRWIDTH-1:0] HADDRS, + input logic [1:0] HTRANSS, + input logic [2:0] HSIZES, + input logic HWRITES, + input logic HREADYS, + input logic [31:0] HWDATAS, + + output logic HREADYOUTS, + output logic HRESPS, + output logic [31:0] HRDATAS, + + //TODO: Add APB Interface + + // Input Data Request Signal to DMAC + output logic in_data_req, + + // Output Data Request Signal to DMAC + output logic out_data_req + ); + + + //********************************************************** + // Internal AHB Parameters + //********************************************************** + + // Input Port Parameters + localparam [AHBADDRWIDTH-1:0] INPORTADDR = 'h000; + localparam INPORTAHBADDRWIDTH = AHBADDRWIDTH - 1; + + // Output Port Parameters + localparam [AHBADDRWIDTH-1:0] OUTPORTADDR = 'h800; + localparam OUTPORTAHBADDRWIDTH = AHBADDRWIDTH - 1; + + localparam OUTPACKETBYTEWIDTH = $clog2(OUTPACKETWIDTH/8); // Number of Bytes in Packet + localparam OUTPACKETSPACEWIDTH = OUTPORTAHBADDRWIDTH-OUTPACKETBYTEWIDTH; // Number of Bits to represent all Packets in Address Space + + //********************************************************** + // Wrapper AHB Components + //********************************************************** + + //---------------------------------------------------------- + // Internal AHB Decode Logic + //---------------------------------------------------------- + + // AHB Target 0 - Engine Input Port + logic hsel0; + logic hreadyout0; + logic hresp0; + logic [31:0] hrdata0; + + // AHB Target 1 - Engine Output Port + logic hsel1; + logic hreadyout1; + logic hresp1; + logic [31:0] hrdata1; + + // AHB Target 2 - Default Target + logic hsel2; + logic hreadyout2; + logic hresp2; + logic [31:0] hrdata2; + + // Internal AHB Address Assignment + assign hsel0 = ((HADDRS < OUTPORTADDR) && (HADDRS >= INPORTADDR)) ? 1'b1:1'b0; // Input Port Select + assign hsel1 = (HADDRS >= OUTPORTADDR) ? 1'b1:1'b0; // Output Port Select + assign hsel2 = (hsel0 | hsel1) ? 1'b0:1'b1; // Default Target Select + + // AHB Target Multiplexer + cmsdk_ahb_slave_mux #( + 1, //PORT0_ENABLE + 1, //PORT1_ENABLE + 1, //PORT2_ENABLE + 0, //PORT3_ENABLE + 0, //PORT4_ENABLE + 0, //PORT5_ENABLE + 0, //PORT6_ENABLE + 0, //PORT7_ENABLE + 0, //PORT8_ENABLE + 0 //PORT9_ENABLE + ) u_ahb_slave_mux ( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HREADY (HREADYS), + .HSEL0 (hsel0), // Input Port 0 + .HREADYOUT0 (hreadyout0), + .HRESP0 (hresp0), + .HRDATA0 (hrdata0), + .HSEL1 (hsel1), // Input Port 1 + .HREADYOUT1 (hreadyout1), + .HRESP1 (hresp1), + .HRDATA1 (hrdata1), + .HSEL2 (hsel2), // Input Port 2 + .HREADYOUT2 (hreadyout2), + .HRESP2 (hresp2), + .HRDATA2 (hrdata2), + .HSEL3 (1'b0), // Input Port 3 + .HREADYOUT3 (), + .HRESP3 (), + .HRDATA3 (), + .HSEL4 (1'b0), // Input Port 4 + .HREADYOUT4 (), + .HRESP4 (), + .HRDATA4 (), + .HSEL5 (1'b0), // Input Port 5 + .HREADYOUT5 (), + .HRESP5 (), + .HRDATA5 (), + .HSEL6 (1'b0), // Input Port 6 + .HREADYOUT6 (), + .HRESP6 (), + .HRDATA6 (), + .HSEL7 (1'b0), // Input Port 7 + .HREADYOUT7 (), + .HRESP7 (), + .HRDATA7 (), + .HSEL8 (1'b0), // Input Port 8 + .HREADYOUT8 (), + .HRESP8 (), + .HRDATA8 (), + .HSEL9 (1'b0), // Input Port 9 + .HREADYOUT9 (), + .HRESP9 (), + .HRDATA9 (), + + .HREADYOUT (HREADYOUTS), // Outputs + .HRESP (HRESPS), + .HRDATA (HRDATAS) + ); + + //---------------------------------------------------------- + // Input Port Logic + //---------------------------------------------------------- + + // Engine Input Port Wire declarations + logic [INPACKETWIDTH-1:0] in_packet; + logic in_packet_last; + logic in_packet_valid; + logic in_packet_ready; + + // Packet Constructor Instantiation + wrapper_ahb_packet_constructor #( + INPORTAHBADDRWIDTH, + INPACKETWIDTH + ) u_wrapper_data_input_port ( + .hclk (HCLK), + .hresetn (HRESETn), + + // Input slave port: 32 bit data bus interface + .hsels (hsel0), + .haddrs (HADDRS[AHBADDRWIDTH-2:0]), + .htranss (HTRANSS), + .hsizes (HSIZES), + .hwrites (HWRITES), + .hreadys (HREADYS), + .hwdatas (HWDATAS), + + .hreadyouts (hreadyout0), + .hresps (hresp0), + .hrdatas (hrdata0), + + // Valid/Ready Interface + .packet_data (in_packet), + .packet_data_last (in_packet_last), + .packet_data_valid (in_packet_valid), + .packet_data_ready (in_packet_ready), + + // Input Data Request + .data_req (in_data_req) + ); + + //---------------------------------------------------------- + // Configuration Port Logic + //---------------------------------------------------------- + + // Engine Configuration Port Wire declarations + logic [CFGSIZEWIDTH-1:0] cfg_size; + logic [CFGSCHEMEWIDTH-1:0] cfg_scheme; + logic cfg_last; + logic cfg_valid; + logic cfg_ready; + + // Engine Configuration Port Tied-off to fixed values + assign cfg_size = 64'd512; + assign cfg_scheme = 2'd0; + assign cfg_last = 1'b1; + assign cfg_valid = 1'b1; + + //---------------------------------------------------------- + // Output Port Logic + //---------------------------------------------------------- + + // Engine Output Port Wire declarations + logic [OUTPACKETWIDTH-1:0] out_packet; + logic out_packet_last; + logic [OUTPACKETSPACEWIDTH-1:0] out_packet_remain; + logic out_packet_valid; + logic out_packet_ready; + + // Relative Read Address for Start of Current Block + logic [OUTPORTAHBADDRWIDTH-1:0] block_read_addr; + + // Block Packets Remaining Tie-off (only ever one packet per block) + assign out_packet_remain = {OUTPACKETSPACEWIDTH{1'b0}}; + + // Packet Deconstructor Instantiation + wrapper_ahb_packet_deconstructor #( + OUTPORTAHBADDRWIDTH, + OUTPACKETWIDTH + ) u_wrapper_data_output_port ( + .hclk (HCLK), + .hresetn (HRESETn), + + // Input slave port: 32 bit data bus interface + .hsels (hsel1), + .haddrs (HADDRS[AHBADDRWIDTH-2:0]), + .htranss (HTRANSS), + .hsizes (HSIZES), + .hwrites (HWRITES), + .hreadys (HREADYS), + .hwdatas (HWDATAS), + + .hreadyouts (hreadyout1), + .hresps (hresp1), + .hrdatas (hrdata1), + + // Valid/Ready Interface + .packet_data (out_packet), + .packet_data_last (out_packet_last), + .packet_data_remain (out_packet_remain), + .packet_data_valid (out_packet_valid), + .packet_data_ready (out_packet_ready), + + // Input Data Request + .data_req (out_data_req), + + // Read Address Interface + .block_read_addr (block_read_addr) + ); + + //---------------------------------------------------------- + // Default AHB Target Logic + //---------------------------------------------------------- + + // AHB Default Target Instantiation + cmsdk_ahb_default_slave u_ahb_default_slave( + .HCLK (HCLK), + .HRESETn (HRESETn), + .HSEL (hsel2), + .HTRANS (HTRANSS), + .HREADY (HREADYS), + .HREADYOUT (hreadyout2), + .HRESP (hresp2) + ); + + // Default Targets Data is tied off + assign hrdata2 = {32{1'b0}}; + + //********************************************************** + // Wrapper APB Components + //********************************************************** + + // TODO: Instantiate APB Mux + + // TODO: Instantiate APB Default Target + + // TODO: Wrapper Register Blocks + + //********************************************************** + // Wrapper Interrupt Generation + //********************************************************** + + // TODO: Instantiate IRQ Generator + + //********************************************************** + // Wrapper DMA Data Request Generation + //********************************************************** + + // TODO: Write up data request logic through registers + + //********************************************************** + // Accelerator Engine + //********************************************************** + + //---------------------------------------------------------- + // Accelerator Engine Logic + //---------------------------------------------------------- + + // Hashing Accelerator Instatiation + sha256_stream u_sha256_stream ( + .clk (HCLK), + .nrst (HRESETn), + .mode (1'b1) + + // Data in Channel + .s_tdata_i (in_packet), + .s_tvalid_i (in_packet_valid), + .s_tready_o (in_packet_ready), + .s_tlast_i (in_packet_last), + + // Data Out Channel + .digest_o (out_packet), + .digest_valid_o (out_packet_valid) + ); + + assign out_packet_last = 1'b1; + +endmodule \ No newline at end of file