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: