The real time clock is off chip, and rdtime is a user mode instruction which can’t access off chip peripherals, so we trap and emulate it, which is a valid implementation strategy that doesn’t violate the User-Level ISA spec. This is essentially the same as using microcode to implement hard instructions, except we use a trap to m-mode instead of microcode.
Of course if you are already in m-mode, then rdtime is not very useful. You should just access the real time clock directly via the CLINT.
If you don’t have an OS, or if your OS doesn’t have a trap handler to emulate rdtime, then it is also not very useful. But there should still be a way to get a time. freedom-e-sdk has library calls for reading the time for instance.