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)