@@ -24,6 +24,7 @@ module cve2_cs_registers #(
24
24
parameter cve2_pkg :: rv32m_e RV32M = cve2_pkg :: RV32MFast,
25
25
parameter cve2_pkg :: rv32b_e RV32B = cve2_pkg :: RV32BNone
26
26
) (
27
+
27
28
// Clock and Reset
28
29
input logic clk_i,
29
30
input logic rst_ni,
@@ -103,7 +104,7 @@ module cve2_cs_registers #(
103
104
input logic div_wait_i // core waiting for divide
104
105
);
105
106
106
- import cve2_pkg :: * ;
107
+ import cve2_pkg :: * ;
107
108
108
109
localparam int unsigned RV32BEnabled = (RV32B == RV32BNone) ? 0 : 1 ;
109
110
localparam int unsigned RV32MEnabled = (RV32M == RV32MNone) ? 0 : 1 ;
@@ -1444,7 +1445,83 @@ module cve2_cs_registers #(
1444
1445
// CPU control register //
1445
1446
// ////////////////////////
1446
1447
1447
- // Removed
1448
+ `ifdef RVFI
1449
+ logic [63 : 0 ] mstatus_extended_read;
1450
+ logic [63 : 0 ] mstatus_extended_write;
1451
+
1452
+ assign mstatus_extended_read[CSR_MSTATUS_MIE_BIT ] = mstatus_q.mie;
1453
+ assign mstatus_extended_read[CSR_MSTATUS_MPIE_BIT ] = mstatus_q.mpie;
1454
+ assign mstatus_extended_read[CSR_MSTATUS_MPP_BIT_HIGH : CSR_MSTATUS_MPP_BIT_LOW ] = mstatus_q.mpp;
1455
+ assign mstatus_extended_read[CSR_MSTATUS_MPRV_BIT ] = mstatus_q.mprv;
1456
+ assign mstatus_extended_read[CSR_MSTATUS_TW_BIT ] = mstatus_q.tw;
1457
+
1458
+ assign mstatus_extended_write[CSR_MSTATUS_MIE_BIT ] = mstatus_d.mie;
1459
+ assign mstatus_extended_write[CSR_MSTATUS_MPIE_BIT ] = mstatus_d.mpie;
1460
+ assign mstatus_extended_write[CSR_MSTATUS_MPP_BIT_HIGH : CSR_MSTATUS_MPP_BIT_LOW ] = mstatus_d.mpp;
1461
+ assign mstatus_extended_write[CSR_MSTATUS_MPRV_BIT ] = mstatus_d.mprv;
1462
+ assign mstatus_extended_write[CSR_MSTATUS_TW_BIT ] = mstatus_d.tw;
1463
+
1464
+ wire [63 : 0 ] rvfi_csr_bypass;
1465
+
1466
+ assign rvfi_csr_bypass = csr_save_cause_i;
1467
+
1468
+ bit [63 : 0 ] rvfi_csr_addr;
1469
+ bit [63 : 0 ] rvfi_csr_rdata;
1470
+ bit [63 : 0 ] rvfi_csr_wdata;
1471
+ bit [63 : 0 ] rvfi_csr_rmask;
1472
+ bit [63 : 0 ] rvfi_csr_wmask;
1473
+ wire [63 : 0 ] rvfi_csr_wmask_q;
1474
+ wire [63 : 0 ] rvfi_csr_rmask_q;
1475
+ assign rvfi_csr_if.rvfi_csr_addr = rvfi_csr_addr;
1476
+ assign rvfi_csr_if.rvfi_csr_rdata = rvfi_csr_rdata;
1477
+ assign rvfi_csr_if.rvfi_csr_wdata = rvfi_csr_wdata;
1478
+ assign rvfi_csr_if.rvfi_csr_rmask = rvfi_csr_rmask;
1479
+ assign rvfi_csr_if.rvfi_csr_wmask = rvfi_csr_wmask;
1480
+ assign rvfi_csr_rmask_q = ((~ csr_wr & csr_op_en_i & ~ illegal_csr_insn_o)) ? - 1 : 0 ;
1481
+ assign rvfi_csr_wmask_q = ((csr_wr & csr_op_en_i & ~ illegal_csr_insn_o)) ? - 1 : 0 ;
1482
+ always @ (posedge clknrst_if.clk) begin
1483
+ rvfi_csr_addr = csr_addr_i;
1484
+ rvfi_csr_rdata = csr_rdata_int;
1485
+ rvfi_csr_wdata = csr_wdata_int;
1486
+ rvfi_csr_rmask = (rvfi_csr_rmask_q);
1487
+ rvfi_csr_wmask = (rvfi_csr_wmask_q);
1488
+ end
1489
+
1490
+ `define RVFI_CONNECT (CSR_ADDR , CSR_NAME , CSR_RDATA , CSR_WDATA , CSR_RMASK , CSR_WMASK ) \
1491
+ bit [63 : 0 ] rvfi_``CSR_NAME ``_csr_rdata ;\
1492
+ bit [63 : 0 ] rvfi_``CSR_NAME ``_csr_wdata ;\
1493
+ bit [63 : 0 ] rvfi_``CSR_NAME ``_csr_rmask ;\
1494
+ bit [63 : 0 ] rvfi_``CSR_NAME ``_csr_wmask ;\
1495
+ wire [63 : 0 ] rvfi_``CSR_NAME ``_csr_wmask_q ; \
1496
+ wire [63 : 0 ] rvfi_``CSR_NAME ``_csr_rmask_q ; \
1497
+ assign rvfi_csr_if.rvfi_named_csr_rdata[CSR_ADDR ] = (! rvfi_csr_bypass) ? rvfi_``CSR_NAME ``_csr_rdata : ``CSR_RDATA ``; \
1498
+ assign rvfi_csr_if.rvfi_named_csr_wdata[CSR_ADDR ] = (! rvfi_csr_bypass) ? rvfi_``CSR_NAME ``_csr_wdata : ``CSR_WDATA ``; \
1499
+ assign rvfi_csr_if.rvfi_named_csr_rmask[CSR_ADDR ] = (! rvfi_csr_bypass) ? rvfi_``CSR_NAME ``_csr_rmask : rvfi_``CSR_NAME ``_csr_rmask_q ; \
1500
+ assign rvfi_csr_if.rvfi_named_csr_wmask[CSR_ADDR ] = (! rvfi_csr_bypass) ? rvfi_``CSR_NAME ``_csr_wmask : rvfi_``CSR_NAME ``_csr_wmask_q ; \
1501
+ assign rvfi_``CSR_NAME ``_csr_rmask_q = ((~ csr_wr & csr_op_en_i & ~ illegal_csr_insn_o & (csr_addr_i == CSR_ADDR )) CSR_RMASK ) ? - 1 : 0 ; \
1502
+ assign rvfi_``CSR_NAME ``_csr_wmask_q = ((csr_wr & csr_op_en_i & ~ illegal_csr_insn_o & (csr_addr_i == CSR_ADDR )) CSR_WMASK ) ? - 1 : 0 ; \
1503
+ always @ (posedge clknrst_if.clk) begin \
1504
+ rvfi_``CSR_NAME ``_csr_rdata = ``CSR_RDATA ``; \
1505
+ rvfi_``CSR_NAME ``_csr_wdata = ``CSR_WDATA ``; \
1506
+ rvfi_``CSR_NAME ``_csr_rmask = (rvfi_``CSR_NAME ``_csr_rmask_q ); \
1507
+ rvfi_``CSR_NAME ``_csr_wmask = (rvfi_``CSR_NAME ``_csr_wmask_q ); \
1508
+ end
1509
+
1510
+ `RVFI_CONNECT ( CSR_MSTATUS , mstatus , mstatus_extended_read , mstatus_extended_write , , || mstatus_en)
1511
+ `RVFI_CONNECT ( CSR_MIE , mie , mie_q , mie_d , , || mie_en )
1512
+ `RVFI_CONNECT ( CSR_MIP , mip , mip , csr_wdata_i , , )
1513
+ `RVFI_CONNECT ( CSR_MISA , misa , MISA_VALUE , csr_wdata_i , , )
1514
+ `RVFI_CONNECT ( CSR_MTVEC , mtvec , mtvec_q , mtvec_d , , || mtvec_en )
1515
+ `RVFI_CONNECT ( CSR_MEPC , mepc , mepc_q , mepc_d , , || mepc_en )
1516
+ `RVFI_CONNECT ( CSR_MCAUSE , mcause , mcause_q , mcause_d , , || mcause_en )
1517
+ `RVFI_CONNECT ( CSR_MTVAL , mtval , mtval_q , mtval_d , , || mtval_en )
1518
+ `RVFI_CONNECT ( CSR_MSTATUSH , mstatush , 'h0 , csr_wdata_i , , )
1519
+ `RVFI_CONNECT ( CSR_DCSR , dcsr , dcsr_q , dcsr_d , , || dcsr_en)
1520
+ `RVFI_CONNECT ( CSR_DPC , dpc , depc_q , depc_d , , || depc_en)
1521
+ `RVFI_CONNECT ( CSR_DSCRATCH0 , dscratch0 , dscratch0_q , csr_wdata_i , , || dscratch0_en)
1522
+ `RVFI_CONNECT ( CSR_DSCRATCH1 , dscratch1 , dscratch1_q , csr_wdata_i , , || dscratch1_en)
1523
+
1524
+ `endif
1448
1525
1449
1526
// //////////////
1450
1527
// Assertions //
0 commit comments