This is step 7 of the book Writing a RISC-V Emulator from Scratch in 10 Steps, whose goal is running xv6, a small Unix-like OS, in your emulator in the final step.
The source code is available at d0iasm/rvemu-for-book/step07/.
In the end of this page, we can support a universal asynchronous receiver-transmitter (UART) as one of CPU's peripheral devices.
// TODO: print "Hello, world!" and echoback