// Copyright lowRISC contributors (OpenTitan project).
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Testbench module for prim_packer. Intended to be used with a formal tool.
// To reduce the runtime for prim_packer, we limited the width parameter.

module prim_packer_tb #(
  parameter int unsigned MaxInW = 64,
  parameter int unsigned MaxOutW = 64
) (
  input clk_i ,
  input rst_ni,

  input                      valid_i,
  input        [MaxInW-1:0]  data_i,
  input        [MaxInW-1:0]  mask_i,
  output                     ready_o,

  output logic               valid_o,
  output logic [MaxOutW-1:0] data_o,
  output logic [MaxOutW-1:0] mask_o,
  input                      ready_i,

  input                      flush_i,
  output logic               flush_done_o,
  output logic               err_o
);

  for (genvar k = 1; k <= 16; k++) begin : gen_prim_packer
    prim_packer #(.InW(k), .OutW(17-k)
    ) i_prim_packer (
      .clk_i,
      .rst_ni,
      .valid_i,
      .data_i (data_i[k-1:0]),
      .mask_i (mask_i[k-1:0]),
      .ready_o,
      .valid_o,
      .data_o (data_o[16-k:0]),
      .mask_o (mask_o[16-k:0]),
      .ready_i,
      .flush_i,
      .flush_done_o,
      .err_o
    );
  end

  prim_packer #(.InW(MaxInW), .OutW(MaxOutW)
    ) i_prim_packer_max (
      .clk_i,
      .rst_ni,
      .valid_i,
      .data_i (data_i),
      .mask_i (mask_i),
      .ready_o,
      .valid_o,
      .data_o (data_o),
      .mask_o (mask_o),
      .ready_i,
      .flush_i,
      .flush_done_o,
      .err_o
  );

endmodule : prim_packer_tb
