Made corrections; GPIO testbench now passes.
diff --git a/verilog/rtl/caravel.v b/verilog/rtl/caravel.v
index cdefe74..c51bef1 100644
--- a/verilog/rtl/caravel.v
+++ b/verilog/rtl/caravel.v
@@ -313,8 +313,8 @@
.mprj_io_loader_clock(mprj_io_loader_clock),
.mprj_io_loader_data(mprj_io_loader_data),
.mgmt_in_data(mgmt_io_in),
- .mgmt_out_data({mgmt_io_nc1, sdo_out, jtag_out}),
.mgmt_outz_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
+ .mgmt_out_data({mgmt_io_nc1, sdo_out, jtag_out}),
.mgmt_oeb_data({mgmt_io_nc3, sdo_outenb, jtag_outenb}),
// Mega Project Slave ports (WB MI A)
.mprj_cyc_o(mprj_cyc_o_core),
@@ -361,8 +361,8 @@
.la_data_out(la_data_out_mprj),
.la_oen (la_oen),
// IO Pads
- .io_out(mprj_io_out),
- .io_in (mprj_io_in)
+ .io_in (mprj_io_in),
+ .io_out() // ???
);
wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
@@ -375,42 +375,81 @@
// of the shift register, bits are presented in reverse, as the first
// bit in ends up as the last bit of the last I/O pad control block.
+ // There are two types of block; the first two are configured to be
+ // full bidirectional under control of the management Soc (JTAG and
+ // SDO). The rest are configured to be default (input).
+
gpio_control_block #(
- .DM_INIT(3'b010), // Test: All pads set to pull-up
- .OENB_INIT(1'b0) // Test: All pads set to pull-up
- ) gpio_control_inst [`MPRJ_IO_PADS-1:0] (
+ .DM_INIT(3'b110), // Mode = output, strong up/down
+ .OENB_INIT(1'b0) // Enable output signaling from wire
+ ) gpio_control_bidir [1:0] (
// Management Soc-facing signals
.resetn(mprj_io_loader_resetn),
.serial_clock(mprj_io_loader_clock),
- .mgmt_gpio_in(mgmt_io_in),
- .mgmt_gpio_out({mgmt_io_in[(`MPRJ_IO_PADS-1):2], sdo_out, jtag_out}),
- .mgmt_gpio_oeb({{(`MPRJ_IO_PADS-2){1'b1}}, sdo_outenb, jtag_outenb}),
+ .mgmt_gpio_in(mgmt_io_in[1:0]),
+ .mgmt_gpio_out({sdo_out, jtag_out}),
+ .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
// Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_shifted),
- .serial_data_out(gpio_serial_link),
+ .serial_data_in(gpio_serial_link_shifted[1:0]),
+ .serial_data_out(gpio_serial_link[1:0]),
// User-facing signals
- .user_gpio_out(user_io_out),
- .user_gpio_oeb(user_io_oeb),
- .user_gpio_in(user_io_in),
+ .user_gpio_out(user_io_out[1:0]),
+ .user_gpio_oeb(user_io_oeb[1:0]),
+ .user_gpio_in(user_io_in[1:0]),
// Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel),
- .pad_gpio_slow_sel(mprj_io_slow_sel),
- .pad_gpio_holdover(mprj_io_holdover),
- .pad_gpio_ana_en(mprj_io_analog_en),
- .pad_gpio_ana_sel(mprj_io_analog_sel),
- .pad_gpio_ana_pol(mprj_io_analog_pol),
- .pad_gpio_dm(mprj_io_dm),
- .pad_gpio_outenb(mprj_io_oeb),
- .pad_gpio_out(mprj_io_out),
- .pad_gpio_in(mprj_io_in)
+ .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
+ .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
+ .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
+ .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
+ .pad_gpio_holdover(mprj_io_holdover[1:0]),
+ .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
+ .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
+ .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
+ .pad_gpio_dm(mprj_io_dm[5:0]),
+ .pad_gpio_outenb(mprj_io_oeb[1:0]),
+ .pad_gpio_out(mprj_io_out[1:0]),
+ .pad_gpio_in(mprj_io_in[1:0])
+ );
+
+ gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
+
+ // Management Soc-facing signals
+
+ .resetn(mprj_io_loader_resetn),
+ .serial_clock(mprj_io_loader_clock),
+
+ .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
+ .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
+ .mgmt_gpio_oeb(1'b1),
+
+ // Serial data chain for pad configuration
+ .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
+ .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
+
+ // User-facing signals
+ .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
+ .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
+ .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
+
+ // Pad-facing signals (Pad GPIOv2)
+ .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
+ .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
+ .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
);
sky130_fd_sc_hvl__lsbufhv2lv levelshift (