Rework usbdev I/O and top-level integration
This commit reworks the I/O of usbdev to enable automated top-level
integration using topgen:
- Every output gets a separte output-enable signal.
- All outputs are fed to the top-level hierarchy in
`top_earlgrey_asic/verilator...` and into the pad control, where they
might be used in the future.
- Also the differential data is fed to the pad control although it is
currently not used.
Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/hw/ip/usbdev/data/usbdev.hjson b/hw/ip/usbdev/data/usbdev.hjson
index 343e157..d8403af 100644
--- a/hw/ip/usbdev/data/usbdev.hjson
+++ b/hw/ip/usbdev/data/usbdev.hjson
@@ -9,7 +9,7 @@
bus_device: "tlul",
bus_host: "none",
available_inout_list: [
- #{ name: "d", desc: "USB data differential" }
+ { name: "d", desc: "USB data differential" }
{ name: "dp", desc: "USB data D+" }
{ name: "dn", desc: "USB data D-" }
],
@@ -17,7 +17,10 @@
{ name: "sense", desc: "USB host VBUS sense" }
],
available_output_list: [
- { name: "pullup", desc: "USB Full Speed pullup control" }
+ { name: "se0", desc: "USB single-ended zero link state" }
+ { name: "pullup", desc: "USB pullup control" }
+ { name: "tx_mode_se", desc: "USB single-ended transmit mode control" }
+ { name: "suspend", desc: "USB link suspend state" }
],
param_list: [
{ name: "NEndpoints",
@@ -189,9 +192,9 @@
}
{
bits: "15",
- name: "usb_sense",
+ name: "sense",
desc: '''
- Refelects the state of the usb_sense pin. 1 indicates that
+ Refelects the state of the sense pin. 1 indicates that
the host is providing VBUS.
'''
}
diff --git a/hw/ip/usbdev/doc/_index.md b/hw/ip/usbdev/doc/_index.md
index 1515350..35db812 100644
--- a/hw/ip/usbdev/doc/_index.md
+++ b/hw/ip/usbdev/doc/_index.md
@@ -66,54 +66,82 @@
asynchronous buffer SRAM is used for data transfers between the bus
clock and USB clock domains.
+
## USB Interface Pins
-The interface pin table summarizes the external pins.
+Full-Speed USB uses a bidirectional serial interface as shown in Figure 7-24 of the [USB 2.0 Full-Speed specification](https://www.usb.org/document-library/usb-20-specification).
+For reasons of flexibility, this IP block features both differential and single-ended transmit and receive paths.
+For better receive sensitivity, lower transmit jitter and to be standard compliant, a dedicated, differential USB transceiver such as the [USB1T11A](https://www.mouser.com/datasheet/2/149/fairchild%20semiconductor_usb1t11a-320893.pdf) or the [USB1T20](https://www.onsemi.com/pub/Collateral/USB1T20-D.pdf) must be used (see Section 7.1.4.1 of the [USB 2.0 specification](https://www.usb.org/document-library/usb-20-specification)).
+Depending on the selected USB transceiver, either the differential or the single-ended transmit and receive paths or a combination of the two can be used to interface the IP block with the transceiver.
-|External Pin|Internal Signal|Notes|
-|------------|---------------|-----|
-|USB D+, USB D-|usb_d_i, usb_dp_i, usb_dn_i, usb_d_o, usb_se0_o|Interface to a differential USB transceiver. This interface can be selected by writing 1 to {{< regref "phy_config.rx_differential_mode" >}} and {{< regref "phy_config.tx_differential_mode" >}}. In differential mode, the single-ended signals usb_dp_i and usb_dn_i are used to detect the SE0 state.|
-|USB D+, USB D-|usb_dp_i, usb_dn_i, usb_dp_o, usb_dn_o|Single-ended interface to regular IO cells. This interface can be used for prototyping on an FPGA, but will probably not be USB compliant. This interface can be selected by writing 0 to {{< regref "phy_config.rx_differential_mode" >}} and {{< regref "phy_config.tx_differential_mode" >}}.|
-||usb_oe_o|Enable driving the external pins.|
-|[usb_pullup]|usb_pullup_o|When the usb_pullup_o asserts a 1.5k pullup resistor should be connected to D+. This can be done inside the chip or with an external pin. A permanently connected resistor can also be used.|
-|[TX Mode]|tx_mode_se_o|Indicates the selected TX mode. 1 corresponds to single-ended operation.|
-|usb_sense|usb_sense_i|The sense pin indicates the presence of VBUS from the host.|
-
-The USB 2.0 Full Speed specification uses a bidirectional serial interface that can be implemented with pseudo-differential 3.3V GPIO pins and an oversampling receiver for recovery of the bitstream and clock alignment.
-The IP interface for the D+ and D- pins is presented using a pair of transmit signals, a pair of receive signals and a transmit enable.
-External to the IP these should be combined to drive the pins when transmit is enabled and receive when transmit is not enabled.
-Using standard 3.3V I/O pads allows use on most FPGAs although the drive strength and series termination resistors may need to be adjusted to meet the USB signal eye.
+When prototyping on FPGAs (here the interface can be implemented with pseudo-differential 3.3V GPIO pins and an oversampling receiver for recovery of the bitstream and clock alignment), the single-ended signal pairs can be used.
+External to the IP, these should be combined to drive the actual pins when transmit is enabled and receive otherwise.
+Using standard 3.3V IO pads allows use on most FPGAs although the drive strength and series termination resistors may need to be adjusted to meet the USB signal eye.
On a Xilinx Artix-7 (and less well tested Spartan-7) part, setting the driver to the 8mA, FAST setting seems to work well with a 22R series termination (and with a 0R series termination).
-Alternatively, a dedicated USB transceiver can be used.
-This is required for USB compliance.
-Examples for such a transceiver are the USB1T11A or USB1T20.
-In this case differential signaling should be used for better receive sensitivity and lower transmit jitter.
+The following sections describe how the various input/output signals relate to the USB interface pins for the different receive and transmit configurations.
-A Full-Speed device identifies itself by providing a 1.5k pullup
-resistor (to 3.3V) on the D+ line. The IP block produces a signal
-usb_pullup that is asserted when this resistor should be
-presented. This signal will be asserted whenever the interface is
-enabled. In an FPGA implementation this signal can drive a 3.3V output
-pin that is driven high when the signal is asserted and set high
-impedance when the signal is deasserted, and the output pin used to
-drive a 1.5k resistor connected on the board to the D+
-line. Alternatively, it can be used to enable an internal 1.5k pullup
-on the D+ pin.
-The USB Host will identify itself to the device by enabling the 5V
-VBUS power. It may do a hard reset of a port by removing and
-reasserting VBUS (the Linux driver will do this when it finds a port
-in an inconsistent state or a port that generates errors during
-enumeration). The IP detects VBUS through the usb_sense pin. This pin
-is always an input and should be externally connected to detect the
-state of the VBUS. Note that this may require a resistor divider or
-(for USB-C where VBUS can be up to 20V) active level translation to an
-acceptable voltage for the input pin.
+### Data Transmit
+
+The IP block supports both differential and single-ended transmission (TX).
+The TX mode can be selected by setting the `tx_differential_mode` bit in {{< regref "phy_config" >}} to either 1 (differential) or 0 (single ended).
+
+The following table summarizes how the different output signals relate to the USB interface pins.
+
+| External Pins | Internal Signals | Notes |
+|----------------|------------------|-------|
+| D+, D- | d_o | Data output for interfacing with a differential USB transceiver. |
+| \" | se0_o | Signal Single-Ended Zero (SE0) link state to a differential USB transceiver. |
+| \" | dp_o, dn_o | Single-ended data output signals. These can be used to interface to regular IO cells for prototyping on an FPGA, but such an interface will probably not be USB compliant. |
+| [TX Mode] | tx_mode_se_o | Indicates the selected TX mode: single-ended (1) or differential (0) operation. |
+
+Note that according to the [Comportable guideline for peripheral functionality]({{< relref "doc/rm/comportability_specification" >}}), every output signal `name_o` has a dedicated output enable `name_en_o`.
+For TX data, these separate signals `d_en_o`, `dp_en_o` and `dn_en_o` all correspond to the same TX or output enable signal (`OE` in the USB spec).
+
+
+### Data Receive
+
+The IP block supports both differential and single-ended reception (RX).
+The RX mode can be selected by setting the `rx_differential_mode` bit in {{< regref "phy_config" >}} to either 1 (differential) or 0 (single ended).
+
+The following table summarizes how the different input signals relate to the USB interface pins.
+
+| External Pins | Internal Signals | Notes |
+|----------------|------------------|-------|
+| D+, D- | d_i | Data input for interfacing with a differential USB transceiver. Used in differential RX mode only. |
+| \" | dp_i, dn_i | Single-ended data input signals. These signals are used to detect the SE0 link state in differential RX mode. They can further be used to interface to regular IO cells for prototyping on an FPGA, but such an interface will probably not be USB compliant. |
+
+
+### Non-Data Pins
+
+The USB device features the following non-data pins.
+
+| External Pins | Internal Signals | Notes |
+|----------------|------------------|-------|
+| sense (VBUS) | sense_i | The sense pin indicates the presence of VBUS from the USB host. |
+| [pullup] | pullup_o | When the pullup_o asserts a 1.5k pullup resistor should be connected to D+. This can be done inside the chip or with an external pin. A permanently connected resistor can also be used. |
+| [suspend] | suspend_o | The suspend pin indicates to the USB transceiver that a constant idle has been detected on the link and the device is in the Suspended state (see Section 7.1.7.6 of the [USB 2.0 specification](https://www.usb.org/document-library/usb-20-specification)). |
+
+The USB host will identify itself to the device by enabling the 5V VBUS power.
+It may do a hard reset of a port by removing and reasserting VBUS (the Linux driver will do this when it finds a port in an inconsistent state or a port that generates errors during enumeration).
+The IP block detects VBUS through the sense pin.
+This pin is always an input and should be externally connected to detect the state of the VBUS.
+Note that this may require a resistor divider or (for USB-C where VBUS can be up to 20V) active level translation to an acceptable voltage for the input pin.
+
+A Full-Speed device identifies itself by providing a 1.5k pullup resistor (to 3.3V) on the D+ line.
+The IP block produces a signal `pullup_o` that is asserted when this resistor should be presented.
+This signal will be asserted whenever the interface is enabled.
+In an FPGA implementation, this signal can drive a 3.3V output pin that is driven high when the signal is asserted and set high impedance when the signal is deasserted, and the output pin used to drive a 1.5k resistor connected on the board to the D+ line.
+Alternatively, it can be used to enable an internal 1.5k pullup on the D+ pin.
+
+
+## Hardware Interfaces
{{< hwcfg "hw/ip/usbdev/data/usbdev.hjson" >}}
+
## USB Link State
The USB link has a number of states.
diff --git a/hw/ip/usbdev/dv/tb/tb.sv b/hw/ip/usbdev/dv/tb/tb.sv
index 194584c..ef8b2fe 100644
--- a/hw/ip/usbdev/dv/tb/tb.sv
+++ b/hw/ip/usbdev/dv/tb/tb.sv
@@ -54,23 +54,27 @@
.tl_i (tl_if.h2d ),
.tl_o (tl_if.d2h ),
-
// USB Interface
// TOOD: need to hook up an interface
+ .cio_sense_i (1'b0),
.cio_d_i (1'b0),
.cio_dp_i (1'b1),
.cio_dn_i (1'b0),
- .cio_d_o (),
.cio_se0_o (),
- .cio_dp_o (),
- .cio_dn_o (),
- .cio_oe_o (),
-
- .cio_tx_mode_se_o (),
- .cio_sense_i (1'b0),
+ .cio_se0_en_o (),
+ .cio_pullup_o (),
.cio_pullup_en_o (),
+ .cio_tx_mode_se_o (),
+ .cio_tx_mode_se_en_o (),
.cio_suspend_o (),
+ .cio_suspend_en_o (),
+ .cio_d_o (),
+ .cio_d_en_o (),
+ .cio_dp_o (),
+ .cio_dp_en_o (),
+ .cio_dn_o (),
+ .cio_dn_en_o (),
// Interrupts
.intr_pkt_received_o (intr_pkt_received ),
diff --git a/hw/ip/usbdev/rtl/usbdev.sv b/hw/ip/usbdev/rtl/usbdev.sv
index 347af2a..35c2dcf 100644
--- a/hw/ip/usbdev/rtl/usbdev.sv
+++ b/hw/ip/usbdev/rtl/usbdev.sv
@@ -17,21 +17,29 @@
input tlul_pkg::tl_h2d_t tl_i,
output tlul_pkg::tl_d2h_t tl_o,
- // USB Interface
- input logic cio_d_i,
- input logic cio_dp_i,
- input logic cio_dn_i,
+ // Data inputs
+ input logic cio_d_i, // differential
+ input logic cio_dp_i, // single-ended, can be used in differential mode to detect SE0
+ input logic cio_dn_i, // single-ended, can be used in differential mode to detect SE0
+ // Data outputs
output logic cio_d_o,
- output logic cio_se0_o,
+ output logic cio_d_en_o,
output logic cio_dp_o,
+ output logic cio_dp_en_o,
output logic cio_dn_o,
- output logic cio_oe_o,
+ output logic cio_dn_en_o,
- output logic cio_tx_mode_se_o,
+ // Non-data I/O
input logic cio_sense_i,
+ output logic cio_se0_o,
+ output logic cio_se0_en_o,
+ output logic cio_pullup_o,
output logic cio_pullup_en_o,
output logic cio_suspend_o,
+ output logic cio_suspend_en_o,
+ output logic cio_tx_mode_se_o,
+ output logic cio_tx_mode_se_en_o,
// Interrupts
output logic intr_pkt_received_o, // Packet received
@@ -858,7 +866,7 @@
.rx_differential_mode_i (reg2hw.phy_config.rx_differential_mode),
.tx_differential_mode_i (reg2hw.phy_config.tx_differential_mode),
.sys_reg2hw_config_i (reg2hw.phy_config),
- .sys_usb_sense_o (hw2reg.usbstat.usb_sense.d),
+ .sys_usb_sense_o (hw2reg.usbstat.sense.d),
// Chip IO
.cio_usb_d_i (cio_d_i),
@@ -868,7 +876,7 @@
.cio_usb_se0_o (cio_se0_o),
.cio_usb_dp_o (cio_dp_o),
.cio_usb_dn_o (cio_dn_o),
- .cio_usb_oe_o (cio_oe_o),
+ .cio_usb_oe_o (cio_oe),
.cio_usb_tx_mode_se_o (cio_tx_mode_se_o),
.cio_usb_sense_i (cio_sense_i),
.cio_usb_pullup_en_o (cio_pullup_en_o),
@@ -885,4 +893,22 @@
.usb_suspend_i (usb_event_link_suspend)
);
+ ////////////////////////
+ // USB Output Enables //
+ ////////////////////////
+ logic cio_oe;
+
+ // Data outputs
+ assign cio_d_en_o = cio_oe;
+ assign cio_dp_en_o = cio_oe;
+ assign cio_dn_en_o = cio_oe;
+
+ // Non-data outputs - always enabled.
+ assign cio_se0_en_o = 1'b1;
+ assign cio_suspend_en_o = 1'b1;
+ assign cio_tx_mode_se_en_o = 1'b1;
+
+ // Pullup
+ assign cio_pullup_o = 1'b1;
+
endmodule
diff --git a/hw/ip/usbdev/rtl/usbdev_reg_pkg.sv b/hw/ip/usbdev/rtl/usbdev_reg_pkg.sv
index 2edaa17..3dc471e 100644
--- a/hw/ip/usbdev/rtl/usbdev_reg_pkg.sv
+++ b/hw/ip/usbdev/rtl/usbdev_reg_pkg.sv
@@ -355,7 +355,7 @@
} link_state;
struct packed {
logic d;
- } usb_sense;
+ } sense;
struct packed {
logic [2:0] d;
} av_depth;
diff --git a/hw/ip/usbdev/rtl/usbdev_reg_top.sv b/hw/ip/usbdev/rtl/usbdev_reg_top.sv
index afd2600..8960d08 100644
--- a/hw/ip/usbdev/rtl/usbdev_reg_top.sv
+++ b/hw/ip/usbdev/rtl/usbdev_reg_top.sv
@@ -257,8 +257,8 @@
logic usbstat_host_lost_re;
logic [2:0] usbstat_link_state_qs;
logic usbstat_link_state_re;
- logic usbstat_usb_sense_qs;
- logic usbstat_usb_sense_re;
+ logic usbstat_sense_qs;
+ logic usbstat_sense_re;
logic [2:0] usbstat_av_depth_qs;
logic usbstat_av_depth_re;
logic usbstat_av_full_qs;
@@ -1821,18 +1821,18 @@
);
- // F[usb_sense]: 15:15
+ // F[sense]: 15:15
prim_subreg_ext #(
.DW (1)
- ) u_usbstat_usb_sense (
- .re (usbstat_usb_sense_re),
+ ) u_usbstat_sense (
+ .re (usbstat_sense_re),
.we (1'b0),
.wd ('0),
- .d (hw2reg.usbstat.usb_sense.d),
+ .d (hw2reg.usbstat.sense.d),
.qre (),
.qe (),
.q (),
- .qs (usbstat_usb_sense_qs)
+ .qs (usbstat_sense_qs)
);
@@ -5514,7 +5514,7 @@
assign usbstat_link_state_re = addr_hit[4] && reg_re;
- assign usbstat_usb_sense_re = addr_hit[4] && reg_re;
+ assign usbstat_sense_re = addr_hit[4] && reg_re;
assign usbstat_av_depth_re = addr_hit[4] && reg_re;
@@ -5980,7 +5980,7 @@
reg_rdata_next[10:0] = usbstat_frame_qs;
reg_rdata_next[11] = usbstat_host_lost_qs;
reg_rdata_next[14:12] = usbstat_link_state_qs;
- reg_rdata_next[15] = usbstat_usb_sense_qs;
+ reg_rdata_next[15] = usbstat_sense_qs;
reg_rdata_next[18:16] = usbstat_av_depth_qs;
reg_rdata_next[23] = usbstat_av_full_qs;
reg_rdata_next[26:24] = usbstat_rx_depth_qs;
diff --git a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
index f5e51a3..c4c83f8 100644
--- a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
+++ b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
@@ -584,14 +584,34 @@
available_output_list:
[
{
+ name: se0
+ width: 1
+ type: output
+ }
+ {
name: pullup
width: 1
type: output
}
+ {
+ name: tx_mode_se
+ width: 1
+ type: output
+ }
+ {
+ name: suspend
+ width: 1
+ type: output
+ }
]
available_inout_list:
[
{
+ name: d
+ width: 1
+ type: inout
+ }
+ {
name: dp
width: 1
type: inout
@@ -1471,7 +1491,7 @@
name: usbdev
pad:
[
- ChC[0..3]
+ ChC[0..7]
]
}
]
@@ -1572,7 +1592,7 @@
]
}
{
- name: usbdev_pullup
+ name: usbdev_se0
width: 1
type: output
pad:
@@ -1584,6 +1604,54 @@
]
}
{
+ name: usbdev_pullup
+ width: 1
+ type: output
+ pad:
+ [
+ {
+ name: ChC
+ index: 2
+ }
+ ]
+ }
+ {
+ name: usbdev_tx_mode_se
+ width: 1
+ type: output
+ pad:
+ [
+ {
+ name: ChC
+ index: 3
+ }
+ ]
+ }
+ {
+ name: usbdev_suspend
+ width: 1
+ type: output
+ pad:
+ [
+ {
+ name: ChC
+ index: 4
+ }
+ ]
+ }
+ {
+ name: usbdev_d
+ width: 1
+ type: inout
+ pad:
+ [
+ {
+ name: ChC
+ index: 5
+ }
+ ]
+ }
+ {
name: usbdev_dp
width: 1
type: inout
@@ -1591,7 +1659,7 @@
[
{
name: ChC
- index: 2
+ index: 6
}
]
}
@@ -1603,7 +1671,7 @@
[
{
name: ChC
- index: 3
+ index: 7
}
]
}
diff --git a/hw/top_earlgrey/data/top_earlgrey.hjson b/hw/top_earlgrey/data/top_earlgrey.hjson
index b99152c..c5b1fd0 100644
--- a/hw/top_earlgrey/data/top_earlgrey.hjson
+++ b/hw/top_earlgrey/data/top_earlgrey.hjson
@@ -231,7 +231,7 @@
//{ name: "uart.tx", pad: ["ChA[0]"]},
{ name: "uart", pad: ["ChA[0..1]"]},
// { name: "dio_module.signal_input", pad: ["ChA[31]"] }
- { name: "usbdev", pad: ["ChC[0..3]"]},
+ { name: "usbdev", pad: ["ChC[0..7]"]},
],
// Multiplexing IO modules. The in/out ports of the modules below are
diff --git a/hw/top_earlgrey/data/top_earlgrey.sv.tpl b/hw/top_earlgrey/data/top_earlgrey.sv.tpl
index fff0d50..834dfd9 100644
--- a/hw/top_earlgrey/data/top_earlgrey.sv.tpl
+++ b/hw/top_earlgrey/data/top_earlgrey.sv.tpl
@@ -543,42 +543,21 @@
.tl_h_o (tl_${m["name"]}_h_h2d),
.tl_h_i (tl_${m["name"]}_h_d2h),
% endif
- % if m["type"] == "usbdev":
-
- // Differential data - Currently not used.
- .cio_d_i (1'b0),
- .cio_d_o (),
- .cio_se0_o (),
-
- // Single-ended data
- .cio_dp_i (cio_usbdev_dp_p2d),
- .cio_dn_i (cio_usbdev_dn_p2d),
- .cio_dp_o (cio_usbdev_dp_d2p),
- .cio_dn_o (cio_usbdev_dn_d2p),
-
- // Non-data I/O
- .cio_sense_i (cio_usbdev_sense_p2d),
- .cio_oe_o (cio_usbdev_dp_en_d2p),
- .cio_tx_mode_se_o (),
- .cio_pullup_en_o (cio_usbdev_pullup_en_d2p),
- .cio_suspend_o (),
- % else:
- % for p_in in m["available_input_list"] + m["available_inout_list"]:
- % if loop.first:
+ % for p_in in m["available_input_list"] + m["available_inout_list"]:
+ % if loop.first:
// Input
- % endif
+ % endif
.${lib.ljust("cio_"+p_in["name"]+"_i",max_sigwidth+9)} (cio_${m["name"]}_${p_in["name"]}_p2d),
- % endfor
- % for p_out in m["available_output_list"] + m["available_inout_list"]:
- % if loop.first:
+ % endfor
+ % for p_out in m["available_output_list"] + m["available_inout_list"]:
+ % if loop.first:
// Output
- % endif
+ % endif
.${lib.ljust("cio_"+p_out["name"]+"_o", max_sigwidth+9)} (cio_${m["name"]}_${p_out["name"]}_d2p),
.${lib.ljust("cio_"+p_out["name"]+"_en_o",max_sigwidth+9)} (cio_${m["name"]}_${p_out["name"]}_en_d2p),
- % endfor
- % endif
+ % endfor
% for intr in m["interrupt_list"] if "interrupt_list" in m else []:
% if loop.first:
@@ -662,10 +641,6 @@
);
% endfor
- // USB assignments
- assign cio_usbdev_dn_en_d2p = cio_usbdev_dp_en_d2p; // have a single output enable only
- assign cio_usbdev_pullup_d2p = 1'b1;
-
// interrupt assignments
assign intr_vector = {
% for intr in top["interrupt"][::-1]:
diff --git a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
index fa6ba2d..2c3da6d 100644
--- a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
+++ b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
@@ -34,8 +34,17 @@
output logic dio_uart_tx_o,
output logic dio_uart_tx_en_o,
input dio_usbdev_sense_i,
+ output logic dio_usbdev_se0_o,
+ output logic dio_usbdev_se0_en_o,
output logic dio_usbdev_pullup_o,
output logic dio_usbdev_pullup_en_o,
+ output logic dio_usbdev_tx_mode_se_o,
+ output logic dio_usbdev_tx_mode_se_en_o,
+ output logic dio_usbdev_suspend_o,
+ output logic dio_usbdev_suspend_en_o,
+ input dio_usbdev_d_i,
+ output logic dio_usbdev_d_o,
+ output logic dio_usbdev_d_en_o,
input dio_usbdev_dp_i,
output logic dio_usbdev_dp_o,
output logic dio_usbdev_dp_en_o,
@@ -154,10 +163,19 @@
// nmi_gen
// usbdev
logic cio_usbdev_sense_p2d;
+ logic cio_usbdev_d_p2d;
logic cio_usbdev_dp_p2d;
logic cio_usbdev_dn_p2d;
+ logic cio_usbdev_se0_d2p;
+ logic cio_usbdev_se0_en_d2p;
logic cio_usbdev_pullup_d2p;
logic cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_tx_mode_se_d2p;
+ logic cio_usbdev_tx_mode_se_en_d2p;
+ logic cio_usbdev_suspend_d2p;
+ logic cio_usbdev_suspend_en_d2p;
+ logic cio_usbdev_d_d2p;
+ logic cio_usbdev_d_en_d2p;
logic cio_usbdev_dp_d2p;
logic cio_usbdev_dp_en_d2p;
logic cio_usbdev_dn_d2p;
@@ -676,23 +694,27 @@
.tl_i (tl_usbdev_d_h2d),
.tl_o (tl_usbdev_d_d2h),
- // Differential data - Currently not used.
- .cio_d_i (1'b0),
- .cio_d_o (),
- .cio_se0_o (),
+ // Input
+ .cio_sense_i (cio_usbdev_sense_p2d),
+ .cio_d_i (cio_usbdev_d_p2d),
+ .cio_dp_i (cio_usbdev_dp_p2d),
+ .cio_dn_i (cio_usbdev_dn_p2d),
- // Single-ended data
- .cio_dp_i (cio_usbdev_dp_p2d),
- .cio_dn_i (cio_usbdev_dn_p2d),
- .cio_dp_o (cio_usbdev_dp_d2p),
- .cio_dn_o (cio_usbdev_dn_d2p),
-
- // Non-data I/O
- .cio_sense_i (cio_usbdev_sense_p2d),
- .cio_oe_o (cio_usbdev_dp_en_d2p),
- .cio_tx_mode_se_o (),
- .cio_pullup_en_o (cio_usbdev_pullup_en_d2p),
- .cio_suspend_o (),
+ // Output
+ .cio_se0_o (cio_usbdev_se0_d2p),
+ .cio_se0_en_o (cio_usbdev_se0_en_d2p),
+ .cio_pullup_o (cio_usbdev_pullup_d2p),
+ .cio_pullup_en_o (cio_usbdev_pullup_en_d2p),
+ .cio_tx_mode_se_o (cio_usbdev_tx_mode_se_d2p),
+ .cio_tx_mode_se_en_o (cio_usbdev_tx_mode_se_en_d2p),
+ .cio_suspend_o (cio_usbdev_suspend_d2p),
+ .cio_suspend_en_o (cio_usbdev_suspend_en_d2p),
+ .cio_d_o (cio_usbdev_d_d2p),
+ .cio_d_en_o (cio_usbdev_d_en_d2p),
+ .cio_dp_o (cio_usbdev_dp_d2p),
+ .cio_dp_en_o (cio_usbdev_dp_en_d2p),
+ .cio_dn_o (cio_usbdev_dn_d2p),
+ .cio_dn_en_o (cio_usbdev_dn_en_d2p),
// Interrupt
.intr_pkt_received_o (intr_usbdev_pkt_received),
@@ -718,10 +740,6 @@
.rst_usb_48mhz_ni (usb_rst_n)
);
- // USB assignments
- assign cio_usbdev_dn_en_d2p = cio_usbdev_dp_en_d2p; // have a single output enable only
- assign cio_usbdev_pullup_d2p = 1'b1;
-
// interrupt assignments
assign intr_vector = {
intr_usbdev_connected,
@@ -843,23 +861,32 @@
cio_gpio_gpio_p2d
} = m2p;
- assign cio_spi_device_sck_p2d = dio_spi_device_sck_i;
- assign cio_spi_device_csb_p2d = dio_spi_device_csb_i;
- assign cio_spi_device_mosi_p2d = dio_spi_device_mosi_i;
- assign dio_spi_device_miso_o = cio_spi_device_miso_d2p;
- assign dio_spi_device_miso_en_o = cio_spi_device_miso_en_d2p;
- assign cio_uart_rx_p2d = dio_uart_rx_i;
- assign dio_uart_tx_o = cio_uart_tx_d2p;
- assign dio_uart_tx_en_o = cio_uart_tx_en_d2p;
- assign cio_usbdev_sense_p2d = dio_usbdev_sense_i;
- assign dio_usbdev_pullup_o = cio_usbdev_pullup_d2p;
- assign dio_usbdev_pullup_en_o = cio_usbdev_pullup_en_d2p;
- assign cio_usbdev_dp_p2d = dio_usbdev_dp_i;
- assign dio_usbdev_dp_o = cio_usbdev_dp_d2p;
- assign dio_usbdev_dp_en_o = cio_usbdev_dp_en_d2p;
- assign cio_usbdev_dn_p2d = dio_usbdev_dn_i;
- assign dio_usbdev_dn_o = cio_usbdev_dn_d2p;
- assign dio_usbdev_dn_en_o = cio_usbdev_dn_en_d2p;
+ assign cio_spi_device_sck_p2d = dio_spi_device_sck_i;
+ assign cio_spi_device_csb_p2d = dio_spi_device_csb_i;
+ assign cio_spi_device_mosi_p2d = dio_spi_device_mosi_i;
+ assign dio_spi_device_miso_o = cio_spi_device_miso_d2p;
+ assign dio_spi_device_miso_en_o = cio_spi_device_miso_en_d2p;
+ assign cio_uart_rx_p2d = dio_uart_rx_i;
+ assign dio_uart_tx_o = cio_uart_tx_d2p;
+ assign dio_uart_tx_en_o = cio_uart_tx_en_d2p;
+ assign cio_usbdev_sense_p2d = dio_usbdev_sense_i;
+ assign dio_usbdev_se0_o = cio_usbdev_se0_d2p;
+ assign dio_usbdev_se0_en_o = cio_usbdev_se0_en_d2p;
+ assign dio_usbdev_pullup_o = cio_usbdev_pullup_d2p;
+ assign dio_usbdev_pullup_en_o = cio_usbdev_pullup_en_d2p;
+ assign dio_usbdev_tx_mode_se_o = cio_usbdev_tx_mode_se_d2p;
+ assign dio_usbdev_tx_mode_se_en_o = cio_usbdev_tx_mode_se_en_d2p;
+ assign dio_usbdev_suspend_o = cio_usbdev_suspend_d2p;
+ assign dio_usbdev_suspend_en_o = cio_usbdev_suspend_en_d2p;
+ assign cio_usbdev_d_p2d = dio_usbdev_d_i;
+ assign dio_usbdev_d_o = cio_usbdev_d_d2p;
+ assign dio_usbdev_d_en_o = cio_usbdev_d_en_d2p;
+ assign cio_usbdev_dp_p2d = dio_usbdev_dp_i;
+ assign dio_usbdev_dp_o = cio_usbdev_dp_d2p;
+ assign dio_usbdev_dp_en_o = cio_usbdev_dp_en_d2p;
+ assign cio_usbdev_dn_p2d = dio_usbdev_dn_i;
+ assign dio_usbdev_dn_o = cio_usbdev_dn_d2p;
+ assign dio_usbdev_dn_en_o = cio_usbdev_dn_en_d2p;
// make sure scanmode_i is never X (including during reset)
`ASSERT_KNOWN(scanmodeKnown, scanmode_i, clk_i, 0)
diff --git a/hw/top_earlgrey/rtl/padctl.sv b/hw/top_earlgrey/rtl/padctl.sv
index 89f737d..9530d28 100644
--- a/hw/top_earlgrey/rtl/padctl.sv
+++ b/hw/top_earlgrey/rtl/padctl.sv
@@ -33,8 +33,17 @@
inout IO_GP15,
// USB device side
output cio_usbdev_sense_p2d,
+ input cio_usbdev_se0_d2p,
+ input cio_usbdev_se0_en_d2p,
input cio_usbdev_pullup_d2p,
input cio_usbdev_pullup_en_d2p,
+ input cio_usbdev_tx_mode_se_d2p,
+ input cio_usbdev_tx_mode_se_en_d2p,
+ input cio_usbdev_suspend_d2p,
+ input cio_usbdev_suspend_en_d2p,
+ output cio_usbdev_d_p2d,
+ input cio_usbdev_d_d2p,
+ input cio_usbdev_d_en_d2p,
output cio_usbdev_dp_p2d,
input cio_usbdev_dp_d2p,
input cio_usbdev_dp_en_d2p,
@@ -84,6 +93,21 @@
assign cio_usbdev_dp_p2d = cio_usbdev_dp_en_d2p ? 1'b1 : IO_USB_DP0;
assign cio_usbdev_dn_p2d = cio_usbdev_dn_en_d2p ? 1'b0 : IO_USB_DN0;
+ // Tie off unused signals.
+ logic unused_cio_usbdev_se0_d2p, unused_cio_usbdev_se0_en_d2p;
+ logic unused_cio_usbdev_tx_mode_se_d2p, unused_cio_usbdev_tx_mode_se_en_d2p;
+ logic unused_cio_usbdev_supsend_d2p, unused_cio_usbdev_supsend_en_d2p;
+ logic unused_cio_usbdev_d_d2p, unused_cio_usbdev_d_en_d2p;
+ assign unused_cio_usbdev_se0_d2p = cio_usbdev_se0_d2p;
+ assign unused_cio_usbdev_se0_en_d2p = cio_usbdev_se0_en_d2p;
+ assign unused_cio_usbdev_tx_mode_se_d2p = cio_usbdev_tx_mode_se_d2p;
+ assign unused_cio_usbdev_tx_mode_se_en_d2p = cio_usbdev_tx_mode_se_en_d2p;
+ assign unused_cio_usbdev_suspend_d2p = cio_usbdev_suspend_d2p;
+ assign unused_cio_usbdev_suspend_en_d2p = cio_usbdev_suspend_en_d2p;
+ assign cio_usbdev_d_p2d = 1'b0;
+ assign unused_cio_usbdev_d_d2p = cio_usbdev_d_d2p;
+ assign unused_cio_usbdev_d_en_d2p = cio_usbdev_d_en_d2p;
+
// JTAG or SPI mux to the FTDI MSEE pins DPS0-DPS6
logic jtag_spi_n, dps2, dps2_en;
logic boot_strap;
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_artys7.sv b/hw/top_earlgrey/rtl/top_earlgrey_artys7.sv
index 5df9b76..eb14796 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_artys7.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_artys7.sv
@@ -42,7 +42,12 @@
logic clk_sys, clk_48mhz, rst_sys_n;
logic [31:0] cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
logic cio_uart_rx_p2d, cio_uart_tx_d2p, cio_uart_tx_en_d2p;
- logic cio_usbdev_sense_p2d, cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_sense_p2d;
+ logic cio_usbdev_se0_d2p, cio_usbdev_se0_en_d2p;
+ logic cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_tx_mode_se_d2p, cio_usbdev_tx_mode_se_en_d2p;
+ logic cio_usbdev_supsend_d2p, cio_usbdev_supsend_en_d2p;
+ logic cio_usbdev_d_p2d, cio_usbdev_d_d2p, cio_usbdev_d_en_d2p;
logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
@@ -55,36 +60,45 @@
// Top-level design
top_earlgrey top_earlgrey (
- .clk_i (clk_sys),
- .rst_ni (rst_sys_n),
+ .clk_i (clk_sys),
+ .rst_ni (rst_sys_n),
- .clk_usb_48mhz_i (clk_48mhz),
+ .clk_usb_48mhz_i (clk_48mhz),
- .jtag_tck_i (IO_JTCK),
- .jtag_tms_i (IO_JTMS),
- .jtag_trst_ni (IO_JTRST_N),
- .jtag_td_i (IO_JTDI),
- .jtag_td_o (IO_JTDO),
+ .jtag_tck_i (IO_JTCK),
+ .jtag_tms_i (IO_JTMS),
+ .jtag_trst_ni (IO_JTRST_N),
+ .jtag_td_i (IO_JTDI),
+ .jtag_td_o (IO_JTDO),
- .dio_uart_rx_i (cio_uart_rx_p2d),
- .dio_uart_tx_o (cio_uart_tx_d2p),
- .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
+ .dio_uart_rx_i (cio_uart_rx_p2d),
+ .dio_uart_tx_o (cio_uart_tx_d2p),
+ .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
- .mio_in_i (cio_gpio_p2d),
- .mio_out_o (cio_gpio_d2p),
- .mio_oe_o (cio_gpio_en_d2p),
+ .mio_in_i (cio_gpio_p2d),
+ .mio_out_o (cio_gpio_d2p),
+ .mio_oe_o (cio_gpio_en_d2p),
- .dio_usbdev_sense_i (cio_usbdev_sense_p2d),
- .dio_usbdev_pullup_o (cio_usbdev_pullup_d2p),
- .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
- .dio_usbdev_dp_i (cio_usbdev_dp_p2d),
- .dio_usbdev_dp_o (cio_usbdev_dp_d2p),
- .dio_usbdev_dp_en_o (cio_usbdev_dp_en_d2p),
- .dio_usbdev_dn_i (cio_usbdev_dn_p2d),
- .dio_usbdev_dn_o (cio_usbdev_dn_d2p),
- .dio_usbdev_dn_en_o (cio_usbdev_dn_en_d2p),
+ .dio_usbdev_sense_i (cio_usbdev_sense_p2d),
+ .dio_usbdev_se0_o (cio_usbdev_se0_d2p),
+ .dio_usbdev_se0_en_o (cio_usbdev_se0_en_d2p),
+ .dio_usbdev_pullup_o (cio_usbdev_pullup_d2p),
+ .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
+ .dio_usbdev_tx_mode_se_o (cio_usbdev_tx_mode_se_d2p),
+ .dio_usbdev_tx_mode_se_en_o (cio_usbdev_tx_mode_se_en_d2p),
+ .dio_usbdev_suspend_o (cio_usbdev_suspend_d2p),
+ .dio_usbdev_suspend_en_o (cio_usbdev_suspend_en_d2p),
+ .dio_usbdev_d_i (cio_usbdev_d_p2d),
+ .dio_usbdev_d_o (cio_usbdev_d_d2p),
+ .dio_usbdev_d_en_o (cio_usbdev_d_en_d2p),
+ .dio_usbdev_dp_i (cio_usbdev_dp_p2d),
+ .dio_usbdev_dp_o (cio_usbdev_dp_d2p),
+ .dio_usbdev_dp_en_o (cio_usbdev_dp_en_d2p),
+ .dio_usbdev_dn_i (cio_usbdev_dn_p2d),
+ .dio_usbdev_dn_o (cio_usbdev_dn_d2p),
+ .dio_usbdev_dn_en_o (cio_usbdev_dn_en_d2p),
- .scanmode_i (1'b0) // 1 for Scan
+ .scanmode_i (1'b0) // 1 for Scan
);
// Clock and reset
@@ -104,8 +118,17 @@
.cio_uart_tx_en_d2p,
// USB
.cio_usbdev_sense_p2d(cio_usbdev_sense_p2d),
+ .cio_usbdev_se0_d2p(cio_usbdev_se0_d2p),
+ .cio_usbdev_se0_en_d2p(cio_usbdev_se0_en_d2p),
.cio_usbdev_pullup_d2p(cio_usbdev_pullup_d2p),
.cio_usbdev_pullup_en_d2p(cio_usbdev_pullup_en_d2p),
+ .cio_usbdev_tx_mode_se_d2p(cio_usbdev_tx_mode_se_d2p),
+ .cio_usbdev_tx_mode_se_en_d2p(cio_usbdev_tx_mode_se_en_d2p),
+ .cio_usbdev_suspend_d2p(cio_usbdev_suspend_d2p),
+ .cio_usbdev_suspend_en_d2p(cio_usbdev_suspend_en_d2p),
+ .cio_usbdev_d_p2d(cio_usbdev_d_p2d),
+ .cio_usbdev_d_d2p(cio_usbdev_d_d2p),
+ .cio_usbdev_d_en_d2p(cio_usbdev_d_en_d2p),
.cio_usbdev_dp_p2d(cio_usbdev_dp_p2d),
.cio_usbdev_dp_d2p(cio_usbdev_dp_d2p),
.cio_usbdev_dp_en_d2p(cio_usbdev_dp_en_d2p),
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_asic.sv b/hw/top_earlgrey/rtl/top_earlgrey_asic.sv
index 18c18f0..561a8ac 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_asic.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_asic.sv
@@ -49,48 +49,62 @@
cio_spi_device_miso_d2p, cio_spi_device_miso_en_d2p;
logic cio_jtag_tck_p2d, cio_jtag_tms_p2d, cio_jtag_tdi_p2d, cio_jtag_tdo_d2p;
logic cio_jtag_trst_n_p2d, cio_jtag_srst_n_p2d;
- logic cio_usbdev_sense_p2d, cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_sense_p2d;
+ logic cio_usbdev_se0_d2p, cio_usbdev_se0_en_d2p;
+ logic cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_tx_mode_se_d2p, cio_usbdev_tx_mode_se_en_d2p;
+ logic cio_usbdev_supsend_d2p, cio_usbdev_supsend_en_d2p;
+ logic cio_usbdev_d_p2d, cio_usbdev_d_d2p, cio_usbdev_d_en_d2p;
logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
// Top-level design
top_earlgrey top_earlgrey (
- .clk_i (IO_CLK),
- .rst_ni (IO_RST_N),
+ .clk_i (IO_CLK),
+ .rst_ni (IO_RST_N),
- .clk_usb_48mhz_i (IO_CLK_USB_48MHZ),
+ .clk_usb_48mhz_i (IO_CLK_USB_48MHZ),
- .jtag_tck_i (cio_jtag_tck_p2d),
- .jtag_tms_i (cio_jtag_tms_p2d),
- .jtag_trst_ni (cio_jtag_trst_n_p2d),
- .jtag_td_i (cio_jtag_tdi_p2d),
- .jtag_td_o (cio_jtag_tdo_d2p),
+ .jtag_tck_i (cio_jtag_tck_p2d),
+ .jtag_tms_i (cio_jtag_tms_p2d),
+ .jtag_trst_ni (cio_jtag_trst_n_p2d),
+ .jtag_td_i (cio_jtag_tdi_p2d),
+ .jtag_td_o (cio_jtag_tdo_d2p),
- .dio_spi_device_sck_i (cio_spi_device_sck_p2d),
- .dio_spi_device_csb_i (cio_spi_device_csb_p2d),
- .dio_spi_device_mosi_i (cio_spi_device_mosi_p2d),
- .dio_spi_device_miso_o (cio_spi_device_miso_d2p),
- .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
+ .dio_spi_device_sck_i (cio_spi_device_sck_p2d),
+ .dio_spi_device_csb_i (cio_spi_device_csb_p2d),
+ .dio_spi_device_mosi_i (cio_spi_device_mosi_p2d),
+ .dio_spi_device_miso_o (cio_spi_device_miso_d2p),
+ .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
- .dio_uart_rx_i (cio_uart_rx_p2d),
- .dio_uart_tx_o (cio_uart_tx_d2p),
- .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
+ .dio_uart_rx_i (cio_uart_rx_p2d),
+ .dio_uart_tx_o (cio_uart_tx_d2p),
+ .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
- .dio_usbdev_sense_i (cio_usbdev_sense_p2d),
- .dio_usbdev_pullup_o (cio_usbdev_pullup_d2p),
- .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
- .dio_usbdev_dp_i (cio_usbdev_dp_p2d),
- .dio_usbdev_dp_o (cio_usbdev_dp_d2p),
- .dio_usbdev_dp_en_o (cio_usbdev_dp_en_d2p),
- .dio_usbdev_dn_i (cio_usbdev_dn_p2d),
- .dio_usbdev_dn_o (cio_usbdev_dn_d2p),
- .dio_usbdev_dn_en_o (cio_usbdev_dn_en_d2p),
+ .dio_usbdev_sense_i (cio_usbdev_sense_p2d),
+ .dio_usbdev_se0_o (cio_usbdev_se0_d2p),
+ .dio_usbdev_se0_en_o (cio_usbdev_se0_en_d2p),
+ .dio_usbdev_pullup_o (cio_usbdev_pullup_d2p),
+ .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
+ .dio_usbdev_tx_mode_se_o (cio_usbdev_tx_mode_se_d2p),
+ .dio_usbdev_tx_mode_se_en_o (cio_usbdev_tx_mode_se_en_d2p),
+ .dio_usbdev_suspend_o (cio_usbdev_suspend_d2p),
+ .dio_usbdev_suspend_en_o (cio_usbdev_suspend_en_d2p),
+ .dio_usbdev_d_i (cio_usbdev_d_p2d),
+ .dio_usbdev_d_o (cio_usbdev_d_d2p),
+ .dio_usbdev_d_en_o (cio_usbdev_d_en_d2p),
+ .dio_usbdev_dp_i (cio_usbdev_dp_p2d),
+ .dio_usbdev_dp_o (cio_usbdev_dp_d2p),
+ .dio_usbdev_dp_en_o (cio_usbdev_dp_en_d2p),
+ .dio_usbdev_dn_i (cio_usbdev_dn_p2d),
+ .dio_usbdev_dn_o (cio_usbdev_dn_d2p),
+ .dio_usbdev_dn_en_o (cio_usbdev_dn_en_d2p),
- .mio_in_i (cio_gpio_p2d),
- .mio_out_o (cio_gpio_d2p),
- .mio_oe_o (cio_gpio_en_d2p),
+ .mio_in_i (cio_gpio_p2d),
+ .mio_out_o (cio_gpio_d2p),
+ .mio_oe_o (cio_gpio_en_d2p),
- .scanmode_i (1'b0)
+ .scanmode_i (1'b0)
);
// pad control
@@ -101,8 +115,17 @@
.cio_uart_tx_en_d2p,
// USB
.cio_usbdev_sense_p2d(cio_usbdev_sense_p2d),
+ .cio_usbdev_se0_d2p(cio_usbdev_se0_d2p),
+ .cio_usbdev_se0_en_d2p(cio_usbdev_se0_en_d2p),
.cio_usbdev_pullup_d2p(cio_usbdev_pullup_d2p),
.cio_usbdev_pullup_en_d2p(cio_usbdev_pullup_en_d2p),
+ .cio_usbdev_tx_mode_se_d2p(cio_usbdev_tx_mode_se_d2p),
+ .cio_usbdev_tx_mode_se_en_d2p(cio_usbdev_tx_mode_se_en_d2p),
+ .cio_usbdev_suspend_d2p(cio_usbdev_suspend_d2p),
+ .cio_usbdev_suspend_en_d2p(cio_usbdev_suspend_en_d2p),
+ .cio_usbdev_d_p2d(cio_usbdev_d_p2d),
+ .cio_usbdev_d_d2p(cio_usbdev_d_d2p),
+ .cio_usbdev_d_en_d2p(cio_usbdev_d_en_d2p),
.cio_usbdev_dp_p2d(cio_usbdev_dp_p2d),
.cio_usbdev_dp_d2p(cio_usbdev_dp_d2p),
.cio_usbdev_dp_en_d2p(cio_usbdev_dp_en_d2p),
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_nexysvideo.sv b/hw/top_earlgrey/rtl/top_earlgrey_nexysvideo.sv
index dc3df9c..fd66da2 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_nexysvideo.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_nexysvideo.sv
@@ -49,7 +49,12 @@
cio_spi_device_miso_d2p, cio_spi_device_miso_en_d2p;
logic cio_jtag_tck_p2d, cio_jtag_tms_p2d, cio_jtag_tdi_p2d, cio_jtag_tdo_d2p;
logic cio_jtag_trst_n_p2d, cio_jtag_srst_n_p2d;
- logic cio_usbdev_sense_p2d, cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_sense_p2d;
+ logic cio_usbdev_se0_d2p, cio_usbdev_se0_en_d2p;
+ logic cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_tx_mode_se_d2p, cio_usbdev_tx_mode_se_en_d2p;
+ logic cio_usbdev_supsend_d2p, cio_usbdev_supsend_en_d2p;
+ logic cio_usbdev_d_p2d, cio_usbdev_d_d2p, cio_usbdev_d_en_d2p;
logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
@@ -57,42 +62,51 @@
top_earlgrey #(
.IbexPipeLine(1)
) top_earlgrey (
- .clk_i (clk_sys),
- .rst_ni (rst_sys_n),
+ .clk_i (clk_sys),
+ .rst_ni (rst_sys_n),
- .clk_usb_48mhz_i (clk_48mhz),
+ .clk_usb_48mhz_i (clk_48mhz),
- .jtag_tck_i (cio_jtag_tck_p2d),
- .jtag_tms_i (cio_jtag_tms_p2d),
- .jtag_trst_ni (cio_jtag_trst_n_p2d),
- .jtag_td_i (cio_jtag_tdi_p2d),
- .jtag_td_o (cio_jtag_tdo_d2p),
+ .jtag_tck_i (cio_jtag_tck_p2d),
+ .jtag_tms_i (cio_jtag_tms_p2d),
+ .jtag_trst_ni (cio_jtag_trst_n_p2d),
+ .jtag_td_i (cio_jtag_tdi_p2d),
+ .jtag_td_o (cio_jtag_tdo_d2p),
- .mio_in_i (cio_gpio_p2d),
- .mio_out_o (cio_gpio_d2p),
- .mio_oe_o (cio_gpio_en_d2p),
+ .mio_in_i (cio_gpio_p2d),
+ .mio_out_o (cio_gpio_d2p),
+ .mio_oe_o (cio_gpio_en_d2p),
- .dio_uart_rx_i (cio_uart_rx_p2d),
- .dio_uart_tx_o (cio_uart_tx_d2p),
- .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
+ .dio_uart_rx_i (cio_uart_rx_p2d),
+ .dio_uart_tx_o (cio_uart_tx_d2p),
+ .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
- .dio_spi_device_sck_i (cio_spi_device_sck_p2d),
- .dio_spi_device_csb_i (cio_spi_device_csb_p2d),
- .dio_spi_device_mosi_i (cio_spi_device_mosi_p2d),
- .dio_spi_device_miso_o (cio_spi_device_miso_d2p),
- .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
+ .dio_spi_device_sck_i (cio_spi_device_sck_p2d),
+ .dio_spi_device_csb_i (cio_spi_device_csb_p2d),
+ .dio_spi_device_mosi_i (cio_spi_device_mosi_p2d),
+ .dio_spi_device_miso_o (cio_spi_device_miso_d2p),
+ .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
- .dio_usbdev_sense_i (cio_usbdev_sense_p2d),
- .dio_usbdev_pullup_o (cio_usbdev_pullup_d2p),
- .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
- .dio_usbdev_dp_i (cio_usbdev_dp_p2d),
- .dio_usbdev_dp_o (cio_usbdev_dp_d2p),
- .dio_usbdev_dp_en_o (cio_usbdev_dp_en_d2p),
- .dio_usbdev_dn_i (cio_usbdev_dn_p2d),
- .dio_usbdev_dn_o (cio_usbdev_dn_d2p),
- .dio_usbdev_dn_en_o (cio_usbdev_dn_en_d2p),
+ .dio_usbdev_sense_i (cio_usbdev_sense_p2d),
+ .dio_usbdev_se0_o (cio_usbdev_se0_d2p),
+ .dio_usbdev_se0_en_o (cio_usbdev_se0_en_d2p),
+ .dio_usbdev_pullup_o (cio_usbdev_pullup_d2p),
+ .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
+ .dio_usbdev_tx_mode_se_o (cio_usbdev_tx_mode_se_d2p),
+ .dio_usbdev_tx_mode_se_en_o (cio_usbdev_tx_mode_se_en_d2p),
+ .dio_usbdev_suspend_o (cio_usbdev_suspend_d2p),
+ .dio_usbdev_suspend_en_o (cio_usbdev_suspend_en_d2p),
+ .dio_usbdev_d_i (cio_usbdev_d_p2d),
+ .dio_usbdev_d_o (cio_usbdev_d_d2p),
+ .dio_usbdev_d_en_o (cio_usbdev_d_en_d2p),
+ .dio_usbdev_dp_i (cio_usbdev_dp_p2d),
+ .dio_usbdev_dp_o (cio_usbdev_dp_d2p),
+ .dio_usbdev_dp_en_o (cio_usbdev_dp_en_d2p),
+ .dio_usbdev_dn_i (cio_usbdev_dn_p2d),
+ .dio_usbdev_dn_o (cio_usbdev_dn_d2p),
+ .dio_usbdev_dn_en_o (cio_usbdev_dn_en_d2p),
- .scanmode_i (1'b0) // 1 for Scan
+ .scanmode_i (1'b0) // 1 for Scan
);
clkgen_xil7series clkgen (
@@ -111,8 +125,17 @@
.cio_uart_tx_en_d2p,
// USB
.cio_usbdev_sense_p2d(cio_usbdev_sense_p2d),
+ .cio_usbdev_se0_d2p(cio_usbdev_se0_d2p),
+ .cio_usbdev_se0_en_d2p(cio_usbdev_se0_en_d2p),
.cio_usbdev_pullup_d2p(cio_usbdev_pullup_d2p),
.cio_usbdev_pullup_en_d2p(cio_usbdev_pullup_en_d2p),
+ .cio_usbdev_tx_mode_se_d2p(cio_usbdev_tx_mode_se_d2p),
+ .cio_usbdev_tx_mode_se_en_d2p(cio_usbdev_tx_mode_se_en_d2p),
+ .cio_usbdev_suspend_d2p(cio_usbdev_suspend_d2p),
+ .cio_usbdev_suspend_en_d2p(cio_usbdev_suspend_en_d2p),
+ .cio_usbdev_d_p2d(cio_usbdev_d_p2d),
+ .cio_usbdev_d_d2p(cio_usbdev_d_d2p),
+ .cio_usbdev_d_en_d2p(cio_usbdev_d_en_d2p),
.cio_usbdev_dp_p2d(cio_usbdev_dp_p2d),
.cio_usbdev_dp_d2p(cio_usbdev_dp_d2p),
.cio_usbdev_dp_en_d2p(cio_usbdev_dp_en_d2p),
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv b/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
index c0835a5..0c325c5 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
@@ -18,7 +18,12 @@
logic cio_spi_device_mosi_p2d;
logic cio_spi_device_miso_d2p, cio_spi_device_miso_en_d2p;
- logic cio_usbdev_sense_p2d, cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_sense_p2d;
+ logic cio_usbdev_se0_d2p, cio_usbdev_se0_en_d2p;
+ logic cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+ logic cio_usbdev_tx_mode_se_d2p, cio_usbdev_tx_mode_se_en_d2p;
+ logic cio_usbdev_supsend_d2p, cio_usbdev_supsend_en_d2p;
+ logic cio_usbdev_d_p2d, cio_usbdev_d_d2p, cio_usbdev_d_en_d2p;
logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
@@ -26,44 +31,53 @@
// Top-level design
top_earlgrey top_earlgrey (
- .clk_i (clk_i),
- .rst_ni (rst_ni),
+ .clk_i (clk_i),
+ .rst_ni (rst_ni),
- .clk_usb_48mhz_i (clk_i),
+ .clk_usb_48mhz_i (clk_i),
- .jtag_tck_i (cio_jtag_tck),
- .jtag_tms_i (cio_jtag_tms),
- .jtag_trst_ni (cio_jtag_trst_n),
- .jtag_td_i (cio_jtag_tdi),
- .jtag_td_o (cio_jtag_tdo),
+ .jtag_tck_i (cio_jtag_tck),
+ .jtag_tms_i (cio_jtag_tms),
+ .jtag_trst_ni (cio_jtag_trst_n),
+ .jtag_td_i (cio_jtag_tdi),
+ .jtag_td_o (cio_jtag_tdo),
// Multiplexed I/O
- .mio_in_i (cio_gpio_p2d),
- .mio_out_o (cio_gpio_d2p),
- .mio_oe_o (cio_gpio_en_d2p),
+ .mio_in_i (cio_gpio_p2d),
+ .mio_out_o (cio_gpio_d2p),
+ .mio_oe_o (cio_gpio_en_d2p),
// Dedicated I/O
- .dio_uart_rx_i (cio_uart_rx_p2d),
- .dio_uart_tx_o (cio_uart_tx_d2p),
- .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
+ .dio_uart_rx_i (cio_uart_rx_p2d),
+ .dio_uart_tx_o (cio_uart_tx_d2p),
+ .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
- .dio_spi_device_sck_i (cio_spi_device_sck_p2d),
- .dio_spi_device_csb_i (cio_spi_device_csb_p2d),
- .dio_spi_device_mosi_i (cio_spi_device_mosi_p2d),
- .dio_spi_device_miso_o (cio_spi_device_miso_d2p),
- .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
+ .dio_spi_device_sck_i (cio_spi_device_sck_p2d),
+ .dio_spi_device_csb_i (cio_spi_device_csb_p2d),
+ .dio_spi_device_mosi_i (cio_spi_device_mosi_p2d),
+ .dio_spi_device_miso_o (cio_spi_device_miso_d2p),
+ .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
- .dio_usbdev_sense_i (cio_usbdev_sense_p2d),
- .dio_usbdev_pullup_o (cio_usbdev_pullup_d2p),
- .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
- .dio_usbdev_dp_i (cio_usbdev_dp_p2d),
- .dio_usbdev_dp_o (cio_usbdev_dp_d2p),
- .dio_usbdev_dp_en_o (cio_usbdev_dp_en_d2p),
- .dio_usbdev_dn_i (cio_usbdev_dn_p2d),
- .dio_usbdev_dn_o (cio_usbdev_dn_d2p),
- .dio_usbdev_dn_en_o (cio_usbdev_dn_en_d2p),
+ .dio_usbdev_sense_i (cio_usbdev_sense_p2d),
+ .dio_usbdev_se0_o (cio_usbdev_se0_d2p),
+ .dio_usbdev_se0_en_o (cio_usbdev_se0_en_d2p),
+ .dio_usbdev_pullup_o (cio_usbdev_pullup_d2p),
+ .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
+ .dio_usbdev_tx_mode_se_o (cio_usbdev_tx_mode_se_d2p),
+ .dio_usbdev_tx_mode_se_en_o (cio_usbdev_tx_mode_se_en_d2p),
+ .dio_usbdev_suspend_o (cio_usbdev_suspend_d2p),
+ .dio_usbdev_suspend_en_o (cio_usbdev_suspend_en_d2p),
+ .dio_usbdev_d_i (cio_usbdev_d_p2d),
+ .dio_usbdev_d_o (cio_usbdev_d_d2p),
+ .dio_usbdev_d_en_o (cio_usbdev_d_en_d2p),
+ .dio_usbdev_dp_i (cio_usbdev_dp_p2d),
+ .dio_usbdev_dp_o (cio_usbdev_dp_d2p),
+ .dio_usbdev_dp_en_o (cio_usbdev_dp_en_d2p),
+ .dio_usbdev_dn_i (cio_usbdev_dn_p2d),
+ .dio_usbdev_dn_o (cio_usbdev_dn_d2p),
+ .dio_usbdev_dn_en_o (cio_usbdev_dn_en_d2p),
- .scanmode_i (1'b0)
+ .scanmode_i (1'b0)
);
// GPIO DPI
@@ -148,6 +162,21 @@
.dn_en_d2p (cio_usbdev_dn_en_d2p)
);
+ // Tie off unused signals.
+ logic unused_cio_usbdev_se0_d2p, unused_cio_usbdev_se0_en_d2p;
+ logic unused_cio_usbdev_tx_mode_se_d2p, unused_cio_usbdev_tx_mode_se_en_d2p;
+ logic unused_cio_usbdev_supsend_d2p, unused_cio_usbdev_supsend_en_d2p;
+ logic unused_cio_usbdev_d_d2p, unused_cio_usbdev_d_en_d2p;
+ assign unused_cio_usbdev_se0_d2p = cio_usbdev_se0_d2p;
+ assign unused_cio_usbdev_se0_en_d2p = cio_usbdev_se0_en_d2p;
+ assign unused_cio_usbdev_tx_mode_se_d2p = cio_usbdev_tx_mode_se_d2p;
+ assign unused_cio_usbdev_tx_mode_se_en_d2p = cio_usbdev_tx_mode_se_en_d2p;
+ assign unused_cio_usbdev_suspend_d2p = cio_usbdev_suspend_d2p;
+ assign unused_cio_usbdev_suspend_en_d2p = cio_usbdev_suspend_en_d2p;
+ assign cio_usbdev_d_p2d = 1'b0;
+ assign unused_cio_usbdev_d_d2p = cio_usbdev_d_d2p;
+ assign unused_cio_usbdev_d_en_d2p = cio_usbdev_d_en_d2p;
+
// monitor for termination
`ifndef END_MON_PATH
`define END_MON_PATH top_earlgrey.u_ram1p_ram_main
diff --git a/hw/top_earlgrey/sw/autogen/top_earlgrey.h b/hw/top_earlgrey/sw/autogen/top_earlgrey.h
index cf25d4f..97e44dc 100644
--- a/hw/top_earlgrey/sw/autogen/top_earlgrey.h
+++ b/hw/top_earlgrey/sw/autogen/top_earlgrey.h
@@ -10,7 +10,7 @@
// PERIPH_INSEL ranges from 0 to NUM_MIO + 2 -1}
// 0 and 1 are tied to value 0 and 1
#define NUM_MIO 32
-#define NUM_DIO 10
+#define NUM_DIO 14
#define PINMUX_GPIO_GPIO_0_IN 0
#define PINMUX_GPIO_GPIO_1_IN 1