| From 617fc52a30d18725e50080e64bc6459fa24ca709 Mon Sep 17 00:00:00 2001 |
| From: Alex Van Damme <atv@google.com> |
| Date: Thu, 15 Feb 2024 11:24:49 -0800 |
| Subject: [PATCH 2/3] Modify TLUL and SRAM adapter for ChAI |
| |
| --- |
| hw/ip/tlul/rtl/tlul_adapter_reg.sv | 12 +++++------- |
| hw/ip/tlul/rtl/tlul_adapter_sram.sv | 21 +++------------------ |
| hw/ip/tlul/rtl/tlul_err.sv | 15 ++++++++++----- |
| hw/ip/tlul/rtl/tlul_pkg.sv | 18 ------------------ |
| 4 files changed, 18 insertions(+), 48 deletions(-) |
| |
| diff --git a/hw/ip/tlul/rtl/tlul_adapter_reg.sv b/hw/ip/tlul/rtl/tlul_adapter_reg.sv |
| index ac48750129..85e89d63f4 100644 |
| --- a/hw/ip/tlul/rtl/tlul_adapter_reg.sv |
| +++ b/hw/ip/tlul/rtl/tlul_adapter_reg.sv |
| @@ -82,8 +82,8 @@ module tlul_adapter_reg |
| |
| assign we_o = wr_req & ~err_internal; |
| assign re_o = rd_req & ~err_internal; |
| - assign wdata_o = tl_i.a_data; |
| - assign be_o = tl_i.a_mask; |
| + assign wdata_o = tl_i.a_data[RegDw-1:0]; |
| + assign be_o = tl_i.a_mask[RegBw-1:0]; |
| |
| if (RegAw <= 2) begin : gen_only_one_reg |
| assign addr_o = '0; |
| @@ -161,7 +161,7 @@ module tlul_adapter_reg |
| d_size: reqsz_q, |
| d_source: reqid_q, |
| d_sink: '0, |
| - d_data: rdata, |
| + d_data: {224'b0, rdata}, |
| d_user: '0, |
| d_error: error |
| }; |
| @@ -201,14 +201,12 @@ module tlul_adapter_reg |
| |
| // An instruction type transaction is only valid if en_ifetch is enabled |
| // If the instruction type is completely invalid, also considered an instruction error |
| - assign instr_error = prim_mubi_pkg::mubi4_test_invalid(tl_i.a_user.instr_type) | |
| - (prim_mubi_pkg::mubi4_test_true_strict(tl_i.a_user.instr_type) & |
| - prim_mubi_pkg::mubi4_test_false_loose(en_ifetch_i)); |
| + assign instr_error = '0; |
| |
| assign err_internal = addr_align_err | malformed_meta_err | tl_err | instr_error | intg_error; |
| |
| // Don't allow unsupported values. |
| - assign malformed_meta_err = tl_a_user_chk(tl_i.a_user); |
| + assign malformed_meta_err = '0; |
| |
| // addr_align_err |
| // Raised if addr isn't aligned with the size |
| diff --git a/hw/ip/tlul/rtl/tlul_adapter_sram.sv b/hw/ip/tlul/rtl/tlul_adapter_sram.sv |
| index ec764cbefa..8f41f38581 100644 |
| --- a/hw/ip/tlul/rtl/tlul_adapter_sram.sv |
| +++ b/hw/ip/tlul/rtl/tlul_adapter_sram.sv |
| @@ -106,7 +106,7 @@ module tlul_adapter_sram |
| // Here it checks any partial write if ByteAccess isn't allowed. |
| assign wr_attr_error = (tl_i.a_opcode == PutFullData || tl_i.a_opcode == PutPartialData) |
| ? ((ByteAccess == 0) ? |
| - (tl_i.a_mask != '1 || tl_i.a_size != 2'h2) : 1'b0) |
| + (tl_i.a_mask != '1 || tl_i.a_size != 6'h2) : 1'b0) |
| : 1'b0; |
| |
| // An instruction type transaction is only valid if en_ifetch is enabled |
| @@ -268,24 +268,9 @@ module tlul_adapter_sram |
| DataWhenInstrError : |
| DataWhenError; |
| |
| - // Since DataWhenInstrError and DataWhenError can be arbitrary parameters |
| - // we statically calculate the correct integrity values for these parameters here so that |
| - // they do not have to be supplied externally. |
| - logic [top_pkg::TL_DW-1:0] unused_instr, unused_data; |
| - logic [DataIntgWidth-1:0] error_instr_integ, error_data_integ; |
| - tlul_data_integ_enc u_tlul_data_integ_enc_instr ( |
| - .data_i(DataMaxWidth'(DataWhenInstrError)), |
| - .data_intg_o({error_instr_integ, unused_instr}) |
| - ); |
| - tlul_data_integ_enc u_tlul_data_integ_enc_data ( |
| - .data_i(DataMaxWidth'(DataWhenError)), |
| - .data_intg_o({error_data_integ, unused_data}) |
| - ); |
| |
| logic [DataIntgWidth-1:0] error_blanking_integ; |
| - assign error_blanking_integ = (prim_mubi_pkg::mubi4_test_true_strict(reqfifo_rdata.instr_type)) ? |
| - error_instr_integ : |
| - error_data_integ; |
| + assign error_blanking_integ = '0; |
| |
| logic [top_pkg::TL_DW-1:0] d_data; |
| assign d_data = (vld_rd_rsp & ~d_error) ? rspfifo_rdata.data // valid read |
| @@ -445,7 +430,7 @@ module tlul_adapter_sram |
| error : rerror_i[1] // Only care for Uncorrectable error |
| }; |
| assign rspfifo_rready = (reqfifo_rdata.op == OpRead & ~reqfifo_rdata.error) |
| - ? reqfifo_rready : 1'b0 ; |
| + ? reqfifo_rready : 1'b1 ; |
| |
| // This module only cares about uncorrectable errors. |
| logic unused_rerror; |
| diff --git a/hw/ip/tlul/rtl/tlul_err.sv b/hw/ip/tlul/rtl/tlul_err.sv |
| index c887cc387b..6cb3ea380a 100644 |
| --- a/hw/ip/tlul/rtl/tlul_err.sv |
| +++ b/hw/ip/tlul/rtl/tlul_err.sv |
| @@ -29,11 +29,10 @@ module tlul_err import tlul_pkg::*; ( |
| |
| // An instruction type transaction cannot be write |
| logic instr_wr_err; |
| - assign instr_wr_err = prim_mubi_pkg::mubi4_test_true_strict(tl_i.a_user.instr_type) & |
| - (op_full | op_partial); |
| + assign instr_wr_err = '0; |
| |
| logic instr_type_err; |
| - assign instr_type_err = prim_mubi_pkg::mubi4_test_invalid(tl_i.a_user.instr_type); |
| + assign instr_type_err = '0; |
| |
| // Anything that doesn't fall into the permitted category, it raises an error |
| assign err_o = ~(opcode_allowed & a_config_allowed) | instr_wr_err | instr_type_err; |
| @@ -68,8 +67,8 @@ module tlul_err import tlul_pkg::*; ( |
| 'h1: begin // 2 Byte |
| addr_sz_chk = ~tl_i.a_address[0]; |
| // check inactive lanes if lower 2B, check a_mask[3:2], if uppwer 2B, a_mask[1:0] |
| - mask_chk = (tl_i.a_address[1]) ? ~|(tl_i.a_mask & 4'b0011) |
| - : ~|(tl_i.a_mask & 4'b1100); |
| + mask_chk = (tl_i.a_address[1]) ? ~|(tl_i.a_mask & 32'b0011) |
| + : ~|(tl_i.a_mask & 32'b1100); |
| fulldata_chk = (tl_i.a_address[1]) ? &tl_i.a_mask[3:2] : &tl_i.a_mask[1:0] ; |
| end |
| |
| @@ -79,6 +78,12 @@ module tlul_err import tlul_pkg::*; ( |
| fulldata_chk = &tl_i.a_mask[3:0]; |
| end |
| |
| + 'h5: begin // 32 Byte |
| + addr_sz_chk = 1'b1; |
| + mask_chk = 1'b1; |
| + fulldata_chk = 1'b1; |
| + end |
| + |
| default: begin // else |
| addr_sz_chk = 1'b0; |
| mask_chk = 1'b0; |
| diff --git a/hw/ip/tlul/rtl/tlul_pkg.sv b/hw/ip/tlul/rtl/tlul_pkg.sv |
| index 4e9401fdf9..dae9671f25 100644 |
| --- a/hw/ip/tlul/rtl/tlul_pkg.sv |
| +++ b/hw/ip/tlul/rtl/tlul_pkg.sv |
| @@ -179,17 +179,6 @@ package tlul_pkg; |
| return cmd_intg; |
| endfunction // get_cmd_intg |
| |
| - // calculate ecc for data checking |
| - function automatic logic [DataIntgWidth-1:0] get_data_intg(logic [top_pkg::TL_DW-1:0] data); |
| - logic [DataIntgWidth-1:0] data_intg; |
| - logic [top_pkg::TL_DW-1:0] unused_data; |
| - logic [DataIntgWidth + top_pkg::TL_DW - 1 : 0] enc_data; |
| - enc_data = prim_secded_pkg::prim_secded_inv_39_32_enc(data); |
| - data_intg = enc_data[DataIntgWidth + top_pkg::TL_DW - 1 : top_pkg::TL_DW]; |
| - unused_data = enc_data[top_pkg::TL_DW - 1 : 0]; |
| - return data_intg; |
| - endfunction // get_data_intg |
| - |
| // return inverted integrity for command payload |
| function automatic logic [H2DCmdIntgWidth-1:0] get_bad_cmd_intg(tl_h2d_t tl); |
| logic [H2DCmdIntgWidth-1:0] cmd_intg; |
| @@ -197,11 +186,4 @@ package tlul_pkg; |
| return ~cmd_intg; |
| endfunction // get_bad_cmd_intg |
| |
| - // return inverted integrity for data payload |
| - function automatic logic [H2DCmdIntgWidth-1:0] get_bad_data_intg(logic [top_pkg::TL_DW-1:0] data); |
| - logic [H2DCmdIntgWidth-1:0] data_intg; |
| - data_intg = get_data_intg(data); |
| - return ~data_intg; |
| - endfunction // get_bad_data_intg |
| - |
| endpackage |
| -- |
| 2.43.0.687.g38aa6559b0-goog |
| |