Fix bad handshake on bus error response (need to report both phases of response, to get clean exception entry

This commit is contained in:
Luke Wren 2021-07-17 19:26:45 +01:00
parent 8014239d47
commit d9300ee127
2 changed files with 8 additions and 2 deletions

View File

@ -231,8 +231,11 @@ assign core_aph_ready_i = ahblm_hready && bus_gnt_i;
assign core_dph_ready_i = ahblm_hready && bus_active_dph_i;
assign core_dph_err_i = ahblm_hready && bus_active_dph_i && ahblm_hresp;
// D-side errors are reported even when not ready, so that the core can make
// use of the two-phase error response to cleanly squash a second load/store
// chasing the faulting one down the pipeline.
assign core_aph_ready_d = ahblm_hready && bus_gnt_d;
assign core_dph_ready_d = ahblm_hready && bus_active_dph_d;
assign core_dph_err_d = ahblm_hready && bus_active_dph_d && ahblm_hresp;
assign core_dph_err_d = bus_active_dph_d && ahblm_hresp;
endmodule

View File

@ -199,9 +199,12 @@ always @ (posedge clk or negedge rst_n)
else if (d_hready)
dphase_active_d <= core_aph_req_d;
// D-side errors are reported even when not ready, so that the core can make
// use of the two-phase error response to cleanly squash a second load/store
// chasing the faulting one down the pipeline.
assign core_aph_ready_d = d_hready && core_aph_req_d;
assign core_dph_ready_d = d_hready && dphase_active_d;
assign core_dph_err_d = d_hready && dphase_active_d && d_hresp;
assign core_dph_err_d = dphase_active_d && d_hresp;
assign core_rdata_d = d_hrdata;
assign d_hwdata = core_wdata_d;