Merge "Configure USB on Nexus"
diff --git a/hw/top_matcha/data/pins_nexus.xdc b/hw/top_matcha/data/pins_nexus.xdc
index f327a2e..b032041 100644
--- a/hw/top_matcha/data/pins_nexus.xdc
+++ b/hw/top_matcha/data/pins_nexus.xdc
@@ -179,25 +179,26 @@
 set_property -dict { PACKAGE_PIN BD11 IOSTANDARD LVCMOS18 } [get_ports { IOB9 }];              #FMC_HA05_N
 #MISC from PMOD3
 set_property -dict { PACKAGE_PIN BE15  IOSTANDARD LVCMOS18 } [get_ports { IOA0 }];             #FMC_HA06_P
-set_property -dict { PACKAGE_PIN BF15  IOSTANDARD LVCMOS18 } [get_ports { IOC6 }];             #FMC_HA06_N
-set_property -dict { PACKAGE_PIN BE14  IOSTANDARD LVCMOS18 } [get_ports { IOC7 }];             #FMC_HA07_P
+# set_property -dict { PACKAGE_PIN BF15  IOSTANDARD LVCMOS18 } [get_ports { IOC6 }];             #FMC_HA06_N
+# set_property -dict { PACKAGE_PIN BE14  IOSTANDARD LVCMOS18 } [get_ports { IOC7 }];             #FMC_HA07_P
 set_property -dict { PACKAGE_PIN BF14  IOSTANDARD LVCMOS18 } [get_ports { IOA1 }];             #FMC_HA07_N
 set_property -dict { PACKAGE_PIN BC15  IOSTANDARD LVCMOS18 } [get_ports { IOC9 }];             #FMC_HA08_P
 
 
 ## TI TUSB1T1105AMHX USB Transceiver "usbdev" testing, Bank 64 LVCMOS18
-#set_property -dict { PACKAGE_PIN AW23  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_DP_TX }]; #USB0_VPO
-#set_property -dict { PACKAGE_PIN AW22  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_DN_TX }]; #USB0_VMO
-#set_property -dict { PACKAGE_PIN AY22   IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_DP_RX }]; #USB0_VP
-#set_property -dict { PACKAGE_PIN BA22   IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_DN_RX }]; #USB0_VM
+set_property -dict { PACKAGE_PIN AW23  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_VPO }]; #USB0_VPO
+set_property -dict { PACKAGE_PIN AW22  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_VMO }]; #USB0_VMO
+set_property -dict { PACKAGE_PIN AY22  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_VP }]; #USB0_VP
+set_property -dict { PACKAGE_PIN BA22  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_VM }]; #USB0_VM
 ## USRUSB_SOFTCONN(not used, conneted to xxxxx as placeholder)
 #set_property -dict { PACKAGE_PIN AH33  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_DPPULLUP }]; ## MOVED TO EXP1x10_J271_P15 to clear up PMOD4
 ## Roman added USB voltage sense pin to AY17 of Bank65  of Nexus FPGA in the latest revision board.
-#set_property -dict { PACKAGE_PIN AY17   IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_SENSE }]; #USB0_VBUS_SENSEB
-#set_property -dict { PACKAGE_PIN AU21  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_OE_N }]; #USB0_OEB
-#set_property -dict { PACKAGE_PIN AV21   IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_D_RX }]; #USB0_RCV
-#set_property -dict { PACKAGE_PIN BA21  IOSTANDARD LVCMOS18 PULLTYPE PULLUP} [get_ports { IO_UPHY_SPD }]; #USB0_MODE
-#set_property -dict { PACKAGE_PIN AT21  IOSTANDARD LVCMOS18 PULLTYPE PULLUP} [get_ports { IO_UPHY_SUS }]; #USB0_CFG
+set_property -dict { PACKAGE_PIN BF7   IOSTANDARD LVCMOS18 } [get_ports { IOC6 }]; #USB0_VBUS_ENB
+set_property -dict { PACKAGE_PIN AY17  IOSTANDARD LVCMOS18 } [get_ports { IOC7 }]; #USB0_VBUS_SENSEB
+set_property -dict { PACKAGE_PIN AU21  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_OEB }]; #USB0_OEB
+set_property -dict { PACKAGE_PIN AV21  IOSTANDARD LVCMOS18 } [get_ports { IO_UPHY_RCV }]; #USB0_RCV
+set_property -dict { PACKAGE_PIN BA21  IOSTANDARD LVCMOS18 PULLTYPE PULLUP} [get_ports { IO_UPHY_MODE }]; #USB0_MODE
+set_property -dict { PACKAGE_PIN AT21  IOSTANDARD LVCMOS18 PULLTYPE PULLUP} [get_ports { IO_UPHY_CFG }]; #USB0_CFG
 
 ## UART0 (Security Core UART0, default connect to FTDI CDBUS, late may map to SOM_FPGA_GPIO for in-system monitor)
 ## Bank 65, LVCMOS18
diff --git a/hw/top_matcha/data/top_matcha.hjson b/hw/top_matcha/data/top_matcha.hjson
index e5dd4f5..52fd83d 100644
--- a/hw/top_matcha/data/top_matcha.hjson
+++ b/hw/top_matcha/data/top_matcha.hjson
@@ -1406,10 +1406,10 @@
         'sensor_ctrl.ast_init_done'       : 'ast_init_done',
         'spi_device.sck_monitor'          : 'sck_monitor',
         'usbdev.usb_rx_d'                 : '',
+        'usbdev.usb_rx_enable'            : '',
         'usbdev.usb_tx_d'                 : '',
         'usbdev.usb_tx_se0'               : '',
         'usbdev.usb_tx_use_d_se0'         : '',
-        'usbdev.usb_rx_enable'            : '',
         'usbdev.usb_ref_val'              : '',
         'usbdev.usb_ref_pulse'            : '',
     },
@@ -1811,6 +1811,15 @@
           { name: 'IO_CLK_N',         type: 'AnalogIn0', bank: 'VCC', connection: 'manual', desc: 'Extra clock input for FPGA target'}
           { name: 'POR_BUTTON_N',     type: 'InputStd', bank: 'VCC', connection: 'manual', desc: 'Power-on reset button input'}
           { name: 'JTAG_SRST_N',      type: 'InputStd', bank: 'VCC', connection: 'manual', desc: 'JTAG header SRST, triggers POR'}
+          // USB
+          { name: 'IO_UPHY_VPO',       type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual UPHY signal for FPGA target'}
+          { name: 'IO_UPHY_VMO',       type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual UPHY signal for FPGA target'}
+          { name: 'IO_UPHY_VP',        type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual UPHY signal for FPGA target'}
+          { name: 'IO_UPHY_VM',        type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual UPHY signal for FPGA target'}
+          { name: 'IO_UPHY_OEB',       type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual UPHY signal for FPGA target'}
+          { name: 'IO_UPHY_RCV',       type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual UPHY signal for FPGA target'}
+          { name: 'IO_UPHY_MODE',      type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual UPHY signal for FPGA target'}
+          { name: 'IO_UPHY_CFG',       type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual UPHY signal for FPGA target'}
           // ChipWhisperer IO
           { name: 'IO_CLKOUT',        type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual clock output for SCA setup'}
           { name: 'IO_TRIGGER',       type: 'BidirStd', bank: 'VCC', connection: 'manual', desc: 'Manual trigger output for SCA setup'}
diff --git a/hw/top_matcha/ip/pinmux/doc/autogen/pinout_nexus.md b/hw/top_matcha/ip/pinmux/doc/autogen/pinout_nexus.md
index 47af80f..0019d28 100644
--- a/hw/top_matcha/ip/pinmux/doc/autogen/pinout_nexus.md
+++ b/hw/top_matcha/ip/pinmux/doc/autogen/pinout_nexus.md
@@ -86,6 +86,14 @@
 |   <p style="font-size:smaller">IO_CLK_N</p>    |  <p style="font-size:smaller">AnalogIn0</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |     <p style="font-size:smaller">Extra clock input for FPGA target</p>     |
 | <p style="font-size:smaller">POR_BUTTON_N</p>  |   <p style="font-size:smaller">InputStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |        <p style="font-size:smaller">Power-on reset button input</p>        |
 |  <p style="font-size:smaller">JTAG_SRST_N</p>  |   <p style="font-size:smaller">InputStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |      <p style="font-size:smaller">JTAG header SRST, triggers POR</p>       |
+|  <p style="font-size:smaller">IO_UPHY_VPO</p>  |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual UPHY signal for FPGA target</p>     |
+|  <p style="font-size:smaller">IO_UPHY_VMO</p>  |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual UPHY signal for FPGA target</p>     |
+|  <p style="font-size:smaller">IO_UPHY_VP</p>   |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual UPHY signal for FPGA target</p>     |
+|  <p style="font-size:smaller">IO_UPHY_VM</p>   |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual UPHY signal for FPGA target</p>     |
+|  <p style="font-size:smaller">IO_UPHY_OEB</p>  |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual UPHY signal for FPGA target</p>     |
+|  <p style="font-size:smaller">IO_UPHY_RCV</p>  |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual UPHY signal for FPGA target</p>     |
+| <p style="font-size:smaller">IO_UPHY_MODE</p>  |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual UPHY signal for FPGA target</p>     |
+|  <p style="font-size:smaller">IO_UPHY_CFG</p>  |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual UPHY signal for FPGA target</p>     |
 |   <p style="font-size:smaller">IO_CLKOUT</p>   |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |     <p style="font-size:smaller">Manual clock output for SCA setup</p>     |
 |  <p style="font-size:smaller">IO_TRIGGER</p>   |   <p style="font-size:smaller">BidirStd</p>   |  <p style="font-size:smaller">VCC</p>   |    <p style="font-size:smaller">manual</p>    |         <p style="font-size:smaller">-</p>          |                          <p style="font-size:smaller">- / -</p>                           |    <p style="font-size:smaller">Manual trigger output for SCA setup</p>    |
 ## Pinmux Connectivity
diff --git a/hw/top_matcha/ip/pinmux/doc/autogen/targets.md b/hw/top_matcha/ip/pinmux/doc/autogen/targets.md
index 805c020..1f1fe18 100644
--- a/hw/top_matcha/ip/pinmux/doc/autogen/targets.md
+++ b/hw/top_matcha/ip/pinmux/doc/autogen/targets.md
@@ -8,4 +8,4 @@
 |  Target Name  |  #IO Banks  |  #Muxed Pads  |  #Direct Pads  |  #Manual Pads  |  #Total Pads  |                              Pinout / Pinmux Tables                               |
 |:-------------:|:-----------:|:-------------:|:--------------:|:--------------:|:-------------:|:---------------------------------------------------------------------------------:|
 |     ASIC      |      4      |      53       |       14       |       15       |      82       | [Pinout Table](../../../top_matcha/ip/pinmux/doc/autogen/pinout_asic/index.html)  |
-|     NEXUS     |      4      |      53       |       14       |       9        |      76       | [Pinout Table](../../../top_matcha/ip/pinmux/doc/autogen/pinout_nexus/index.html) |
+|     NEXUS     |      4      |      53       |       14       |       17       |      84       | [Pinout Table](../../../top_matcha/ip/pinmux/doc/autogen/pinout_nexus/index.html) |
diff --git a/hw/top_matcha/rtl/autogen/chip_matcha_nexus.sv b/hw/top_matcha/rtl/autogen/chip_matcha_nexus.sv
index fdf4f8b..6ece7be 100644
--- a/hw/top_matcha/rtl/autogen/chip_matcha_nexus.sv
+++ b/hw/top_matcha/rtl/autogen/chip_matcha_nexus.sv
@@ -52,6 +52,14 @@
   inout IO_CLK_N, // Manual Pad
   inout POR_BUTTON_N, // Manual Pad
   inout JTAG_SRST_N, // Manual Pad
+  inout IO_UPHY_VPO, // Manual Pad
+  inout IO_UPHY_VMO, // Manual Pad
+  inout IO_UPHY_VP, // Manual Pad
+  inout IO_UPHY_VM, // Manual Pad
+  inout IO_UPHY_OEB, // Manual Pad
+  inout IO_UPHY_RCV, // Manual Pad
+  inout IO_UPHY_MODE, // Manual Pad
+  inout IO_UPHY_CFG, // Manual Pad
   inout IO_CLKOUT, // Manual Pad
   inout IO_TRIGGER, // Manual Pad
 
@@ -245,6 +253,14 @@
   logic manual_in_io_clk_n, manual_out_io_clk_n, manual_oe_io_clk_n;
   logic manual_in_por_button_n, manual_out_por_button_n, manual_oe_por_button_n;
   logic manual_in_jtag_srst_n, manual_out_jtag_srst_n, manual_oe_jtag_srst_n;
+  logic manual_in_io_uphy_vpo, manual_out_io_uphy_vpo, manual_oe_io_uphy_vpo;
+  logic manual_in_io_uphy_vmo, manual_out_io_uphy_vmo, manual_oe_io_uphy_vmo;
+  logic manual_in_io_uphy_vp, manual_out_io_uphy_vp, manual_oe_io_uphy_vp;
+  logic manual_in_io_uphy_vm, manual_out_io_uphy_vm, manual_oe_io_uphy_vm;
+  logic manual_in_io_uphy_oeb, manual_out_io_uphy_oeb, manual_oe_io_uphy_oeb;
+  logic manual_in_io_uphy_rcv, manual_out_io_uphy_rcv, manual_oe_io_uphy_rcv;
+  logic manual_in_io_uphy_mode, manual_out_io_uphy_mode, manual_oe_io_uphy_mode;
+  logic manual_in_io_uphy_cfg, manual_out_io_uphy_cfg, manual_oe_io_uphy_cfg;
   logic manual_in_io_clkout, manual_out_io_clkout, manual_oe_io_clkout;
   logic manual_in_io_trigger, manual_out_io_trigger, manual_oe_io_trigger;
 
@@ -255,6 +271,14 @@
   pad_attr_t manual_attr_io_clk_n;
   pad_attr_t manual_attr_por_button_n;
   pad_attr_t manual_attr_jtag_srst_n;
+  pad_attr_t manual_attr_io_uphy_vpo;
+  pad_attr_t manual_attr_io_uphy_vmo;
+  pad_attr_t manual_attr_io_uphy_vp;
+  pad_attr_t manual_attr_io_uphy_vm;
+  pad_attr_t manual_attr_io_uphy_oeb;
+  pad_attr_t manual_attr_io_uphy_rcv;
+  pad_attr_t manual_attr_io_uphy_mode;
+  pad_attr_t manual_attr_io_uphy_cfg;
   pad_attr_t manual_attr_io_clkout;
   pad_attr_t manual_attr_io_trigger;
 
@@ -275,11 +299,19 @@
   padring #(
     // Padring specific counts may differ from pinmux config due
     // to custom, stubbed or added pads.
-    .NDioPads(23),
+    .NDioPads(31),
     .NMioPads(53),
     .DioPadType ({
       BidirStd, // IO_TRIGGER
       BidirStd, // IO_CLKOUT
+      BidirStd, // IO_UPHY_CFG
+      BidirStd, // IO_UPHY_MODE
+      BidirStd, // IO_UPHY_RCV
+      BidirStd, // IO_UPHY_OEB
+      BidirStd, // IO_UPHY_VM
+      BidirStd, // IO_UPHY_VP
+      BidirStd, // IO_UPHY_VMO
+      BidirStd, // IO_UPHY_VPO
       InputStd, // JTAG_SRST_N
       InputStd, // POR_BUTTON_N
       AnalogIn0, // IO_CLK_N
@@ -366,6 +398,14 @@
     .dio_pad_io ({
       IO_TRIGGER,
       IO_CLKOUT,
+      IO_UPHY_CFG,
+      IO_UPHY_MODE,
+      IO_UPHY_RCV,
+      IO_UPHY_OEB,
+      IO_UPHY_VM,
+      IO_UPHY_VP,
+      IO_UPHY_VMO,
+      IO_UPHY_VPO,
       JTAG_SRST_N,
       POR_BUTTON_N,
       IO_CLK_N,
@@ -457,6 +497,14 @@
     .dio_in_o ({
         manual_in_io_trigger,
         manual_in_io_clkout,
+        manual_in_io_uphy_cfg,
+        manual_in_io_uphy_mode,
+        manual_in_io_uphy_rcv,
+        manual_in_io_uphy_oeb,
+        manual_in_io_uphy_vm,
+        manual_in_io_uphy_vp,
+        manual_in_io_uphy_vmo,
+        manual_in_io_uphy_vpo,
         manual_in_jtag_srst_n,
         manual_in_por_button_n,
         manual_in_io_clk_n,
@@ -482,6 +530,14 @@
     .dio_out_i ({
         manual_out_io_trigger,
         manual_out_io_clkout,
+        manual_out_io_uphy_cfg,
+        manual_out_io_uphy_mode,
+        manual_out_io_uphy_rcv,
+        manual_out_io_uphy_oeb,
+        manual_out_io_uphy_vm,
+        manual_out_io_uphy_vp,
+        manual_out_io_uphy_vmo,
+        manual_out_io_uphy_vpo,
         manual_out_jtag_srst_n,
         manual_out_por_button_n,
         manual_out_io_clk_n,
@@ -507,6 +563,14 @@
     .dio_oe_i ({
         manual_oe_io_trigger,
         manual_oe_io_clkout,
+        manual_oe_io_uphy_cfg,
+        manual_oe_io_uphy_mode,
+        manual_oe_io_uphy_rcv,
+        manual_oe_io_uphy_oeb,
+        manual_oe_io_uphy_vm,
+        manual_oe_io_uphy_vp,
+        manual_oe_io_uphy_vmo,
+        manual_oe_io_uphy_vpo,
         manual_oe_jtag_srst_n,
         manual_oe_por_button_n,
         manual_oe_io_clk_n,
@@ -532,6 +596,14 @@
     .dio_attr_i ({
         manual_attr_io_trigger,
         manual_attr_io_clkout,
+        manual_attr_io_uphy_cfg,
+        manual_attr_io_uphy_mode,
+        manual_attr_io_uphy_rcv,
+        manual_attr_io_uphy_oeb,
+        manual_attr_io_uphy_vm,
+        manual_attr_io_uphy_vp,
+        manual_attr_io_uphy_vmo,
+        manual_attr_io_uphy_vpo,
         manual_attr_jtag_srst_n,
         manual_attr_por_button_n,
         manual_attr_io_clk_n,
@@ -897,6 +969,45 @@
 
 
 
+  ///////////////////
+  // USB for FPGA  //
+  ///////////////////
+  logic usb_rx_d;
+  logic usb_tx_d;
+  logic usb_tx_se0;
+  logic usb_dp_pullup_en;
+
+  // RCV
+  assign manual_attr_io_uphy_rcv = '0;
+  assign usb_rx_d = manual_in_io_uphy_rcv;
+
+  // OEB
+  assign manual_attr_io_uphy_oeb = '0;
+  assign manual_out_io_uphy_oeb = ~dio_oe[DioUsbdevUsbDp];
+  assign manual_oe_io_uphy_oeb = 1'b1;
+
+  // VP / VPO
+  assign manual_attr_io_uphy_vpo = '0;
+  assign manual_oe_io_uphy_vpo = 1'b1;
+  assign manual_out_io_uphy_vpo = dio_out[DioUsbdevUsbDp];
+  assign dio_in[DioUsbdevUsbDp] = manual_in_io_uphy_vp;
+
+  // VM / VMO
+  assign manual_attr_io_uphy_vmo = '0;
+  assign manual_oe_io_uphy_vmo = 1'b1;
+  assign manual_out_io_uphy_vmo = dio_out[DioUsbdevUsbDn];
+  assign dio_in[DioUsbdevUsbDn] = manual_in_io_uphy_vm;
+
+  // MODE
+  assign manual_attr_io_uphy_mode = '0;
+  assign manual_oe_io_uphy_mode = 1'b1;
+  assign manual_out_io_uphy_mode = 1'b1;
+
+  // CONFIG
+  assign manual_attr_io_uphy_cfg = '0;
+  assign manual_out_io_uphy_cfg = usb_dp_pullup_en;
+  assign manual_oe_io_uphy_cfg = 1'b1;
+
   //////////////////
   // PLL for FPGA //
   //////////////////
diff --git a/hw/top_matcha/rtl/autogen/top_matcha.sv b/hw/top_matcha/rtl/autogen/top_matcha.sv
index 42be2ab..bac7343 100644
--- a/hw/top_matcha/rtl/autogen/top_matcha.sv
+++ b/hw/top_matcha/rtl/autogen/top_matcha.sv
@@ -234,10 +234,10 @@
   input  prim_mubi_pkg::mubi4_t       ast_init_done_i,
   output logic       sck_monitor_o,
   input  logic       usbdev_usb_rx_d_i,
+  output logic       usbdev_usb_rx_enable_o,
   output logic       usbdev_usb_tx_d_o,
   output logic       usbdev_usb_tx_se0_o,
   output logic       usbdev_usb_tx_use_d_se0_o,
-  output logic       usbdev_usb_rx_enable_o,
   output logic       usbdev_usb_ref_val_o,
   output logic       usbdev_usb_ref_pulse_o,
 
diff --git a/util/topgen_matcha/templates/chiplevel.sv.tpl b/util/topgen_matcha/templates/chiplevel.sv.tpl
index 1fdcf86..1629cb6 100644
--- a/util/topgen_matcha/templates/chiplevel.sv.tpl
+++ b/util/topgen_matcha/templates/chiplevel.sv.tpl
@@ -824,6 +824,7 @@
     manual_in_otp_ext_volt
   };
 
+% if target["name"] != "nexus":
   ///////////////////////////////
   // Differential USB Receiver //
   ///////////////////////////////
@@ -863,6 +864,7 @@
     .usb_diff_rx_obs_o ( usb_diff_rx_obs       ),
     .input_o           ( usb_rx_d              )
   );
+% endif
 
   //////////////////////
   // Top-level design //
@@ -975,6 +977,45 @@
 ## FPGA shared                                                   ##
 ###################################################################
 % if target["name"] in ["nexus"]:
+  //////////////////////////////////////////////
+  // USB for FPGA (USB1T1105AMHX transceiver) //
+  //////////////////////////////////////////////
+  logic usb_rx_d;
+  logic usb_tx_d;
+  logic usb_tx_se0;
+  logic usb_dp_pullup_en;
+
+  // RCV
+  assign manual_attr_io_uphy_rcv = '0;
+  assign usb_rx_d = manual_in_io_uphy_rcv;
+
+  // OEB
+  assign manual_attr_io_uphy_oeb = '0;
+  assign manual_out_io_uphy_oeb = ~dio_oe[DioUsbdevUsbDp];
+  assign manual_oe_io_uphy_oeb = 1'b1;
+
+  // VP / VPO
+  assign manual_attr_io_uphy_vpo = '0;
+  assign manual_out_io_uphy_vpo = dio_out[DioUsbdevUsbDp];
+  assign manual_oe_io_uphy_vpo = 1'b1;
+  assign dio_in[DioUsbdevUsbDp] = manual_in_io_uphy_vp;
+
+  // VM / VMO
+  assign manual_attr_io_uphy_vmo = '0;
+  assign manual_out_io_uphy_vmo = dio_out[DioUsbdevUsbDn];
+  assign manual_oe_io_uphy_vmo = 1'b1;
+  assign dio_in[DioUsbdevUsbDn] = manual_in_io_uphy_vm;
+
+  // MODE
+  assign manual_attr_io_uphy_mode = '0;
+  assign manual_out_io_uphy_mode = 1'b1;
+  assign manual_oe_io_uphy_mode = 1'b1;
+
+  // CONFIG
+  assign manual_attr_io_uphy_cfg = '0;
+  assign manual_out_io_uphy_cfg = usb_dp_pullup_en;
+  assign manual_oe_io_uphy_cfg = 1'b1;
+
   //////////////////
   // PLL for FPGA //
   //////////////////