hw/top_earlgrey/rtl/padctl.sv Cov: 100%
1: // Copyright lowRISC contributors.
2: // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3: // SPDX-License-Identifier: Apache-2.0
4:
5: module padctl (
6: // UART device side
7: input cio_uart_tx_d2p,
8: input cio_uart_tx_en_d2p,
9: output cio_uart_rx_p2d,
10: // UART pads
11: input IO_URX,
12: output IO_UTX,
13: // GPIO device side
14: input [31:0] cio_gpio_d2p,
15: input [31:0] cio_gpio_en_d2p,
16: output [31:0] cio_gpio_p2d,
17: // GPIO pads
18: inout IO_GP0,
19: inout IO_GP1,
20: inout IO_GP2,
21: inout IO_GP3,
22: inout IO_GP4,
23: inout IO_GP5,
24: inout IO_GP6,
25: inout IO_GP7,
26: inout IO_GP8,
27: inout IO_GP9,
28: inout IO_GP10,
29: inout IO_GP11,
30: inout IO_GP12,
31: inout IO_GP13,
32: inout IO_GP14,
33: inout IO_GP15,
34:
35: // SPI device interface
36: output cio_spi_device_sck_p2d,
37: output cio_spi_device_csb_p2d,
38: output cio_spi_device_mosi_p2d,
39: input cio_spi_device_miso_d2p,
40: input cio_spi_device_miso_en_d2p,
41: // JTAG interface
42: output cio_jtag_tck_p2d,
43: output cio_jtag_tms_p2d,
44: output cio_jtag_trst_n_p2d,
45: output cio_jtag_srst_n_p2d,
46: output cio_jtag_tdi_p2d,
47: input cio_jtag_tdo_d2p,
48: // FTDI MSEE pins shared between JTAG and SPI
49: input IO_DPS0,
50: input IO_DPS1,
51: output IO_DPS2,
52: input IO_DPS3,
53: input IO_DPS4,
54: input IO_DPS5,
55: input IO_DPS6,
56: input IO_DPS7
57: );
58:
59: // JTAG or SPI mux to the FTDI MSEE pins DPS0-DPS6
60: logic jtag_spi_n, dps2, dps2_en;
61: logic boot_strap;
62:
63: assign cio_uart_rx_p2d = IO_URX;
64: assign IO_UTX = cio_uart_tx_en_d2p ? cio_uart_tx_d2p : 1'bz;
65:
66: assign cio_gpio_p2d = {
67: 14'h0, // unpopulated
68: boot_strap, // Use GPIO17 to pass rom boot_strap indication
69: jtag_spi_n, // Use GPIO16 to pass SPI/JTAG control flag
70: IO_GP15,
71: IO_GP14,
72: IO_GP13,
73: IO_GP12,
74: IO_GP11,
75: IO_GP10,
76: IO_GP9,
77: IO_GP8,
78: IO_GP7,
79: IO_GP6,
80: IO_GP5,
81: IO_GP4,
82: IO_GP3,
83: IO_GP2,
84: IO_GP1,
85: IO_GP0
86: };
87:
88: assign IO_GP0 = cio_gpio_en_d2p[0] ? cio_gpio_d2p[0] : 1'bz;
89: assign IO_GP1 = cio_gpio_en_d2p[1] ? cio_gpio_d2p[1] : 1'bz;
90: assign IO_GP2 = cio_gpio_en_d2p[2] ? cio_gpio_d2p[2] : 1'bz;
91: assign IO_GP3 = cio_gpio_en_d2p[3] ? cio_gpio_d2p[3] : 1'bz;
92: assign IO_GP4 = cio_gpio_en_d2p[4] ? cio_gpio_d2p[4] : 1'bz;
93: assign IO_GP5 = cio_gpio_en_d2p[5] ? cio_gpio_d2p[5] : 1'bz;
94: assign IO_GP6 = cio_gpio_en_d2p[6] ? cio_gpio_d2p[6] : 1'bz;
95: assign IO_GP7 = cio_gpio_en_d2p[7] ? cio_gpio_d2p[7] : 1'bz;
96: assign IO_GP8 = cio_gpio_en_d2p[8] ? cio_gpio_d2p[8] : 1'bz;
97: assign IO_GP9 = cio_gpio_en_d2p[9] ? cio_gpio_d2p[9] : 1'bz;
98: assign IO_GP10 = cio_gpio_en_d2p[10] ? cio_gpio_d2p[10] : 1'bz;
99: assign IO_GP11 = cio_gpio_en_d2p[11] ? cio_gpio_d2p[11] : 1'bz;
100: assign IO_GP12 = cio_gpio_en_d2p[12] ? cio_gpio_d2p[12] : 1'bz;
101: assign IO_GP13 = cio_gpio_en_d2p[13] ? cio_gpio_d2p[13] : 1'bz;
102: assign IO_GP14 = cio_gpio_en_d2p[14] ? cio_gpio_d2p[14] : 1'bz;
103: assign IO_GP15 = cio_gpio_en_d2p[15] ? cio_gpio_d2p[15] : 1'bz;
104:
105: assign jtag_spi_n = IO_DPS6;
106: assign boot_strap = IO_DPS7;
107:
108: assign cio_spi_device_sck_p2d = jtag_spi_n ? 0 : IO_DPS0;
109: assign cio_jtag_tck_p2d = jtag_spi_n ? IO_DPS0 : 0;
110: assign cio_spi_device_mosi_p2d = jtag_spi_n ? 0 : IO_DPS1;
111: assign cio_jtag_tdi_p2d = jtag_spi_n ? IO_DPS1 : 0;
112:
113:
114: assign dps2 = jtag_spi_n ? cio_jtag_tdo_d2p : cio_spi_device_miso_d2p;
115: assign dps2_en = jtag_spi_n ? 1 : cio_spi_device_miso_en_d2p;
116: assign IO_DPS2 = dps2_en ? dps2 : 1'bz;
117:
118: assign cio_spi_device_csb_p2d = jtag_spi_n ? 1 : IO_DPS3;
119: assign cio_jtag_tms_p2d = jtag_spi_n ? IO_DPS3 : 0;
120:
121: assign cio_jtag_trst_n_p2d = jtag_spi_n ? IO_DPS4 : 1;
122: assign cio_jtag_srst_n_p2d = jtag_spi_n ? IO_DPS5 : 1;
123:
124: endmodule
125: