Is mcycleh a separate counter?
No. On RV32 it accesses bits 63:32 of the same mcycle counter; mcycle accesses bits 31:0.
mcycleh at 0xB80 exists only on RV32 and provides bits 63:32 of mcycle; it is not a separate counter.
mcycleh is the RV32-only upper-half access window for mcycle: it reads and writes bits 63:32 of the same 64-bit cycle counter, not a separate counter.
On RV32, read mcycleh, then mcycle, then mcycleh again.
Retry if the high halves differ; otherwise the halves form one 64-bit mcycle value.
No. On RV32 it accesses bits 63:32 of the same mcycle counter; mcycle accesses bits 31:0.
Read high, low, then high again; retry when the high halves differ to avoid an inconsistent value across a low-half carry.