diff --git a/design/el2_mem.sv b/design/el2_mem.sv index 7372a088869..285c76f86ca 100644 --- a/design/el2_mem.sv +++ b/design/el2_mem.sv @@ -101,13 +101,17 @@ import el2_pkg::*; assign mem_export .iccm_wren_bank = mem_export_local.iccm_wren_bank; assign mem_export .iccm_addr_bank = mem_export_local.iccm_addr_bank; assign mem_export .iccm_bank_wr_data = mem_export_local.iccm_bank_wr_data; + assign mem_export .iccm_bank_wr_ecc = mem_export_local.iccm_bank_wr_ecc; assign mem_export_local.iccm_bank_dout = mem_export. iccm_bank_dout; + assign mem_export_local.iccm_bank_ecc = mem_export. iccm_bank_ecc; assign mem_export .dccm_clken = mem_export_local.dccm_clken; assign mem_export .dccm_wren_bank = mem_export_local.dccm_wren_bank; assign mem_export .dccm_addr_bank = mem_export_local.dccm_addr_bank; assign mem_export .dccm_wr_data_bank = mem_export_local.dccm_wr_data_bank; + assign mem_export .dccm_wr_ecc_bank = mem_export_local.dccm_wr_ecc_bank; assign mem_export_local.dccm_bank_dout = mem_export .dccm_bank_dout; + assign mem_export_local.dccm_bank_ecc = mem_export .dccm_bank_ecc; // DCCM Instantiation if (pt.DCCM_ENABLE == 1) begin: Gen_dccm_enable diff --git a/design/ifu/el2_ifu_iccm_mem.sv b/design/ifu/el2_ifu_iccm_mem.sv index 6cecb4c6937..3a29ca3c1a3 100644 --- a/design/ifu/el2_ifu_iccm_mem.sv +++ b/design/ifu/el2_ifu_iccm_mem.sv @@ -111,11 +111,13 @@ import el2_pkg::*; iccm_rw_addr[pt.ICCM_BITS-1 : pt.ICCM_BANK_INDEX_LO]); always_comb begin - iccm_mem_export.iccm_clken[i] = iccm_clken[i]; - iccm_mem_export.iccm_wren_bank[i] = wren_bank[i]; - iccm_mem_export.iccm_addr_bank[i] = addr_bank[i]; - iccm_mem_export.iccm_bank_wr_data[i][38:0] = iccm_bank_wr_data[i][38:0]; - iccm_bank_dout[i][38:0] = iccm_mem_export.iccm_bank_dout[i][38:0]; + iccm_mem_export.iccm_clken[i] = iccm_clken[i]; + iccm_mem_export.iccm_wren_bank[i] = wren_bank[i]; + iccm_mem_export.iccm_addr_bank[i] = addr_bank[i]; + iccm_mem_export.iccm_bank_wr_data[i] = iccm_bank_wr_data[i][31:0]; + iccm_mem_export.iccm_bank_wr_ecc[i] = iccm_bank_wr_data[i][38:32]; + iccm_bank_dout[i][31:0] = iccm_mem_export.iccm_bank_dout[i]; + iccm_bank_dout[i][38:32] = iccm_mem_export.iccm_bank_ecc[i]; end // match the redundant rows diff --git a/design/lib/el2_mem_if.sv b/design/lib/el2_mem_if.sv index c0ddd0bd711..3a204e4a9e7 100644 --- a/design/lib/el2_mem_if.sv +++ b/design/lib/el2_mem_if.sv @@ -22,7 +22,7 @@ import el2_pkg::*; interface el2_mem_if #( `include "el2_param.vh" ) (); - + localparam DCCM_ECC_WIDTH = pt.DCCM_FDATA_WIDTH - pt.DCCM_DATA_WIDTH; ////////////////////////////////////////// // Clock @@ -35,8 +35,10 @@ interface el2_mem_if #( logic [pt.ICCM_NUM_BANKS-1:0] iccm_wren_bank; logic [pt.ICCM_NUM_BANKS-1:0][pt.ICCM_BITS-1:pt.ICCM_BANK_INDEX_LO] iccm_addr_bank; - logic [pt.ICCM_NUM_BANKS-1:0][ 38:0] iccm_bank_wr_data; - logic [pt.ICCM_NUM_BANKS-1:0][ 38:0] iccm_bank_dout; + logic [pt.ICCM_NUM_BANKS-1:0][ 31:0] iccm_bank_wr_data; + logic [pt.ICCM_NUM_BANKS-1:0][ 6:0] iccm_bank_wr_ecc; + logic [pt.ICCM_NUM_BANKS-1:0][ 31:0] iccm_bank_dout; + logic [pt.ICCM_NUM_BANKS-1:0][ 6:0] iccm_bank_ecc; ////////////////////////////////////////// @@ -44,8 +46,10 @@ interface el2_mem_if #( logic [pt.DCCM_NUM_BANKS-1:0] dccm_clken; logic [pt.DCCM_NUM_BANKS-1:0] dccm_wren_bank; logic [pt.DCCM_NUM_BANKS-1:0][pt.DCCM_BITS-1:(pt.DCCM_BANK_BITS+2)] dccm_addr_bank; - logic [pt.DCCM_NUM_BANKS-1:0][ pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_bank; - logic [pt.DCCM_NUM_BANKS-1:0][ pt.DCCM_FDATA_WIDTH-1:0] dccm_bank_dout; + logic [pt.DCCM_NUM_BANKS-1:0][ pt.DCCM_DATA_WIDTH-1:0] dccm_wr_data_bank; + logic [pt.DCCM_NUM_BANKS-1:0][ DCCM_ECC_WIDTH-1:0] dccm_wr_ecc_bank; + logic [pt.DCCM_NUM_BANKS-1:0][ pt.DCCM_DATA_WIDTH-1:0] dccm_bank_dout; + logic [pt.DCCM_NUM_BANKS-1:0][ DCCM_ECC_WIDTH-1:0] dccm_bank_ecc; ////////////////////////////////////////// @@ -53,35 +57,35 @@ interface el2_mem_if #( modport veer_iccm( input clk, // ICCM - output iccm_clken, iccm_wren_bank, iccm_addr_bank, iccm_bank_wr_data, - input iccm_bank_dout + output iccm_clken, iccm_wren_bank, iccm_addr_bank, iccm_bank_wr_data, iccm_bank_wr_ecc, + input iccm_bank_dout, iccm_bank_ecc ); modport veer_dccm( input clk, // DCCM - output dccm_clken, dccm_wren_bank, dccm_addr_bank, dccm_wr_data_bank, - input dccm_bank_dout + output dccm_clken, dccm_wren_bank, dccm_addr_bank, dccm_wr_data_bank, dccm_wr_ecc_bank, + input dccm_bank_dout, dccm_bank_ecc ); modport veer_sram_src( output clk, // ICCM - output iccm_clken, iccm_wren_bank, iccm_addr_bank, iccm_bank_wr_data, - input iccm_bank_dout, + output iccm_clken, iccm_wren_bank, iccm_addr_bank, iccm_bank_wr_data, iccm_bank_wr_ecc, + input iccm_bank_dout, iccm_bank_ecc, // DCCM - output dccm_clken, dccm_wren_bank, dccm_addr_bank, dccm_wr_data_bank, - input dccm_bank_dout + output dccm_clken, dccm_wren_bank, dccm_addr_bank, dccm_wr_data_bank, dccm_wr_ecc_bank, + input dccm_bank_dout, dccm_bank_ecc ); modport veer_sram_sink( input clk, // ICCM - input iccm_clken, iccm_wren_bank, iccm_addr_bank, iccm_bank_wr_data, - output iccm_bank_dout, + input iccm_clken, iccm_wren_bank, iccm_addr_bank, iccm_bank_wr_data, iccm_bank_wr_ecc, + output iccm_bank_dout, iccm_bank_ecc, // DCCM - input dccm_clken, dccm_wren_bank, dccm_addr_bank, dccm_wr_data_bank, - output dccm_bank_dout + input dccm_clken, dccm_wren_bank, dccm_addr_bank, dccm_wr_data_bank, dccm_wr_ecc_bank, + output dccm_bank_dout, dccm_bank_ecc ); endinterface diff --git a/design/lsu/el2_lsu_dccm_mem.sv b/design/lsu/el2_lsu_dccm_mem.sv index 20d773150cc..d4685ebd9e5 100644 --- a/design/lsu/el2_lsu_dccm_mem.sv +++ b/design/lsu/el2_lsu_dccm_mem.sv @@ -100,11 +100,13 @@ module el2_lsu_dccm_mem // Connect to exported RAM Banks always_comb begin - dccm_mem_export.dccm_clken[i] = dccm_clken[i]; - dccm_mem_export.dccm_wren_bank[i] = wren_bank[i]; - dccm_mem_export.dccm_addr_bank[i] = addr_bank[i]; - dccm_mem_export.dccm_wr_data_bank[i] = wr_data_bank[i]; - dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0] = dccm_mem_export.dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]; + dccm_mem_export.dccm_clken[i] = dccm_clken[i]; + dccm_mem_export.dccm_wren_bank[i] = wren_bank[i]; + dccm_mem_export.dccm_addr_bank[i] = addr_bank[i]; + dccm_mem_export.dccm_wr_data_bank[i] = wr_data_bank[i][pt.DCCM_DATA_WIDTH-1:0]; + dccm_mem_export.dccm_wr_ecc_bank[i] = wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:pt.DCCM_DATA_WIDTH]; + dccm_bank_dout[i][pt.DCCM_DATA_WIDTH-1:0] = dccm_mem_export.dccm_bank_dout[i]; + dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:pt.DCCM_DATA_WIDTH] = dccm_mem_export.dccm_bank_ecc[i]; end end : mem_bank diff --git a/testbench/tb_top.sv b/testbench/tb_top.sv index d52cc1c3031..ec16011b221 100644 --- a/testbench/tb_top.sv +++ b/testbench/tb_top.sv @@ -332,6 +332,11 @@ module tb_top #( string abi_reg[32]; // ABI register names el2_mem_if el2_mem_export (); + logic [pt.ICCM_NUM_BANKS-1:0][ 38:0] iccm_bank_wr_fdata; + logic [pt.ICCM_NUM_BANKS-1:0][ 38:0] iccm_bank_fdout; + logic [pt.DCCM_NUM_BANKS-1:0][pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_fdata_bank; + logic [pt.DCCM_NUM_BANKS-1:0][pt.DCCM_FDATA_WIDTH-1:0] dccm_bank_fdout; + `define DEC rvtop_wrapper.rvtop.veer.dec assign mailbox_write = lmem.awvalid && lmem.awaddr == mem_mailbox && rst_l; @@ -771,13 +776,17 @@ veer_wrapper rvtop_wrapper ( .iccm_wren_bank (el2_mem_export.iccm_wren_bank), .iccm_addr_bank (el2_mem_export.iccm_addr_bank), .iccm_bank_wr_data (el2_mem_export.iccm_bank_wr_data), + .iccm_bank_wr_ecc (el2_mem_export.iccm_bank_wr_ecc), .iccm_bank_dout (el2_mem_export.iccm_bank_dout), + .iccm_bank_ecc (el2_mem_export.iccm_bank_ecc), .dccm_clken (el2_mem_export.dccm_clken), .dccm_wren_bank (el2_mem_export.dccm_wren_bank), .dccm_addr_bank (el2_mem_export.dccm_addr_bank), .dccm_wr_data_bank (el2_mem_export.dccm_wr_data_bank), + .dccm_wr_ecc_bank (el2_mem_export.dccm_wr_ecc_bank), .dccm_bank_dout (el2_mem_export.dccm_bank_dout), + .dccm_bank_ecc (el2_mem_export.dccm_bank_ecc), // remove mems DFT pins for opensource .ic_data_ext_in_pkt ('0), @@ -1273,6 +1282,10 @@ if (pt.DCCM_ENABLE == 1) begin: Gen_dccm_enable localparam DCCM_INDEX_DEPTH = ((pt.DCCM_SIZE)*1024)/((pt.DCCM_BYTE_WIDTH)*(pt.DCCM_NUM_BANKS)); // Depth of memory bank // 8 Banks, 16KB each (2048 x 72) for (genvar i=0; i