From 07fda43327246e4af8fdd175ea8eb532add22aee Mon Sep 17 00:00:00 2001 From: Nicola Lohr Date: Tue, 4 Jun 2024 17:45:55 +0200 Subject: [PATCH 1/3] Added Assoc option to ecc_scrubber.sv --- rtl/ecc_wrap/ecc_scrubber.sv | 81 ++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/rtl/ecc_wrap/ecc_scrubber.sv b/rtl/ecc_wrap/ecc_scrubber.sv index aa11e8f0..4bb9726c 100644 --- a/rtl/ecc_wrap/ecc_scrubber.sv +++ b/rtl/ecc_wrap/ecc_scrubber.sv @@ -16,7 +16,9 @@ module ecc_scrubber #( parameter int unsigned BankSize = 256, parameter bit UseExternalECC = 0, parameter int unsigned DataWidth = 39, - parameter int unsigned ProtWidth = 7 + parameter int unsigned ProtWidth = 7, + parameter int unsigned Assoc = 1, + parameter type line_t = logic [DataWidth-1:0] ) ( input logic clk_i, input logic rst_ni, @@ -26,32 +28,33 @@ module ecc_scrubber #( output logic uncorrectable_o, // Input signals from others accessing memory bank - input logic intc_req_i, + input logic [ Assoc-1:0] intc_req_i, input logic intc_we_i, input logic [$clog2(BankSize)-1:0] intc_add_i, - input logic [ DataWidth-1:0] intc_wdata_i, - output logic [ DataWidth-1:0] intc_rdata_o, + input line_t intc_wdata_i, + output line_t [ Assoc-1:0] intc_rdata_o, // Output directly to bank - output logic bank_req_o, + output logic [ Assoc-1:0] bank_req_o, output logic bank_we_o, output logic [$clog2(BankSize)-1:0] bank_add_o, - output logic [ DataWidth-1:0] bank_wdata_o, - input logic [ DataWidth-1:0] bank_rdata_i, + output line_t bank_wdata_o, + input line_t [ Assoc-1:0] bank_rdata_i, // If using external ECC - output logic [ DataWidth-1:0] ecc_out_o, - input logic [ DataWidth-1:0] ecc_in_i, - input logic [ 2:0] ecc_err_i + output line_t [ Assoc-1:0] ecc_out_o, + input line_t [ Assoc-1:0] ecc_in_i, + input logic [ Assoc-1:0][1:0] ecc_err_i ); - logic [ 1:0] ecc_err; - - logic scrub_req; + logic [ Assoc-1:0][1:0] ecc_err; + int assoc_c = 0; + logic [ Assoc-1:0] scrub_req; logic scrub_we; logic [$clog2(BankSize)-1:0] scrub_add; - logic [ DataWidth-1:0] scrub_wdata; - logic [ DataWidth-1:0] scrub_rdata; + line_t scrub_wdata; + line_t [ Assoc-1:0] temp_scrub_wdata; + line_t [ Assoc-1:0] scrub_rdata; typedef enum logic [2:0] {Idle, Read, Write} scrub_state_e; @@ -60,7 +63,6 @@ module ecc_scrubber #( logic [$clog2(BankSize)-1:0] working_add_d, working_add_q; assign scrub_add = working_add_q; - assign bank_req_o = intc_req_i || scrub_req; assign intc_rdata_o = bank_rdata_i; assign scrub_rdata = bank_rdata_i; @@ -69,30 +71,45 @@ module ecc_scrubber #( bank_we_o = intc_we_i; bank_add_o = intc_add_i; bank_wdata_o = intc_wdata_i; + bank_req_o = intc_req_i; // If scrubber active and outside is not, do scrub - if ( (state_q == Read || state_q == Write) && intc_req_i == 1'b0) begin + if ( (state_q == Read || state_q == Write) && |intc_req_i === 1'b0) begin bank_we_o = scrub_we; bank_add_o = scrub_add; bank_wdata_o = scrub_wdata; + bank_req_o = scrub_req; end end if (UseExternalECC) begin : gen_external_ecc assign ecc_err = ecc_err_i; assign ecc_out_o = scrub_rdata; - assign scrub_wdata = ecc_in_i; + assign temp_scrub_wdata = ecc_in_i; end else begin : gen_internal_ecc assign ecc_out_o = '0; - hsiao_ecc_cor #( - .DataWidth (DataWidth-ProtWidth), - .ProtWidth (ProtWidth) - ) ecc_corrector ( - .in ( scrub_rdata ), - .out ( scrub_wdata ), - .syndrome_o(), - .err_o ( ecc_err ) - ); + + for (genvar assoc = 0; assoc Date: Fri, 28 Jun 2024 16:42:15 +0200 Subject: [PATCH 2/3] Update ecc_scrubber.sv Try to fix lint v1 --- rtl/ecc_wrap/ecc_scrubber.sv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtl/ecc_wrap/ecc_scrubber.sv b/rtl/ecc_wrap/ecc_scrubber.sv index 4bb9726c..aef5efab 100644 --- a/rtl/ecc_wrap/ecc_scrubber.sv +++ b/rtl/ecc_wrap/ecc_scrubber.sv @@ -89,7 +89,7 @@ module ecc_scrubber #( end else begin : gen_internal_ecc assign ecc_out_o = '0; - for (genvar assoc = 0; assoc Date: Fri, 28 Jun 2024 19:02:25 +0200 Subject: [PATCH 3/3] Update ecc_scrubber.sv Fix lint error v2 --- rtl/ecc_wrap/ecc_scrubber.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/ecc_wrap/ecc_scrubber.sv b/rtl/ecc_wrap/ecc_scrubber.sv index aef5efab..ecf2a10b 100644 --- a/rtl/ecc_wrap/ecc_scrubber.sv +++ b/rtl/ecc_wrap/ecc_scrubber.sv @@ -89,7 +89,7 @@ module ecc_scrubber #( end else begin : gen_internal_ecc assign ecc_out_o = '0; - for (genvar assoc = 0; assoc