diff --git a/hdl/src/sha256_engine.sv b/hdl/src/sha256_engine.sv index 0af840790bbc29bdd98e75f4ab8449b681e56f64..1984f3065a2187251f8db8cd1380fe8e7fef42da 100644 --- a/hdl/src/sha256_engine.sv +++ b/hdl/src/sha256_engine.sv @@ -8,6 +8,9 @@ // // Copyright 2022, SoC Labs (www.soclabs.org) //----------------------------------------------------------------------------- +`include "sha256_hash_compression.sv" +`include "sha256_message_build.sv" +`include "fifo_vr.sv" module sha256_engine ( // Clocking Signals @@ -96,7 +99,7 @@ module sha256_engine ( ); // Message Build (Construct Message Blocks) - message_build message_block_builder ( + sha256_message_build message_block_builder ( .clk (clk), .nrst (nrst), .en (en), @@ -117,7 +120,7 @@ module sha256_engine ( ); // Hash Compression (Peform Hash Calculation) - hash_compression hash_calculator ( + sha256_hash_compression hash_calculator ( .clk (clk), .nrst (nrst), .en (en), diff --git a/hdl/src/hash_compression.sv b/hdl/src/sha256_hash_compression.sv similarity index 98% rename from hdl/src/hash_compression.sv rename to hdl/src/sha256_hash_compression.sv index 7019f46e158836999a35b573a3bca3be9ae72ddb..50617fbde31cccbd7a75fbce00badeebb18b83fe 100644 --- a/hdl/src/hash_compression.sv +++ b/hdl/src/sha256_hash_compression.sv @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// SoC Labs Basic SHA-2 Hash Processing Module +// SoC Labs Basic SHA-256 Hash Processing Module // A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. // // Contributors @@ -8,10 +8,10 @@ // // Copyright 2022, SoC Labs (www.soclabs.org) //----------------------------------------------------------------------------- -`include "hashing_functions.sv" +`include "sha256_hashing_functions.sv" -module hash_compression ( +module sha256_hash_compression ( input logic clk, input logic nrst, input logic en, @@ -32,7 +32,7 @@ module hash_compression ( input logic data_out_ready ); - import hashing_functions::*; + import sha256_hashing_functions::*; // Message Chunks logic [31:0] M [15:0]; diff --git a/hdl/src/hashing_functions.sv b/hdl/src/sha256_hashing_functions.sv similarity index 95% rename from hdl/src/hashing_functions.sv rename to hdl/src/sha256_hashing_functions.sv index 242dbff571b19c09e8bb15350ef8eed0cdea02f7..640d792cb2f1de4ad441f917ce11d7bd7c7316ec 100644 --- a/hdl/src/hashing_functions.sv +++ b/hdl/src/sha256_hashing_functions.sv @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// SoC Labs Basic SHA-2 Engine function and constants SV Package +// SoC Labs Basic SHA-256 Engine function and constants SV Package // A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. // // Contributors @@ -9,7 +9,7 @@ // Copyright 2022, SoC Labs (www.soclabs.org) //----------------------------------------------------------------------------- -package hashing_functions; +package sha256_hashing_functions; parameter data_width = 32; // SHA-2 Functions diff --git a/hdl/src/message_build.sv b/hdl/src/sha256_message_build.sv similarity index 99% rename from hdl/src/message_build.sv rename to hdl/src/sha256_message_build.sv index fcc4ef9583f00992db8fd178f678716acae22bce..0cd35e2196991e15b29c421c3f35f2e209ac61fa 100644 --- a/hdl/src/message_build.sv +++ b/hdl/src/sha256_message_build.sv @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// SoC Labs Basic SHA-2 Message Builder Module +// SoC Labs Basic SHA-256 Message Builder Module // A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. // // Contributors @@ -8,7 +8,7 @@ // // Copyright 2022, SoC Labs (www.soclabs.org) //----------------------------------------------------------------------------- -module message_build ( +module sha256_message_build ( input logic clk, input logic nrst, input logic en, diff --git a/hdl/verif/tb_message_build.sv b/hdl/verif/tb_sha256_engine.sv similarity index 99% rename from hdl/verif/tb_message_build.sv rename to hdl/verif/tb_sha256_engine.sv index 3254c5d87b391250f5bad8ae54e8d218196e0eed..21ddd96723850a2191696425ebec7a0b4ca7445a 100644 --- a/hdl/verif/tb_message_build.sv +++ b/hdl/verif/tb_sha256_engine.sv @@ -9,9 +9,9 @@ // Copyright 2022, SoC Labs (www.soclabs.org) //----------------------------------------------------------------------------- `timescale 1ns/1ns -`include "message_build.sv" +`include "sha256_engine.sv" -module tb_message_build; +module tb_sha256_engine; logic clk; logic nrst; diff --git a/hdl/verif/tb_hash_compression.sv b/hdl/verif/tb_sha256_hash_compression.sv similarity index 92% rename from hdl/verif/tb_hash_compression.sv rename to hdl/verif/tb_sha256_hash_compression.sv index 52c2d4819abcde3e0f4f250bd0e7fc6199f5c256..1954d87d9a9b578d1b587aa367faeb170c657a98 100644 --- a/hdl/verif/tb_hash_compression.sv +++ b/hdl/verif/tb_sha256_hash_compression.sv @@ -9,9 +9,9 @@ // Copyright 2022, SoC Labs (www.soclabs.org) //----------------------------------------------------------------------------- `timescale 1ns/1ns -`include "hash_compression.sv" +`include "sha256_hash_compression.sv" -module tb_hash_compression; +module tb_sha256_hash_compression; logic clk; logic nrst; @@ -36,7 +36,7 @@ module tb_hash_compression; logic data_out_ready; logic data_out_last; - hash_compression uut ( + sha256_hash_compression uut ( .clk (clk), .nrst(nrst), .en (en), @@ -154,19 +154,19 @@ module tb_hash_compression; logic output_data_last; // Temporary Output Data Last initial begin - $dumpfile("hash_compression.vcd"); - $dumpvars(0, tb_hash_compression); + $dumpfile("sha256_hash_compression.vcd"); + $dumpvars(0, tb_sha256_hash_compression); for (int i = 0; i < 16; i++) begin - $dumpvars(0, tb_hash_compression.uut.M[i]); + $dumpvars(0, tb_sha256_hash_compression.uut.M[i]); end for (int i = 0; i < 8; i++) begin - $dumpvars(0, tb_hash_compression.uut.H[i]); - $dumpvars(0, tb_hash_compression.uut.next_H[i]); + $dumpvars(0, tb_sha256_hash_compression.uut.H[i]); + $dumpvars(0, tb_sha256_hash_compression.uut.next_H[i]); end for (int i = 0; i < 64; i++) begin - $dumpvars(0, tb_hash_compression.uut.W[i]); - $dumpvars(0, tb_hash_compression.uut.next_W[i]); - $dumpvars(0, tb_hash_compression.uut.ssig1_next_W[i]); + $dumpvars(0, tb_sha256_hash_compression.uut.W[i]); + $dumpvars(0, tb_sha256_hash_compression.uut.next_W[i]); + $dumpvars(0, tb_sha256_hash_compression.uut.ssig1_next_W[i]); end data_in_drive_en = 0; data_out_drive_ready = 0; diff --git a/hdl/verif/tb_sha256_message_build.sv b/hdl/verif/tb_sha256_message_build.sv new file mode 100644 index 0000000000000000000000000000000000000000..9f43ce68ac4c40e7571fd6ad6510badae7c01137 --- /dev/null +++ b/hdl/verif/tb_sha256_message_build.sv @@ -0,0 +1,249 @@ +//----------------------------------------------------------------------------- +// SoC Labs Basic SHA-2 Message Builder Testbench +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +`timescale 1ns/1ns +`include "sha256_message_build.sv" + +module tb_sha256_message_build; + + logic clk; + logic nrst; + logic en; + logic sync_rst; + // Data In data and Handshaking + logic [511:0] data_in; + logic data_in_last; + logic data_in_valid; + logic data_in_ready; + + // Config data and Handshaking + logic [63:0] cfg_size; + logic [1:0] cfg_scheme; + logic cfg_last; + logic cfg_valid; + logic cfg_ready; + + // Data Out data and Handshaking + logic [511:0] data_out; + logic data_out_valid; + logic data_out_ready; + logic data_out_last; + + sha256_message_build uut ( + .clk (clk), + .nrst(nrst), + .en (en), + .sync_rst(sync_rst), + .data_in(data_in), + .data_in_valid(data_in_valid), + .data_in_ready(data_in_ready), + .data_in_last(data_in_last), + .cfg_size(cfg_size), + .cfg_scheme(cfg_scheme), + .cfg_last(cfg_last), + .cfg_valid(cfg_valid), + .cfg_ready(cfg_ready), + .data_out(data_out), + .data_out_last(data_out_last), + .data_out_valid(data_out_valid), + .data_out_ready(data_out_ready)); + + logic data_in_drive_en; + logic cfg_drive_en; + logic data_out_drive_ready; + + logic [511:0] data_in_queue [$]; + logic data_in_last_queue [$]; + logic data_in_wait_queue; + + logic [63:0] cfg_size_queue [$]; + logic [1:0] cfg_scheme_queue [$]; + logic cfg_last_queue [$]; + logic cfg_wait_queue; + + logic [511:0] data_out_queue [$]; + logic data_out_last_queue [$]; + logic data_out_wait_queue; + + // Handle Valid and Data for data_in + always_ff @(posedge clk, negedge nrst) begin: data_in_valid_drive + if (!nrst) begin + data_in <= 512'd0; + data_in_valid <= 1'b0; + data_in_last <= 1'b0; + data_in_wait_queue <= 1'b1; + end else if (data_in_drive_en) begin + if (((data_in_valid == 1'b1) && (data_in_ready == 1'b1)) || + (data_in_wait_queue == 1'b1)) begin + // Data transfer just completed or transfers already up to date + if ((data_in_queue.size() > 0) && (data_in_last_queue.size() > 0)) begin + data_in <= data_in_queue.pop_front(); + data_in_last <= data_in_last_queue.pop_front(); + data_in_valid <= 1'b1; + data_in_wait_queue <= 1'b0; + end else begin + // No data currently avaiable in queue to write but transfers up to date + data_in_wait_queue <= 1'b1; + data_in_valid <= 1'b0; + end + end + end + end + + // Handle Valid and Data for cfg + always_ff @(posedge clk, negedge nrst) begin: cfg_valid_drive + if (!nrst) begin + cfg_size <= 64'd0; + cfg_scheme <= 2'd0; + cfg_valid <= 1'b0; + cfg_last <= 1'b0; + cfg_wait_queue <= 1'b1; + end else if (cfg_drive_en) begin + if (((cfg_valid == 1'b1) && (cfg_ready == 1'b1)) || + (cfg_wait_queue == 1'b1)) begin + // cfg transfer just completed or transfers already up to date + if ((cfg_size_queue.size() > 0) && (cfg_scheme_queue.size() > 0 ) && (cfg_last_queue.size() > 0)) begin + cfg_size <= cfg_size_queue.pop_front(); + cfg_scheme <= cfg_scheme_queue.pop_front(); + cfg_last <= cfg_last_queue.pop_front(); + cfg_valid <= 1'b1; + cfg_wait_queue <= 1'b0; + end else begin + // No data currently avaiable in queue to write but transfers up to date + cfg_wait_queue <= 1'b1; + cfg_valid <= 1'b0; + end + end + end + end + + logic [511:0] data_out_check; + logic data_out_last_check; + logic check_output; + logic test_end; + int packet_num; + + // Handle Output Ready Driving + always_ff @(posedge clk, negedge nrst) begin: data_out_recieve + if (!nrst) begin + data_out_ready <= 1'b0; + check_output <= 1'b0; + test_end <= 1'b0; + end else begin + // Synchronise Ready to Clock + if (data_out_drive_ready) begin + data_out_ready <= 1'b1; + end else begin + data_out_ready <= 1'b0; + end + end + end + + // Handle Output Data Verification + always @(posedge clk) begin + // Check Data on Handshake + if ((data_out_valid == 1'b1) && (data_out_ready == 1'b1)) begin + assert (data_out == data_out_check) else begin + $error("data_out missmatch! packet %d | recieve: %x != check: %x", packet_num, data_out, data_out_check); + $finish; + end + // $display("data_out match! packet %d | recieve: %x != check: %x", packet_num, data_out, data_out_check); + assert (data_out_last == data_out_last_check) else begin + $error("data_out_last missmatch! packet %d | recieve: %x != check: %x", packet_num, data_out_last, data_out_last_check); + $finish; + end + // $display("data_out_last match! packet %d | recieve: %x != check: %x", packet_num, data_out_last, data_out_last_check); + if ((data_out_queue.size() > 0) && (data_out_last_queue.size() > 0)) begin + data_out_check <= data_out_queue.pop_front(); + data_out_last_check <= data_out_last_queue.pop_front(); + if (data_out_last_check == 1'b1) begin + packet_num <= packet_num + 1; + end + end else begin + $display("Test Passes"); + $finish; + end + end + end + + // File Reading Variables + int fd; // File descriptor Handle + + logic [511:0] input_data; // Temporary Input Data Storage + logic input_data_last; // Temporary Input Data Last + + logic [63:0] input_cfg_size; // Temporary cfg size + logic [1:0] input_cfg_scheme; // Temporary cfg scheme + logic input_cfg_last; // Temporary cfg last; + + logic [511:0] output_data; // Temporary Output Data Storage + logic output_data_last; // Temporary Output Data Last + + initial begin + $dumpfile("sha256_message_build.vcd"); + $dumpvars(0, tb_sha256_message_build); + data_in_drive_en = 0; + cfg_drive_en = 0; + data_out_drive_ready = 0; + + // Read input data into Queue + fd = $fopen("../stimulus/testbench/input_data_stim.csv", "r"); + while ($fscanf (fd, "%x,%b", input_data, input_data_last) == 2) begin + data_in_queue.push_back(input_data); + data_in_last_queue.push_back(input_data_last); + end + $fclose(fd); + + // Read input cfg into Queue + fd = $fopen("../stimulus/testbench/input_cfg_stim.csv", "r"); + while ($fscanf (fd, "%x,%x,%b", input_cfg_size, input_cfg_scheme, input_cfg_last) == 3) begin + cfg_size_queue.push_back(input_cfg_size); + cfg_scheme_queue.push_back(input_cfg_scheme); + cfg_last_queue.push_back(input_cfg_last); + end + $fclose(fd); + + // Read output data into Queue + fd = $fopen("../stimulus/testbench/inout_message_block_stim_ref.csv", "r"); + while ($fscanf (fd, "%x,%b", output_data, output_data_last) == 2) begin + data_out_queue.push_back(output_data); + data_out_last_queue.push_back(output_data_last); + end + $fclose(fd); + + // Initialise First Checking Values + data_out_check = data_out_queue.pop_front(); + data_out_last_check = data_out_last_queue.pop_front(); + + // Defaultly enable Message Builder + en = 1; + + // Defaultly set Sync Reset Low + sync_rst = 0; + + #20 nrst = 1; + #20 nrst = 0; + #20 nrst = 1; + #20 data_in_drive_en = 1; + + // Write some data into the config register + # 30 cfg_drive_en = 1; + + # 30 data_out_drive_ready = 1; + end + + initial begin + forever begin + #10 clk = 0; + #10 clk = 1; + end + end + +endmodule \ No newline at end of file