Skip to content

Commit 1c00795

Browse files
committed
[earlgrey/verilator] Instantiate padring in chiplevel
This commit moves the dummy padring for Verilator from the testbench to the chiplevel, and replaces the connections to/from the DPI modules with hierarchical module references (XMRs). Signed-off-by: Florian Glaser <glaserf@lowrisc.org>
1 parent 809a9d1 commit 1c00795

3 files changed

Lines changed: 73 additions & 210 deletions

File tree

hw/top_earlgrey/chip_earlgrey_verilator.core

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ filesets:
1818
- lowrisc:prim_generic:flash
1919

2020
files:
21+
- rtl/padring_verilator.sv: { file_type: systemVerilogSource }
2122
- rtl/chip_earlgrey_verilator.sv: { file_type: systemVerilogSource }
2223

2324
parameters:

hw/top_earlgrey/dv/verilator/chip_sim_tb.sv

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,46 +26,54 @@ module chip_sim_tb (
2626
logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
2727
logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
2828

29+
// DUT: Only clock and reset in port list, I/O driven via XMR
2930
chip_earlgrey_verilator u_dut (
3031
.clk_i,
31-
.rst_ni,
32-
33-
// communication with GPIO
34-
.cio_gpio_p2d_i(cio_gpio_p2d),
35-
.cio_gpio_d2p_o(cio_gpio_d2p),
36-
.cio_gpio_en_d2p_o(cio_gpio_en_d2p),
37-
.cio_gpio_pull_en_o(cio_gpio_pull_en),
38-
.cio_gpio_pull_select_o(cio_gpio_pull_select),
39-
40-
// communication with UART
41-
.cio_uart_rx_p2d_i(cio_uart_rx_p2d),
42-
.cio_uart_tx_d2p_o(cio_uart_tx_d2p),
43-
44-
// communication with SPI
45-
.cio_spi_device_sck_p2d_i(cio_spi_device_sck_p2d),
46-
.cio_spi_device_csb_p2d_i(cio_spi_device_csb_p2d),
47-
.cio_spi_device_sdi_p2d_i(cio_spi_device_sdi_p2d),
48-
.cio_spi_device_sdo_d2p_o(cio_spi_device_sdo_d2p),
49-
.cio_spi_device_sdo_en_d2p_o(cio_spi_device_sdo_en_d2p),
50-
51-
// communication with USB
52-
.cio_usbdev_sense_p2d_i(cio_usbdev_sense_p2d),
53-
.cio_usbdev_dp_pullup_d2p_o(cio_usbdev_dp_pullup_d2p),
54-
.cio_usbdev_dn_pullup_d2p_o(cio_usbdev_dn_pullup_d2p),
55-
.cio_usbdev_dp_p2d_i(cio_usbdev_dp_p2d),
56-
.cio_usbdev_dp_d2p_o(cio_usbdev_dp_d2p),
57-
.cio_usbdev_dp_en_d2p_o(cio_usbdev_dp_en_d2p),
58-
.cio_usbdev_dn_p2d_i(cio_usbdev_dn_p2d),
59-
.cio_usbdev_dn_d2p_o(cio_usbdev_dn_d2p),
60-
.cio_usbdev_dn_en_d2p_o(cio_usbdev_dn_en_d2p),
61-
.cio_usbdev_d_p2d_i(cio_usbdev_d_p2d),
62-
.cio_usbdev_d_d2p_o(cio_usbdev_d_d2p),
63-
.cio_usbdev_d_en_d2p_o(cio_usbdev_d_en_d2p),
64-
.cio_usbdev_se0_d2p_o(cio_usbdev_se0_d2p),
65-
.cio_usbdev_rx_enable_d2p_o(cio_usbdev_rx_enable_d2p),
66-
.cio_usbdev_tx_use_d_se0_d2p_o(cio_usbdev_tx_use_d_se0_d2p)
32+
.rst_ni
6733
);
6834

35+
// ---------------------------------------------------------------------------
36+
// Connect the DPI models to the pad-level signals inside the Verilator
37+
// padring via hierarchical references. The *_p2d pad nets are undriven
38+
// inside padring_verilator, so the testbench is their sole driver; the
39+
// *_d2p, *_en_d2p and pull nets are driven in the padring and read out here.
40+
// ---------------------------------------------------------------------------
41+
42+
// GPIO
43+
assign u_dut.u_padring.cio_gpio_p2d = cio_gpio_p2d;
44+
assign cio_gpio_d2p = u_dut.u_padring.cio_gpio_d2p;
45+
assign cio_gpio_en_d2p = u_dut.u_padring.cio_gpio_en_d2p;
46+
assign cio_gpio_pull_en = u_dut.u_padring.cio_gpio_pull_en;
47+
assign cio_gpio_pull_select = u_dut.u_padring.cio_gpio_pull_select;
48+
49+
// UART
50+
assign u_dut.u_padring.cio_uart_rx_p2d = cio_uart_rx_p2d;
51+
assign cio_uart_tx_d2p = u_dut.u_padring.cio_uart_tx_d2p;
52+
53+
// SPI device
54+
assign u_dut.u_padring.cio_spi_device_sck_p2d = cio_spi_device_sck_p2d;
55+
assign u_dut.u_padring.cio_spi_device_csb_p2d = cio_spi_device_csb_p2d;
56+
assign u_dut.u_padring.cio_spi_device_sdi_p2d = cio_spi_device_sdi_p2d;
57+
assign cio_spi_device_sdo_d2p = u_dut.u_padring.cio_spi_device_sdo_d2p;
58+
assign cio_spi_device_sdo_en_d2p = u_dut.u_padring.cio_spi_device_sdo_en_d2p;
59+
60+
// USB
61+
assign u_dut.u_padring.cio_usbdev_sense_p2d = cio_usbdev_sense_p2d;
62+
assign u_dut.u_padring.cio_usbdev_dp_p2d = cio_usbdev_dp_p2d;
63+
assign u_dut.u_padring.cio_usbdev_dn_p2d = cio_usbdev_dn_p2d;
64+
assign u_dut.u_padring.cio_usbdev_d_p2d = cio_usbdev_d_p2d;
65+
assign cio_usbdev_dp_pullup_d2p = u_dut.u_padring.cio_usbdev_dp_pullup_d2p;
66+
assign cio_usbdev_dn_pullup_d2p = u_dut.u_padring.cio_usbdev_dn_pullup_d2p;
67+
assign cio_usbdev_dp_d2p = u_dut.u_padring.cio_usbdev_dp_d2p;
68+
assign cio_usbdev_dp_en_d2p = u_dut.u_padring.cio_usbdev_dp_en_d2p;
69+
assign cio_usbdev_dn_d2p = u_dut.u_padring.cio_usbdev_dn_d2p;
70+
assign cio_usbdev_dn_en_d2p = u_dut.u_padring.cio_usbdev_dn_en_d2p;
71+
assign cio_usbdev_d_d2p = u_dut.u_padring.cio_usbdev_d_d2p;
72+
assign cio_usbdev_d_en_d2p = u_dut.u_padring.cio_usbdev_d_en_d2p;
73+
assign cio_usbdev_se0_d2p = u_dut.u_padring.cio_usbdev_se0_d2p;
74+
assign cio_usbdev_rx_enable_d2p = u_dut.u_padring.cio_usbdev_rx_enable_d2p;
75+
assign cio_usbdev_tx_use_d_se0_d2p = u_dut.u_padring.cio_usbdev_tx_use_d_se0_d2p;
76+
6977
// GPIO DPI
7078
gpiodpi #(.N_GPIO(32)) u_gpiodpi (
7179
.clk_i (clk_i),
@@ -152,9 +160,11 @@ module chip_sim_tb (
152160
.dp_p2d (cio_usbdev_dp_p2d),
153161
.dp_d2p (cio_usbdev_dp_d2p),
154162
.dp_en_d2p (cio_usbdev_dp_en_d2p),
163+
.dp_en_p2d (),
155164
.dn_p2d (cio_usbdev_dn_p2d),
156165
.dn_d2p (cio_usbdev_dn_d2p),
157166
.dn_en_d2p (cio_usbdev_dn_en_d2p),
167+
.dn_en_p2d (),
158168
.d_p2d (cio_usbdev_d_p2d),
159169
.d_d2p (cio_usbdev_d_d2p),
160170
.d_en_d2p (cio_usbdev_d_en_d2p),

hw/top_earlgrey/rtl/chip_earlgrey_verilator.sv

Lines changed: 26 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -5,65 +5,24 @@
55
module chip_earlgrey_verilator (
66
// Clock and Reset
77
input clk_i,
8-
input rst_ni,
9-
10-
// communication with GPIO
11-
input [31:0] cio_gpio_p2d_i,
12-
output logic [31:0] cio_gpio_d2p_o,
13-
output logic [31:0] cio_gpio_en_d2p_o,
14-
output logic [31:0] cio_gpio_pull_en_o,
15-
output logic [31:0] cio_gpio_pull_select_o,
16-
17-
// communication with UART
18-
input cio_uart_rx_p2d_i,
19-
output logic cio_uart_tx_d2p_o,
20-
output logic cio_uart_tx_en_d2p_o,
21-
22-
// communication with SPI
23-
input cio_spi_device_sck_p2d_i,
24-
input cio_spi_device_csb_p2d_i,
25-
input cio_spi_device_sdi_p2d_i,
26-
output logic cio_spi_device_sdo_d2p_o,
27-
output logic cio_spi_device_sdo_en_d2p_o,
28-
29-
// communication with USB
30-
input cio_usbdev_sense_p2d_i,
31-
output logic cio_usbdev_dp_pullup_d2p_o,
32-
output logic cio_usbdev_dn_pullup_d2p_o,
33-
input cio_usbdev_dp_p2d_i,
34-
output logic cio_usbdev_dp_d2p_o,
35-
output logic cio_usbdev_dp_en_d2p_o,
36-
input cio_usbdev_dn_p2d_i,
37-
output logic cio_usbdev_dn_d2p_o,
38-
output logic cio_usbdev_dn_en_d2p_o,
39-
input cio_usbdev_d_p2d_i,
40-
output logic cio_usbdev_d_d2p_o,
41-
output logic cio_usbdev_d_en_d2p_o,
42-
output logic cio_usbdev_se0_d2p_o,
43-
output logic cio_usbdev_rx_enable_d2p_o,
44-
output logic cio_usbdev_tx_use_d_se0_d2p_o
8+
input rst_ni
459
);
4610

4711
import top_earlgrey_pkg::*;
4812

4913

5014
logic IO_JTCK, IO_JTMS, IO_JTRST_N, IO_JTDI, IO_JTDO;
5115

52-
// TODO: instantiate padring and route these signals through that module
5316
logic [pinmux_reg_pkg::NDioPads-1:0] dio_in;
5417
logic [pinmux_reg_pkg::NDioPads-1:0] dio_out;
5518
logic [pinmux_reg_pkg::NDioPads-1:0] dio_oe;
5619

57-
always_comb begin : assign_dio_in
58-
dio_in = '0;
59-
dio_in[DioSpiDeviceSck] = cio_spi_device_sck_p2d_i;
60-
dio_in[DioSpiDeviceCsb] = cio_spi_device_csb_p2d_i;
61-
dio_in[DioSpiDeviceSd0] = cio_spi_device_sdi_p2d_i;
62-
dio_in[DioUsbdevUsbDp] = cio_usbdev_dp_p2d_i;
63-
dio_in[DioUsbdevUsbDn] = cio_usbdev_dn_p2d_i;
64-
end
20+
logic [pinmux_reg_pkg::NMioPads-1:0] mio_in;
21+
logic [pinmux_reg_pkg::NMioPads-1:0] mio_out;
22+
logic [pinmux_reg_pkg::NMioPads-1:0] mio_oe;
23+
prim_pad_wrapper_pkg::pad_attr_t[pinmux_reg_pkg::NMioPads-1:0] mio_attr;
6524

66-
// USB
25+
// USB related signals
6726
logic usb_dp_pullup_en;
6827
logic usb_dn_pullup_en;
6928
logic usb_rx_d;
@@ -72,133 +31,26 @@ module chip_earlgrey_verilator (
7231
logic usb_tx_use_d_se0;
7332
logic usb_rx_enable;
7433

75-
assign usb_rx_d = cio_usbdev_d_p2d_i;
76-
assign cio_usbdev_d_d2p_o = usb_tx_d;
77-
assign cio_usbdev_d_en_d2p_o = dio_oe[DioUsbdevUsbDp];
78-
assign cio_usbdev_dn_pullup_d2p_o = usb_dn_pullup_en;
79-
assign cio_usbdev_dp_pullup_d2p_o = usb_dp_pullup_en;
80-
assign cio_usbdev_se0_d2p_o = usb_tx_se0;
81-
assign cio_usbdev_rx_enable_d2p_o = usb_rx_enable;
82-
assign cio_usbdev_tx_use_d_se0_d2p_o = usb_tx_use_d_se0;
83-
84-
assign cio_usbdev_dp_d2p_o = dio_out[DioUsbdevUsbDp];
85-
assign cio_usbdev_dp_en_d2p_o = dio_oe[DioUsbdevUsbDp];
86-
assign cio_usbdev_dn_d2p_o = dio_out[DioUsbdevUsbDn];
87-
assign cio_usbdev_dn_en_d2p_o = dio_oe[DioUsbdevUsbDn];
88-
89-
assign cio_spi_device_sdo_d2p_o = dio_out[DioSpiDeviceSd1];
90-
assign cio_spi_device_sdo_en_d2p_o = dio_oe[DioSpiDeviceSd1];
91-
92-
logic [pinmux_reg_pkg::NMioPads-1:0] mio_in;
93-
logic [pinmux_reg_pkg::NMioPads-1:0] mio_out;
94-
logic [pinmux_reg_pkg::NMioPads-1:0] mio_oe;
95-
prim_pad_wrapper_pkg::pad_attr_t[pinmux_reg_pkg::NMioPads-1:0] mio_attr;
96-
97-
always_comb begin : assign_mio_in
98-
mio_in = '0;
99-
// 14 generic GPIOs
100-
mio_in[MioPadIob12:MioPadIob6] = cio_gpio_p2d_i[6:0];
101-
mio_in[MioPadIor13:MioPadIor5] = cio_gpio_p2d_i[13:7];
102-
// SW straps
103-
mio_in[MioPadIoc2:MioPadIoc0] = cio_gpio_p2d_i[24:22];
104-
// TAP straps
105-
mio_in[MioPadIoc5] = cio_gpio_p2d_i[27];
106-
mio_in[MioPadIoc8] = cio_gpio_p2d_i[30];
107-
// UART RX
108-
mio_in[MioPadIoc3] = cio_uart_rx_p2d_i;
109-
// USB VBUS sense
110-
mio_in[MioPadIoc7] = cio_usbdev_sense_p2d_i;
111-
end
112-
113-
114-
// 14 generic GPIOs
115-
assign cio_gpio_d2p_o[6:0] = mio_out[MioPadIob12:MioPadIob6];
116-
assign cio_gpio_en_d2p_o[6:0] = mio_oe[MioPadIob12:MioPadIob6];
117-
assign cio_gpio_d2p_o[13:7] = mio_out[MioPadIor13:MioPadIor5];
118-
assign cio_gpio_en_d2p_o[13:7] = mio_oe[MioPadIor13:MioPadIor5];
119-
assign cio_gpio_d2p_o[21:14] = '0;
120-
assign cio_gpio_en_d2p_o[21:14] = '0;
121-
// SW straps
122-
assign cio_gpio_d2p_o[24:22] = mio_out[MioPadIoc2:MioPadIoc0];
123-
assign cio_gpio_en_d2p_o[24:22] = mio_oe[MioPadIoc2:MioPadIoc0];
124-
assign cio_gpio_d2p_o[26:25] = '0;
125-
assign cio_gpio_en_d2p_o[26:25] = '0;
126-
// TAP straps
127-
assign cio_gpio_d2p_o[27] = mio_out[MioPadIoc5];
128-
assign cio_gpio_en_d2p_o[27] = mio_oe[MioPadIoc5];
129-
assign cio_gpio_d2p_o[29:28] = '0;
130-
assign cio_gpio_en_d2p_o[29:28] = '0;
131-
assign cio_gpio_d2p_o[30] = mio_out[MioPadIoc8];
132-
assign cio_gpio_en_d2p_o[30] = mio_oe[MioPadIoc8];
133-
assign cio_gpio_d2p_o[31] = '0;
134-
assign cio_gpio_en_d2p_o[31] = '0;
135-
136-
assign cio_uart_tx_d2p_o = mio_out[MioPadIoc4];
137-
assign cio_uart_tx_en_d2p_o = mio_oe[MioPadIoc4];
138-
139-
// Note: we're collecting the `pull_en` and `pull_select` signals together
140-
// so that the GPIO DPI functions can simulate weak and strong GPIO
141-
// inputs. The `cio_gpio_pull_en_o` and `cio_gpio_pull_select_o` bit
142-
// vectors should have the same ordering as the `cio_gpio_d2p_o` vector.
143-
// See gpiodpi.c to see how weak/strong inputs work.
144-
//
145-
// Pull enable for 14 generic GPIOs
146-
assign cio_gpio_pull_en_o[0] = mio_attr[MioPadIob6].pull_en;
147-
assign cio_gpio_pull_en_o[1] = mio_attr[MioPadIob7].pull_en;
148-
assign cio_gpio_pull_en_o[2] = mio_attr[MioPadIob8].pull_en;
149-
assign cio_gpio_pull_en_o[3] = mio_attr[MioPadIob9].pull_en;
150-
assign cio_gpio_pull_en_o[4] = mio_attr[MioPadIob10].pull_en;
151-
assign cio_gpio_pull_en_o[5] = mio_attr[MioPadIob11].pull_en;
152-
assign cio_gpio_pull_en_o[6] = mio_attr[MioPadIob12].pull_en;
153-
assign cio_gpio_pull_en_o[7] = mio_attr[MioPadIor5].pull_en;
154-
assign cio_gpio_pull_en_o[8] = mio_attr[MioPadIor6].pull_en;
155-
assign cio_gpio_pull_en_o[9] = mio_attr[MioPadIor7].pull_en;
156-
assign cio_gpio_pull_en_o[10] = mio_attr[MioPadIor10].pull_en;
157-
assign cio_gpio_pull_en_o[11] = mio_attr[MioPadIor11].pull_en;
158-
assign cio_gpio_pull_en_o[12] = mio_attr[MioPadIor12].pull_en;
159-
assign cio_gpio_pull_en_o[13] = mio_attr[MioPadIor13].pull_en;
160-
assign cio_gpio_pull_en_o[21:14] = '0;
161-
162-
// Pull enable for SW STRAPs
163-
assign cio_gpio_pull_en_o[22] = mio_attr[MioPadIoc0].pull_en;
164-
assign cio_gpio_pull_en_o[23] = mio_attr[MioPadIoc1].pull_en;
165-
assign cio_gpio_pull_en_o[24] = mio_attr[MioPadIoc2].pull_en;
166-
167-
// Pull enable for TAP STRAPs
168-
assign cio_gpio_pull_en_o[26:25] = '0;
169-
assign cio_gpio_pull_en_o[27] = mio_attr[MioPadIoc5].pull_en;
170-
assign cio_gpio_pull_en_o[29:28] = '0;
171-
assign cio_gpio_pull_en_o[30] = mio_attr[MioPadIoc8].pull_en;
172-
assign cio_gpio_pull_en_o[31] = '0;
173-
174-
// Pull select for 14 generic GPIOs
175-
assign cio_gpio_pull_select_o[0] = mio_attr[MioPadIob6].pull_select;
176-
assign cio_gpio_pull_select_o[1] = mio_attr[MioPadIob7].pull_select;
177-
assign cio_gpio_pull_select_o[2] = mio_attr[MioPadIob8].pull_select;
178-
assign cio_gpio_pull_select_o[3] = mio_attr[MioPadIob9].pull_select;
179-
assign cio_gpio_pull_select_o[4] = mio_attr[MioPadIob10].pull_select;
180-
assign cio_gpio_pull_select_o[5] = mio_attr[MioPadIob11].pull_select;
181-
assign cio_gpio_pull_select_o[6] = mio_attr[MioPadIob12].pull_select;
182-
assign cio_gpio_pull_select_o[7] = mio_attr[MioPadIor5].pull_select;
183-
assign cio_gpio_pull_select_o[8] = mio_attr[MioPadIor6].pull_select;
184-
assign cio_gpio_pull_select_o[9] = mio_attr[MioPadIor7].pull_select;
185-
assign cio_gpio_pull_select_o[10] = mio_attr[MioPadIor10].pull_select;
186-
assign cio_gpio_pull_select_o[11] = mio_attr[MioPadIor11].pull_select;
187-
assign cio_gpio_pull_select_o[12] = mio_attr[MioPadIor12].pull_select;
188-
assign cio_gpio_pull_select_o[13] = mio_attr[MioPadIor13].pull_select;
189-
assign cio_gpio_pull_select_o[21:14] = '0;
190-
191-
// Pull select for SW STRAPs
192-
assign cio_gpio_pull_select_o[22] = mio_attr[MioPadIoc0].pull_select;
193-
assign cio_gpio_pull_select_o[23] = mio_attr[MioPadIoc1].pull_select;
194-
assign cio_gpio_pull_select_o[24] = mio_attr[MioPadIoc2].pull_select;
195-
196-
// Pull select for TAP STRAPs
197-
assign cio_gpio_pull_select_o[26:25] = '0;
198-
assign cio_gpio_pull_select_o[27] = mio_attr[MioPadIoc5].pull_select;
199-
assign cio_gpio_pull_select_o[29:28] = '0;
200-
assign cio_gpio_pull_select_o[30] = mio_attr[MioPadIoc8].pull_select;
201-
assign cio_gpio_pull_select_o[31] = '0;
34+
// Padring substitute that maps the mio/dio interface from pinmux to flat
35+
// cio_* signals that the testbench DPI models connect to.
36+
padring_verilator u_padring (
37+
.mio_in_o (mio_in ),
38+
.mio_out_i (mio_out),
39+
.mio_oe_i (mio_oe ),
40+
.mio_attr_i(mio_attr),
41+
42+
.dio_in_o (dio_in ),
43+
.dio_out_i(dio_out),
44+
.dio_oe_i (dio_oe ),
45+
46+
.usb_rx_d_o (usb_rx_d ),
47+
.usb_tx_d_i (usb_tx_d ),
48+
.usb_tx_se0_i (usb_tx_se0 ),
49+
.usb_tx_use_d_se0_i(usb_tx_use_d_se0),
50+
.usb_rx_enable_i (usb_rx_enable ),
51+
.usb_dp_pullup_en_i(usb_dp_pullup_en),
52+
.usb_dn_pullup_en_i(usb_dn_pullup_en)
53+
);
20254

20355
////////////////////////////////
20456
// AST - Custom for Verilator //

0 commit comments

Comments
 (0)