Hello Matt,
I have simulated inputs from the "caravel.mprj_io" to the user project (i.e. user_project_
wrapper.io_in).
For example, if you want to get input from mprj_io[20], you should set io_oeb[20] to 1 somehow inside your project. And then in your C code you should set register:
reg_mprj_io_20 = GPIO_MODE_USER_STD_INPUT_PULLDOWN;
where both "reg_mprj_io_20" and "GPIO_MODE_USER_STD_INPUT_PULLDOWN" are defined inside caravel/verilog/dv/caravel/defs.h
Value for "reg_mprj_io_20" doesn't have to be pulldown of course.
This enabled me to send signals to my project from my caravel testbench.
Hope this helps.