blob: b54a64c5327b5a25e56e8342c2e75509338620a1 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
`include "prim_assert.sv"
/**
* Tile-Link UL command integrity generator
*/
module tlul_cmd_intg_gen import tlul_pkg::*; #(
// TODO: default generation of data integrity is on until host native
// generation is ready
parameter bit EnableDataIntgGen = 1'b1
) (
// TL-UL interface
input tl_h2d_t tl_i,
output tl_h2d_t tl_o
);
tl_h2d_cmd_intg_t cmd;
assign cmd = extract_h2d_cmd_intg(tl_i);
logic [H2DCmdMaxWidth-1:0] unused_cmd_payload;
logic [H2DCmdIntgWidth-1:0] cmd_intg;
prim_secded_inv_64_57_enc u_cmd_gen (
.data_i(H2DCmdMaxWidth'(cmd)),
.data_o({cmd_intg, unused_cmd_payload})
);
logic [top_pkg::TL_DW-1:0] data_final;
logic [DataIntgWidth-1:0] data_intg;
if (EnableDataIntgGen) begin : gen_data_intg
assign data_final = tl_i.a_data;
logic [DataMaxWidth-1:0] unused_data;
prim_secded_inv_39_32_enc u_data_gen (
.data_i(DataMaxWidth'(data_final)),
.data_o({data_intg, unused_data})
);
end else begin : gen_passthrough_data_intg
assign data_final = tl_i.a_data;
assign data_intg = tl_i.a_user.data_intg;
end
always_comb begin
tl_o = tl_i;
tl_o.a_data = data_final;
tl_o.a_user.cmd_intg = cmd_intg;
tl_o.a_user.data_intg = data_intg;
end
logic unused_tl;
assign unused_tl = ^tl_i;
`ASSERT_INIT(PayMaxWidthCheck_A, $bits(tl_h2d_cmd_intg_t) <= H2DCmdMaxWidth)
endmodule : tlul_cmd_intg_gen