|
1 | 1 | //----------------------------------------------------------------- |
2 | 2 | // biRISC-V CPU |
3 | | -// V0.8.0 |
| 3 | +// V0.8.1 |
4 | 4 | // Ultra-Embedded.com |
5 | 5 | // Copyright 2019-2020 |
6 | 6 | // |
@@ -85,6 +85,7 @@ reg [31:0] csr_mip_q; |
85 | 85 | reg [31:0] csr_mie_q; |
86 | 86 | reg [1:0] csr_mpriv_q; |
87 | 87 | reg [31:0] csr_mcycle_q; |
| 88 | +reg [31:0] csr_mcycle_h_q; |
88 | 89 | reg [31:0] csr_mscratch_q; |
89 | 90 | reg [31:0] csr_mtval_q; |
90 | 91 | reg [31:0] csr_mtimecmp_q; |
@@ -174,6 +175,7 @@ begin |
174 | 175 | `CSR_MIE: rdata_r = csr_mie_q & `CSR_MIE_MASK; |
175 | 176 | `CSR_MCYCLE, |
176 | 177 | `CSR_MTIME: rdata_r = csr_mcycle_q; |
| 178 | + `CSR_MTIMEH: rdata_r = csr_mcycle_h_q; |
177 | 179 | `CSR_MHARTID: rdata_r = cpu_id_i; |
178 | 180 | `CSR_MISA: rdata_r = misa_i; |
179 | 181 | `CSR_MEDELEG: rdata_r = SUPPORT_SUPER ? (csr_medeleg_q & `CSR_MEDELEG_MASK) : 32'b0; |
@@ -314,11 +316,10 @@ begin |
314 | 316 | end |
315 | 317 | end |
316 | 318 | // Exception return |
317 | | - else if (exception_i == `EXCEPTION_ERET) |
| 319 | + else if (exception_i >= `EXCEPTION_ERET_U && exception_i <= `EXCEPTION_ERET_M) |
318 | 320 | begin |
319 | | - // TODO: Not quite correct - should check which ERET insn |
320 | 321 | // MRET (return from machine) |
321 | | - if (csr_mpriv_q == `PRIV_MACHINE) |
| 322 | + if (exception_i[1:0] == `PRIV_MACHINE) |
322 | 323 | begin |
323 | 324 | // Set privilege level to previous MPP |
324 | 325 | csr_mpriv_r = csr_sr_r[`SR_MPP_R]; |
@@ -490,6 +491,7 @@ begin |
490 | 491 | csr_mie_q <= 32'b0; |
491 | 492 | csr_mpriv_q <= `PRIV_MACHINE; |
492 | 493 | csr_mcycle_q <= 32'b0; |
| 494 | + csr_mcycle_h_q <= 32'b0; |
493 | 495 | csr_mscratch_q <= 32'b0; |
494 | 496 | csr_mtimecmp_q <= 32'b0; |
495 | 497 | csr_mtime_ie_q <= 1'b0; |
@@ -534,6 +536,10 @@ begin |
534 | 536 |
|
535 | 537 | csr_mip_next_q <= buffer_mip_w ? csr_mip_next_r : 32'b0; |
536 | 538 |
|
| 539 | + // Increment upper cycle counter on lower 32-bit overflow |
| 540 | + if (csr_mcycle_q == 32'hFFFFFFFF) |
| 541 | + csr_mcycle_h_q <= csr_mcycle_h_q + 32'd1; |
| 542 | + |
537 | 543 | `ifdef HAS_SIM_CTRL |
538 | 544 | // CSR SIM_CTRL (or DSCRATCH) |
539 | 545 | if ((csr_waddr_i == `CSR_DSCRATCH || csr_waddr_i == `CSR_SIM_CTRL) && ~(|exception_i)) |
@@ -572,11 +578,10 @@ begin |
572 | 578 | branch_target_r = (irq_priv_q == `PRIV_MACHINE) ? csr_mtvec_q : csr_stvec_q; |
573 | 579 | end |
574 | 580 | // Exception return |
575 | | - else if (exception_i == `EXCEPTION_ERET) |
| 581 | + else if (exception_i >= `EXCEPTION_ERET_U && exception_i <= `EXCEPTION_ERET_M) |
576 | 582 | begin |
577 | | - // TODO: Not quite correct - should check which ERET insn |
578 | 583 | // MRET (return from machine) |
579 | | - if (csr_mpriv_q == `PRIV_MACHINE) |
| 584 | + if (exception_i[1:0] == `PRIV_MACHINE) |
580 | 585 | begin |
581 | 586 | branch_r = 1'b1; |
582 | 587 | branch_target_r = csr_mepc_q; |
|
0 commit comments