55module 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