blob: 979fc94a87042ac354492cfd81b5bd58de1334c3 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// This it the padctrl portion that has to be instantiated on the chip level.
// The module instantiates the technology dependent pads, and connects them
// to the MIOs/DIOs and pad attributes coming from the padctrl block.
//
module padring #(
parameter Impl = "generic" // this determines the pad implementation
) (
// pad input
input wire clk_i,
input wire rst_ni,
// to clocking/reset infrastructure
output logic clk_o,
output logic rst_no,
// pads
inout wire [padctrl_reg_pkg::NMioPads-1:0] mio_io,
inout wire [padctrl_reg_pkg::NDioPads-1:0] dio_io,
// muxed IO signals coming from pinmux
input [padctrl_reg_pkg::NMioPads-1:0] mio_out_i,
input [padctrl_reg_pkg::NMioPads-1:0] mio_oe_i,
output logic [padctrl_reg_pkg::NMioPads-1:0] mio_in_o,
// dedicated IO signals coming from peripherals
input [padctrl_reg_pkg::NDioPads-1:0] dio_out_i,
input [padctrl_reg_pkg::NDioPads-1:0] dio_oe_i,
output logic [padctrl_reg_pkg::NDioPads-1:0] dio_in_o,
// pad attributes from top level instance
input [padctrl_reg_pkg::NMioPads-1:0]
[padctrl_reg_pkg::AttrDw-1:0] mio_attr_i,
input [padctrl_reg_pkg::NDioPads-1:0]
[padctrl_reg_pkg::AttrDw-1:0] dio_attr_i
);
//////////////////////////////////////////////////////
// Infrastructure
//////////////////////////////////////////////////////
// use this intermediate assignment to make both lint and fpv happy.
// the clock/reset wires should be input-only, otherwise fpv
// has trouble defining/tracing the clock signal. on the other hand, a direct
// connection of input wire to an inout pad causes lint problems
// (even though oe is hardwired to 0).
wire clk, rst_n;
assign clk = clk_i;
assign rst_n = rst_ni;
prim_pad_wrapper #(
.Impl(Impl),
.AttrDw(padctrl_reg_pkg::AttrDw)
) i_clk_pad (
.inout_io ( clk ),
.in_o ( clk_o ),
.out_i ( 1'b0 ),
.oe_i ( 1'b0 ),
.attr_i ( '0 )
);
prim_pad_wrapper #(
.Impl(Impl),
.AttrDw(padctrl_reg_pkg::AttrDw)
) i_rst_pad (
.inout_io ( rst_n ),
.in_o ( rst_no ),
.out_i ( 1'b0 ),
.oe_i ( 1'b0 ),
.attr_i ( '0 )
);
//////////////////////////////////////////////////////
// MIO Pads
//////////////////////////////////////////////////////
for (genvar k = 0; k < padctrl_reg_pkg::NMioPads; k++) begin : gen_mio_pads
prim_pad_wrapper #(
.Impl(Impl),
.AttrDw(padctrl_reg_pkg::AttrDw)
) i_mio_pad (
.inout_io ( mio_io[k] ),
.in_o ( mio_in_o[k] ),
.out_i ( mio_out_i[k] ),
.oe_i ( mio_oe_i[k] ),
.attr_i ( mio_attr_i[k] )
);
end
//////////////////////////////////////////////////////
// DIO Pads
//////////////////////////////////////////////////////
for (genvar k = 0; k < padctrl_reg_pkg::NDioPads; k++) begin : gen_dio_pads
prim_pad_wrapper #(
.Impl(Impl),
.AttrDw(padctrl_reg_pkg::AttrDw)
) i_dio_pad (
.inout_io ( dio_io[k] ),
.in_o ( dio_in_o[k] ),
.out_i ( dio_out_i[k] ),
.oe_i ( dio_oe_i[k] ),
.attr_i ( dio_attr_i[k] )
);
end
endmodule : padring