diff --git a/hdl/verif/tb_sha256_engine.sv b/hdl/verif/tb_sha256_engine.sv index 1104d32903f1d3886fb4888270165cdbdbb65544..165a3186d5114e89b74db64cba05876df48c480f 100644 --- a/hdl/verif/tb_sha256_engine.sv +++ b/hdl/verif/tb_sha256_engine.sv @@ -62,11 +62,13 @@ module tb_sha256_engine; logic [511:0] data_in_queue [$]; logic data_in_last_queue [$]; + int data_in_gap_queue [$]; logic data_in_wait_queue; logic [63:0] cfg_size_queue [$]; logic [1:0] cfg_scheme_queue [$]; logic cfg_last_queue [$]; + int cfg_gap_queue [$]; logic cfg_wait_queue; logic [511:0] message_block_queue [$]; @@ -75,6 +77,7 @@ module tb_sha256_engine; logic [255:0] data_out_queue [$]; logic data_out_last_queue [$]; + int data_out_stall_queue [$]; logic data_out_wait_queue; // Handle Valid and Data for data_in @@ -83,15 +86,27 @@ module tb_sha256_engine; data_in <= 512'd0; data_in_valid <= 1'b0; data_in_last <= 1'b0; + data_in_gap <= 0; data_in_wait_queue <= 1'b1; end else if (data_in_drive_en) begin + if (data_in_gap > 0) begin + data_in_gap <= data_in_gap -1; + data_in_valid <= 1'b0; + end else begin + data_in_valid <= 1'b1; + end 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 + if ((data_in_queue.size() > 0) && (data_in_last_queue.size() > 0) && (data_in_gap_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; + if (data_in_gap_queue[0] == 0) begin + data_in_valid <= 1'b1; + end else begin + data_in_valid <= 1'b0; + end + data_in_gap <= data_in_gap_queue.pop_front(); data_in_wait_queue <= 1'b0; end else begin // No data currently avaiable in queue to write but transfers up to date @@ -109,16 +124,28 @@ module tb_sha256_engine; cfg_scheme <= 2'd0; cfg_valid <= 1'b0; cfg_last <= 1'b0; + cfg_gap <= 0; cfg_wait_queue <= 1'b1; end else if (cfg_drive_en) begin + if (cfg_gap > 0) begin + cfg_gap <= cfg_gap -1; + cfg_valid <= 1'b0; + end else begin + cfg_valid <= 1'b1; + end 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 + if ((cfg_size_queue.size() > 0) && (cfg_scheme_queue.size() > 0 ) && (cfg_last_queue.size() > 0) && (cfg_gap_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; + if (cfg_gap_queue[0] == 0) begin + cfg_valid <= 1'b1; + end else begin + cfg_valid <= 1'b0; + end + cfg_gap <= cfg_gap_queue.pop_front(); cfg_wait_queue <= 1'b0; end else begin // No data currently avaiable in queue to write but transfers up to date @@ -129,29 +156,44 @@ module tb_sha256_engine; end end - logic [255:0] data_out_check; - logic data_out_last_check; - logic check_output; - logic test_end; - int packet_num; - logic [511:0] message_block_data_out_check; logic message_block_data_out_last_check; int message_block_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 + logic [255:0] data_out_check; + logic data_out_last_check; + int data_in_gap; + int cfg_gap; + int data_out_stall; + + int packet_num; + + // Handle Output Ready Signal Verification + always @(posedge clk) begin + // Check Override Control on Ready + if (data_out_drive_ready) begin + // Count down to zero before enabling Ready + if (data_out_stall > 0) begin + data_out_stall <= data_out_stall - 1; data_out_ready <= 1'b0; + end else begin + // Wait for handshake before updating stall value + if ((data_out_valid == 1'b1) && (data_out_ready == 1'b1)) begin + if (data_out_stall_queue.size() > 0) begin + if (data_out_stall_queue[0] == 0) begin + data_out_ready <= 1'b1; + end else begin + data_out_ready <= 1'b0; + end + data_out_stall <= data_out_stall_queue.pop_front(); + end + // Keep Ready Asserted until handshake seen + end else begin + data_out_ready <= 1'b1; + end end + end else begin + data_out_ready <= 1'b0; end end @@ -163,14 +205,14 @@ module tb_sha256_engine; $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); + if ($test$plusargs ("DEBUG")) $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 ($test$plusargs ("DEBUG")) $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_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; @@ -180,20 +222,21 @@ module tb_sha256_engine; $finish; end end + // Check Message Block Handshake if ((message_builder_out_data_valid == 1'b1) && (message_builder_out_data_ready == 1'b1)) begin assert (message_builder_out_data == message_block_data_out_check) else begin $error("message block missmatch! packet %d | recieve: %x != check: %x", message_block_packet_num, data_out, message_block_data_out_check); $finish; end - $display("message block match! packet %d | recieve: %x != check: %x", message_block_packet_num, message_builder_out_data, message_block_data_out_check); + if ($test$plusargs ("DEBUG")) $display("message block match! packet %d | recieve: %x != check: %x", message_block_packet_num, message_builder_out_data, message_block_data_out_check); assert (message_builder_out_data_last == message_block_data_out_last_check) else begin $error("message block last missmatch! packet %d | recieve: %x != check: %x", message_block_packet_num, message_builder_out_data_last, message_block_data_out_last_check); $finish; end - $display("message block last match! packet %d | recieve: %x != check: %x", message_block_packet_num, message_builder_out_data_last, message_block_data_out_last_check); + if ($test$plusargs ("DEBUG")) $display("message block last match! packet %d | recieve: %x != check: %x", message_block_packet_num, message_builder_out_data_last, message_block_data_out_last_check); if ((message_block_queue.size() > 0) && (message_block_last_queue.size() > 0)) begin - message_block_data_out_check <= message_block_queue.pop_front(); + message_block_data_out_check <= message_block_queue.pop_front(); message_block_data_out_last_check <= message_block_last_queue.pop_front(); if (message_block_data_out_last_check == 1'b1) begin message_block_packet_num <= message_block_packet_num + 1; @@ -207,16 +250,21 @@ module tb_sha256_engine; logic [511:0] input_data; // Temporary Input Data Storage logic input_data_last; // Temporary Input Data Last + int input_data_gap; // Temporary Input Gap 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; + int input_cfg_gap; // Temporary cfg gap; logic [255:0] output_data; // Temporary Output Data Storage logic output_data_last; // Temporary Output Data Last + int output_data_stall; // Temporary Output Stall + logic [511:0] message_block_data; // Temporary Message Block Data Storage logic message_block_data_last; // Temporary Message Block Data Last + int message_block_stall; // Dummy Variable to Read Stall Values into (goes unused other than file parsing) logic [511:0] message_builder_out_data; logic message_builder_out_data_last; @@ -229,60 +277,66 @@ module tb_sha256_engine; initial begin $dumpfile("sha256_engine.vcd"); $dumpvars(0, tb_sha256_engine); - // for (int i = 0; i < 16; i++) begin - // $dumpvars(0, tb_sha256_engine.uut.hash_calculator.M[i]); - // end - // for (int i = 0; i < 8; i++) begin - // $dumpvars(0, tb_sha256_engine.uut.hash_calculator.H[i]); - // $dumpvars(0, tb_sha256_engine.uut.hash_calculator.next_H[i]); - // end - // for (int i = 0; i < 64; i++) begin - // $dumpvars(0, tb_sha256_engine.uut.hash_calculator.W[i]); - // $dumpvars(0, tb_sha256_engine.uut.hash_calculator.next_W[i]); - // $dumpvars(0, tb_sha256_engine.uut.hash_calculator.ssig1_next_W[i]); - // end + if ($test$plusargs ("DEBUG")) begin + for (int i = 0; i < 16; i++) begin + $dumpvars(0, tb_sha256_engine.uut.hash_calculator.M[i]); + end + for (int i = 0; i < 8; i++) begin + $dumpvars(0, tb_sha256_engine.uut.hash_calculator.H[i]); + $dumpvars(0, tb_sha256_engine.uut.hash_calculator.next_H[i]); + end + for (int i = 0; i < 64; i++) begin + $dumpvars(0, tb_sha256_engine.uut.hash_calculator.W[i]); + $dumpvars(0, tb_sha256_engine.uut.hash_calculator.next_W[i]); + $dumpvars(0, tb_sha256_engine.uut.hash_calculator.ssig1_next_W[i]); + end + end 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 + while ($fscanf (fd, "%x,%b,%d", input_data, input_data_last, input_data_gap) == 3) begin data_in_queue.push_back(input_data); data_in_last_queue.push_back(input_data_last); + data_in_gap_queue.push_back(input_data_gap); 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 + while ($fscanf (fd, "%x,%x,%b,%d", input_cfg_size, input_cfg_scheme, input_cfg_last, input_cfg_gap) == 4) 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); + cfg_gap_queue.push_back(input_cfg_gap); end $fclose(fd); // Read output data into Queue fd = $fopen("../stimulus/testbench/output_hash_ref.csv", "r"); - while ($fscanf (fd, "%x,%b", output_data, output_data_last) == 2) begin + while ($fscanf (fd, "%x,%b,%d", output_data, output_data_last, output_data_stall) == 3) begin data_out_queue.push_back(output_data); data_out_last_queue.push_back(output_data_last); + data_out_stall_queue.push_back(output_data_stall); end $fclose(fd); // Read Message Block data into Queue - fd = $fopen("../stimulus/testbench/inout_message_block_stim_ref.csv", "r"); - while ($fscanf (fd, "%x,%b", message_block_data, message_block_data_last) == 2) begin + fd = $fopen("../stimulus/testbench/output_message_block_ref.csv", "r"); + while ($fscanf (fd, "%x,%b,%d", message_block_data, message_block_data_last, message_block_stall) == 3) begin message_block_queue.push_back(message_block_data); message_block_last_queue.push_back(message_block_data_last); end $fclose(fd); // Initialise First Checking Values - data_out_check = data_out_queue.pop_front(); + data_out_check = data_out_queue.pop_front(); data_out_last_check = data_out_last_queue.pop_front(); + data_out_stall = data_out_stall_queue.pop_front(); - message_block_data_out_check = message_block_queue.pop_front(); + message_block_data_out_check = message_block_queue.pop_front(); message_block_data_out_last_check = message_block_last_queue.pop_front(); // Enable Hash Compression diff --git a/hdl/verif/tb_sha256_message_build.sv b/hdl/verif/tb_sha256_message_build.sv index eadec31c943637eace6d8bf6c6174cd5a88825c9..dc950845e4b4b0d7ffc6114c8ff61c5001dcf741 100644 --- a/hdl/verif/tb_sha256_message_build.sv +++ b/hdl/verif/tb_sha256_message_build.sv @@ -111,7 +111,7 @@ module tb_sha256_message_build; end end end - + // Handle Valid and Data for cfg always_ff @(posedge clk, negedge nrst) begin: cfg_valid_drive if (!nrst) begin