External Memory Error Support
When using an external memory (e.g., backing store with ECC), the memory may
detect errors (uncorrectable ECC, access failures, etc.) that should be
reported to the CPU interface. The err_support property enables error
propagation for external memories by adding rd_err and wr_err input
ports and an internal inflight_value signal for request tracking.
Properties
This UDP is defined in etana_udps.rdl.
Compile that file (along with any other UDP files) before your design.
- err_support
Component: mem
Type: boolean
When set on an external memory, enables the following:
Input ports – The external block can signal errors back:
hwif_in_<name>_rd_err– Assert whenrd_ackis high to indicate a read error (e.g., ECC uncorrectable)hwif_in_<name>_wr_err– Assert whenwr_ackis high to indicate a write error
Internal signal –
<name>_inflight_value– A flopped signal that stays high from address decode strobe until the corresponding ack. Used to qualify error propagation (only report errors for in-flight requests).
These ports and logic are generated only when
err_supportis true on the memory. When omitted or false, they are not generated.
Address-Range Semantics
Error propagation is address-range aware:
Memory with err_support – When you read or write an address in this memory’s range and the external block signals an error (with ack), the bus error response is asserted (e.g., APB
pslverr, AHBhresp).Memory without err_support – Accesses to this memory’s range never trigger a bus error response, regardless of any other conditions.
This ensures that only memories explicitly configured for error reporting can drive bus error signals.
Propagation Logic
Read errors: Propagated when rd_ack, rd_err, and inflight_value
are all high. The inflight_value qualification prevents spurious errors
from being reported when no request was in flight.
Write errors: Propagated when wr_ack and wr_err are both high.
The inflight_value signal is generated per memory with err_support.
It is set when the address decode strobe (decoded_reg_strb_<name>) is
asserted, and cleared when the corresponding ack is received. For read-only
memories, it clears on rd_ack; for write-only, on wr_ack; for
read-write memories, on rd_ack | wr_ack.
Example
external mem {
memwidth = 64;
mementries = 32768;
err_support;
} ECC @ 0x40000;
This generates ports:
input logic [31:0] hwif_in_ecc_rd_data,
input logic hwif_in_ecc_rd_ack,
input logic hwif_in_ecc_rd_err, // when err_support
input logic hwif_in_ecc_wr_ack,
input logic hwif_in_ecc_wr_err, // when err_support
And internal logic:
logic ecc_inflight_value;
always_ff @(posedge clk) begin
if (rst) begin
ecc_inflight_value <= 1'h0;
end else if (hwif_in_ecc_rd_ack | hwif_in_ecc_wr_ack) begin
ecc_inflight_value <= 1'h0;
end else if (decoded_reg_strb_ecc) begin
ecc_inflight_value <= 1'h1;
end
end
Propagation: When asserted (and qualified), these signals propagate to
cpuif_rd_err/cpuif_wr_err and thus to the bus error responses
(e.g., APB pslverr, AXI SLVERR, AHB hresp).