diff --git a/hdl/verif/tb_sha256_message_build.sv b/hdl/verif/tb_sha256_message_build.sv index 60dbbc8a28a5c9424b39f6533164e041e02a60bd..7755fceaf9b7d25600391d9e65d72e7997d57cbc 100644 --- a/hdl/verif/tb_sha256_message_build.sv +++ b/hdl/verif/tb_sha256_message_build.sv @@ -81,15 +81,27 @@ module tb_sha256_message_build; 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 @@ -107,16 +119,28 @@ module tb_sha256_message_build; 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,6 +153,8 @@ module tb_sha256_message_build; logic [511:0] data_out_check; logic data_out_last_check; + int data_in_gap; + int cfg_gap; int data_out_stall; int packet_num; @@ -145,9 +171,13 @@ module tb_sha256_message_build; // 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 - data_out_ready <= 1'b0; // Keep Ready Asserted until handshake seen end else begin data_out_ready <= 1'b1; diff --git a/model/py/hash_model.py b/model/py/hash_model.py index 5bb0fc49f3e0ed8bb5b0072c0b55aa64eeed8da3..85397c3afb8bf50e915107ba32c6a3fd4e9cd6b2 100644 --- a/model/py/hash_model.py +++ b/model/py/hash_model.py @@ -48,8 +48,15 @@ def main(): # Generate Gapping and Stalling Values # Gapping - Period to wait before taking Input Valid High # Stalling - Period to wait before taking Output Read High - cfg_words_gap_list.append(random.randrange(0,gap_limit)) - hash_stall_list.append(random.randrange(0,stall_limit)) + if gap_limit > 0: + cfg_words_gap_list.append(random.randrange(0,gap_limit)) + else: + cfg_words_gap_list.append(0) + + if stall_limit > 0: + hash_stall_list.append(random.randrange(0,stall_limit)) + else: + hash_stall_list.append(0) # Generate expected output in 512 bit chunks cfg_size = math.ceil(random.randint(0,pow(2,14))/8)*8 @@ -87,13 +94,22 @@ def main(): for i in range(len(in_data_words)): in_data_words_last.append("0") - in_data_words_gap.append(random.randrange(0,gap_limit)) + if gap_limit > 0: + in_data_words_gap.append(random.randrange(0,gap_limit)) + else: + in_data_words_gap.append(0) in_data_words_last[-1] = "1" for i in range(len(message_block)): message_block_last.append("0") - message_block_stall.append(random.randrange(0,stall_limit)) - message_block_gap.append(random.randrange(0,gap_limit)) + if stall_limit > 0: + message_block_stall.append(random.randrange(0,stall_limit)) + else: + message_block_stall.append(0) + if gap_limit > 0: + message_block_gap.append(random.randrange(0,gap_limit)) + else: + message_block_gap.append(0) message_block_last[-1] = "1" cfg_words_list.append(cfg_size_str)