blob: 09f69538e7619b8e77463a8b560c2ab3c2549435 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Pinmux toplevel.
//
module pinmux (
input clk_i,
input rst_ni,
// Bus Interface (device)
input tlul_pkg::tl_h2d_t tl_i,
output tlul_pkg::tl_d2h_t tl_o,
// Peripheral side
input [pinmux_reg_pkg::NPeriphOut-1:0] periph_to_mio_i,
input [pinmux_reg_pkg::NPeriphOut-1:0] periph_to_mio_oe_i,
output logic [pinmux_reg_pkg::NPeriphIn-1:0] mio_to_periph_o,
// Pad side
output logic [pinmux_reg_pkg::NMioPads-1:0] mio_out_o,
output logic [pinmux_reg_pkg::NMioPads-1:0] mio_oe_o,
input [pinmux_reg_pkg::NMioPads-1:0] mio_in_i
);
//////////////////////////////////////////////////////
// Regfile Breakout and Mapping
//////////////////////////////////////////////////////
pinmux_reg_pkg::pinmux_reg2hw_t reg2hw;
pinmux_reg_top i_reg_top (
.clk_i ,
.rst_ni ,
.tl_i ,
.tl_o ,
.reg2hw ,
.devmode_i(1'b1)
);
//////////////////////////////////////////////////////
// Input Mux
//////////////////////////////////////////////////////
for (genvar k = 0; k < pinmux_reg_pkg::NPeriphIn; k++) begin : gen_periph_in
logic [pinmux_reg_pkg::NMioPads+2-1:0] data_mux;
// stack input and default signals for convenient indexing below
// possible defaults: constant 0 or 1
assign data_mux = $size(data_mux)'({mio_in_i, 1'b1, 1'b0});
// index using configured insel
assign mio_to_periph_o[k] = data_mux[reg2hw.periph_insel[k].q];
// disallow undefined entries
`ASSUME(InSelRange_A, reg2hw.periph_insel[k].q < pinmux_reg_pkg::NMioPads + 2, clk_i, !rst_ni)
end
//////////////////////////////////////////////////////
// Output Mux
//////////////////////////////////////////////////////
for (genvar k = 0; k < pinmux_reg_pkg::NMioPads; k++) begin : gen_mio_out
logic [pinmux_reg_pkg::NPeriphOut+3-1:0] data_mux, oe_mux;
// stack output data/enable and default signals for convenient indexing below
// possible defaults: 0, 1 or 2 (high-Z)
assign data_mux = $size(data_mux)'({periph_to_mio_i, 1'b0, 1'b1, 1'b0});
assign oe_mux = $size(oe_mux)'({periph_to_mio_oe_i, 1'b0, 1'b1, 1'b1});
// index using configured outsel
assign mio_out_o[k] = data_mux[reg2hw.mio_outsel[k].q];
assign mio_oe_o[k] = oe_mux[reg2hw.mio_outsel[k].q];
// disallow undefined entries
`ASSUME(OutSelRange_A, reg2hw.mio_outsel[k].q < pinmux_reg_pkg::NPeriphOut + 3, clk_i, !rst_ni)
end
endmodule : pinmux