From d3667769d247231a4caf1895711a57bbaefc6035 Mon Sep 17 00:00:00 2001
From: Luke Wren <wren6991@gmail.com>
Date: Sat, 8 Oct 2022 16:50:58 +0100
Subject: [PATCH] Arrange for address buses to be 0 when processor is held in
 reset

---
 hdl/hazard3_decode.v   | 25 ++++++++++++++-----------
 hdl/hazard3_frontend.v | 14 +++++++-------
 2 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/hdl/hazard3_decode.v b/hdl/hazard3_decode.v
index 0eae47f..5b4cec5 100644
--- a/hdl/hazard3_decode.v
+++ b/hdl/hazard3_decode.v
@@ -348,17 +348,20 @@ always @ (*) begin
 	endcase
 
 	if (d_invalid || d_starved || d_except_instr_bus_fault || partial_predicted_branch) begin
-		d_rs1           = {W_REGADDR{1'b0}};
-		d_rs2           = {W_REGADDR{1'b0}};
-		d_rd            = {W_REGADDR{1'b0}};
-		d_memop         = MEMOP_NONE;
-		d_branchcond    = BCOND_NEVER;
-		d_csr_ren       = 1'b0;
-		d_csr_wen       = 1'b0;
-		d_except        = EXCEPT_NONE;
-		d_sleep_wfi     = 1'b0;
-		d_sleep_block   = 1'b0;
-		d_sleep_unblock = 1'b0;
+		d_rs1             = {W_REGADDR{1'b0}};
+		d_rs2             = {W_REGADDR{1'b0}};
+		d_rd              = {W_REGADDR{1'b0}};
+		d_memop           = MEMOP_NONE;
+		d_branchcond      = BCOND_NEVER;
+		d_csr_ren         = 1'b0;
+		d_csr_wen         = 1'b0;
+		d_except          = EXCEPT_NONE;
+		d_sleep_wfi       = 1'b0;
+		d_sleep_block     = 1'b0;
+		d_sleep_unblock   = 1'b0;
+		// Ensure address bus is 0 in reset if register file is resettable:
+		d_addr_is_regoffs = 1'b1;
+
 		if (EXTENSION_M)
 			d_aluop = ALUOP_ADD;
 
diff --git a/hdl/hazard3_frontend.v b/hdl/hazard3_frontend.v
index ba6ce35..5372830 100644
--- a/hdl/hazard3_frontend.v
+++ b/hdl/hazard3_frontend.v
@@ -311,14 +311,14 @@ always @ (*) begin
 	mem_priv_r = fetch_priv;
 	mem_addr_vld_r = 1'b1;
 	case (1'b1)
-		mem_addr_hold               : begin mem_addr_r = fetch_addr; end
-		jump_target_vld             : begin
-		                                    mem_addr_r = {jump_target[W_ADDR-1:2], 2'b00};
-		                                    mem_priv_r = jump_priv || !U_MODE;
+		mem_addr_hold                    : begin mem_addr_r = fetch_addr; end
+		jump_target_vld || reset_holdoff : begin
+		                                         mem_addr_r = {jump_target[W_ADDR-1:2], 2'b00};
+		                                         mem_priv_r = jump_priv || !U_MODE;
 		end
-		DEBUG_SUPPORT && debug_mode : begin mem_addr_vld_r = 1'b0; end
-		!fetch_stall                : begin mem_addr_r = fetch_addr; end
-		default                     : begin mem_addr_vld_r = 1'b0; end
+		DEBUG_SUPPORT && debug_mode      : begin mem_addr_vld_r = 1'b0; end
+		!fetch_stall                     : begin mem_addr_r = fetch_addr; end
+		default                          : begin mem_addr_vld_r = 1'b0; end
 	endcase
 end