🐛 Fix problem with exception during AMO

This commit is contained in:
Florian Zaruba 2018-09-24 15:22:13 +02:00
parent 2923e1cb1e
commit 09c1469406
No known key found for this signature in database
GPG key ID: E742FFE8EC38A792
2 changed files with 7 additions and 6 deletions

View file

@ -33,6 +33,7 @@ module amo_buffer (
input logic no_st_pending_i // there is currently no store pending anymore
);
logic flush_amo_buffer;
logic amo_valid;
typedef struct packed {
ariane_pkg::amo_t op;
@ -44,7 +45,7 @@ module amo_buffer (
amo_op_t amo_data_in, amo_data_out;
// validate this request as soon as all stores have drained and the AMO is in the commit stage
assign amo_req_o.req = no_st_pending_i & amo_valid_commit_i;
assign amo_req_o.req = no_st_pending_i & amo_valid_commit_i & amo_valid;
assign amo_req_o.amo_op = amo_data_out.op;
assign amo_req_o.size = amo_data_out.size;
assign amo_req_o.operand_a = amo_data_out.paddr;
@ -69,7 +70,7 @@ module amo_buffer (
.rst_ni ( rst_ni ),
.flush_i ( flush_amo_buffer ),
.testmode_i ( 1'b0 ),
.full_o ( ), // not used as this FIFO has only a single element depth
.full_o ( amo_valid ),
.empty_o ( ready_o ),
.alm_full_o ( ), // left open
.alm_empty_o ( ), // left open

View file

@ -157,7 +157,7 @@ module commit_stage #(
// ------------------
// AMO
// ------------------
if (instr_0_is_amo) begin
if (instr_0_is_amo && !exception_o.valid) begin
// AMO finished
commit_ack_o[0] = amo_resp_i.ack;
// flush the pipeline
@ -226,15 +226,15 @@ module commit_stage #(
// ------------------------
// check for CSR interrupts (e.g.: normal interrupts which get triggered here)
// by putting interrupts here we give them precedence over any other exception
if (csr_exception_i.valid && csr_exception_i.cause[63]) begin
// Don't take the interrupt if we are committing an AMO.
if (csr_exception_i.valid && csr_exception_i.cause[63] && !amo_valid_commit_o) begin
exception_o = csr_exception_i;
exception_o.tval = commit_instr_i[0].ex.tval;
end
end
// Don't take any exceptions iff:
// - If we halted the processor
// - We are committing an AMO
if (halt_i || amo_valid_commit_o) begin
if (halt_i) begin
exception_o.valid = 1'b0;
end
end