@Matt Venn: I have been doing this a lot. If you look at the original source for picorv32 (and this is also in the caravel code, I think in the start.s assembly) there is a routine that reads the configuration registers from the flash. To do that, it has to load the routine in to RAM and then call it, because it cannot read the flash registers while simultaneously reading data off of the flash. But I have numerous routines that run in RAM using the same method of copying from flash and then calling the routine. The version in the picorv32 source is inefficient because it doesn't need to be efficient, so it copies the routine from flash every time. But that isn't necessary. My most complicated routine is an interrupt callback that reads data off of a PMOD MIC3 module. the MIC3 must be sampled at 32kHz, so the whole sampling loop must be very fast, so I have it run in RAM.