Skip to content

Commit 02a7ed7

Browse files
committed
bus_ctrl: forward error to caches to hart
1 parent ce18a23 commit 02a7ed7

4 files changed

Lines changed: 18 additions & 9 deletions

File tree

source_code/caches/l1/l1_cache.sv

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ module l1_cache #(
139139
//Snooping signals
140140
logic[N_TAG_BITS-1:0] bus_frame_tag; //Tag from bus to compare
141141

142+
// error handling
143+
assign proc_gen_bus_if.error = bus_ctrl_if.derror[HART_ID];
144+
142145
assign snoop_decoded_addr = decoded_cache_addr_t'(bus_ctrl_if.ccsnoopaddr[HART_ID]);
143146

144147
// sram instance
@@ -543,7 +546,7 @@ module l1_cache #(
543546
next_state = FLUSH_CACHE;
544547
end
545548
FETCH: begin
546-
if (!bus_ctrl_if.dwait[HART_ID]) begin
549+
if (bus_ctrl_if.derror[HART_ID] || !bus_ctrl_if.dwait[HART_ID]) begin
547550
cache_miss = 1;
548551
next_state = HIT;
549552
end else if (snoop_hit && !sramWEN)
@@ -552,7 +555,7 @@ module l1_cache #(
552555
next_state = CANCEL_REQ;
553556
end
554557
WB: begin
555-
if (!bus_ctrl_if.dwait[HART_ID])
558+
if (bus_ctrl_if.derror[HART_ID] || !bus_ctrl_if.dwait[HART_ID])
556559
next_state = HIT;
557560
else if (snoop_hit && !sramWEN)
558561
next_state = SNOOP;

source_code/include/bus_ctrl_if.vh

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ typedef logic [DATA_WIDTH-1:0] transfer_width_t;
6666
// modified from coherence_ctrl_if.vh
6767
interface bus_ctrl_if ();
6868
// L1 generic control signals
69-
logic [CPUS-1:0] dREN, dWEN, dwait;
69+
logic [CPUS-1:0] dREN, dWEN, dwait, derror;
7070
transfer_width_t [CPUS-1:0] dload, dstore, snoop_dstore, driver_dstore;
7171
bus_word_t [CPUS-1:0] daddr;
7272
logic [CPUS-1:0] [3:0] dbyte_en;
@@ -83,7 +83,7 @@ interface bus_ctrl_if ();
8383
// L2 signals
8484
l2_state_t l2state;
8585
bus_word_t l2load, l2store;
86-
logic l2WEN, l2REN;
86+
logic l2WEN, l2REN, l2error;
8787
bus_word_t l2addr;
8888
logic [3:0] l2_byte_en;
8989
// Core outputs
@@ -106,14 +106,14 @@ interface bus_ctrl_if ();
106106
modport cc(
107107
input dREN, dWEN, daddr, dstore, dbyte_en,
108108
ccwrite, ccsnoophit, ccdirty, ccsnoopdone,
109-
l2load, l2state, ccabort,
110-
output dwait, dload,
109+
l2load, l2state, l2error, ccabort,
110+
output dwait, dload, derror,
111111
ccwait, ccinv, ccsnoopaddr, ccexclusive,
112112
l2addr, l2store, l2REN, l2WEN, l2_byte_en
113113
);
114114

115115
modport cache(
116-
input dwait, dload, ccwait, ccinv, ccsnoopaddr, ccexclusive,
116+
input dwait, dload, derror, ccwait, ccinv, ccsnoopaddr, ccexclusive,
117117
output dREN, dWEN, daddr, dstore, dbyte_en, ccwrite, ccsnoophit, ccdirty, ccsnoopdone
118118
);
119119

source_code/standard_core/bus_ctrl.sv

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ module bus_ctrl #(
111111
// BUS_TO_CACHE: nstate = IDLE;
112112
TRANSFER_R: nstate = ccif.ccdirty[supplier_cpu] ? WRITEBACK_MS : BUS_TO_CACHE;
113113
TRANSFER_RX: nstate = BUS_TO_CACHE;
114-
READ_L2: nstate = block_count_done ? BUS_TO_CACHE : state;
114+
READ_L2: nstate = ccif.l2error ? IDLE :
115+
block_count_done ? BUS_TO_CACHE : state;
115116
WRITEBACK_MS: nstate = block_count_done ? IDLE : state;
116117
WRITEBACK: nstate = block_count_done ? IDLE : state;
117118
BUS_TO_CACHE: nstate = IDLE;
@@ -134,6 +135,7 @@ module bus_ctrl #(
134135
ccif.l2WEN = '0;
135136
ccif.ccexclusive = '0;
136137
ccif.ccinv = '0;
138+
ccif.derror = '0;
137139
ndload = ccif.dload[requester_cpu];
138140
nexclusiveUpdate = exclusiveUpdate;
139141
nrequester_cpu = requester_cpu;
@@ -143,6 +145,7 @@ module bus_ctrl #(
143145

144146
casez(state)
145147
IDLE: begin // obtain the requester CPU id
148+
nblock_count = 0;
146149
if (|(ccif.dWEN & ~ccif.ccabort))
147150
nrequester_cpu = priorityEncode(ccif.dWEN & ~ccif.ccabort);
148151
else if (|(ccif.dREN & ccif.ccwrite & ~ccif.ccabort))
@@ -188,7 +191,9 @@ module bus_ctrl #(
188191
nblock_count = block_count;
189192
ccif.l2REN = !block_count_done;
190193

191-
if (ccif.l2state == L2_ACCESS) begin
194+
if (ccif.l2error) begin
195+
ccif.derror[requester_cpu] = 1;
196+
end if (ccif.l2state == L2_ACCESS) begin
192197
ccif.l2REN = 0;
193198
nblock_count = block_count + 1;
194199
if (!pass_through && block_count < BLOCK_SIZE - 1) begin

source_code/standard_core/memory_controller.sv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,6 @@ module memory_controller #(
5151

5252
bus_ctrl_if.l2load = out_gen_bus_if.rdata;
5353
bus_ctrl_if.l2state = out_gen_bus_if.busy ? L2_BUSY : L2_ACCESS;
54+
bus_ctrl_if.l2error = out_gen_bus_if.error;
5455
end
5556
endmodule

0 commit comments

Comments
 (0)