rd, rspseudord = rsmv copies the value of one register into another. The name is short for move, though copy is more accurate: after mv a0, t0, both registers hold the same value and the source, t0, is unchanged.
It is a pseudo-instruction — a readable name the assembler rewrites into a real one, here addi rd, rs, 0. Adding zero to a value and storing it elsewhere is, after all, just a copy, so RISC-V never needed a dedicated move instruction; it reuses addition.
Most of the time you reach for mv because different registers have different jobs. By a shared convention, calculations tend to happen in the temporary registers (named t0, t1, and so on), but when you call a function its arguments must be placed in specific registers (a0, a1…), and results come back in a0. So programs are full of mv a0, t0 right before a call — moving a computed value into the register the called code expects to find it in — and mv s0, a0 right after, to tuck a returned result somewhere safe. Shuffling values into the right registers at the right moment is much of the everyday texture of assembly, and mv is the instruction that does it.
Because it copies rather than links, changing the destination later never affects the source, which makes mv handy for taking a snapshot of a value before a loop alters the original. The simulator's trace shows the addi it really runs.
addi rd, rs, 0
A pseudo-instruction: the assembler turns it into the real instruction(s) above.