mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Update csrs.sv
Program clean up
This commit is contained in:
		
							parent
							
								
									6305412d57
								
							
						
					
					
						commit
						120cde2aea
					
				| @ -29,61 +29,61 @@ | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| module csrs import cvw::*;  #(parameter cvw_t P) ( | ||||
|   input  logic             clk, reset,  | ||||
|   input  logic             CSRSWriteM, STrapM, | ||||
|   input  logic [11:0]      CSRAdrM, | ||||
|   input  logic              clk, reset,  | ||||
|   input  logic              CSRSWriteM, STrapM, | ||||
|   input  logic [11:0]       CSRAdrM, | ||||
|   input  logic [P.XLEN-1:0] NextEPCM, NextMtvalM, SSTATUS_REGW,  | ||||
|   input  logic [4:0]       NextCauseM, | ||||
|   input  logic             STATUS_TVM, | ||||
|   input  logic             MCOUNTEREN_TM, // TM bit (1) of MCOUNTEREN; cause illegal instruction when trying to access STIMECMP if clear
 | ||||
|   input  logic [4:0]        NextCauseM, | ||||
|   input  logic              STATUS_TVM, | ||||
|   input  logic              MCOUNTEREN_TM, // TM bit (1) of MCOUNTEREN; cause illegal instruction when trying to access STIMECMP if clear
 | ||||
|   input  logic [P.XLEN-1:0] CSRWriteValM, | ||||
|   input  logic [1:0]       PrivilegeModeW, | ||||
|   input  logic [1:0]        PrivilegeModeW, | ||||
|   output logic [P.XLEN-1:0] CSRSReadValM, STVEC_REGW, | ||||
|   output logic [P.XLEN-1:0] SEPC_REGW,       | ||||
|   output logic [31:0]      SCOUNTEREN_REGW,  | ||||
|   output logic [31:0]       SCOUNTEREN_REGW,  | ||||
|   output logic [P.XLEN-1:0] SATP_REGW, | ||||
|   input  logic [11:0]      MIP_REGW, MIE_REGW, MIDELEG_REGW, | ||||
|   input  logic [63:0]      MTIME_CLINT, | ||||
|   output logic             WriteSSTATUSM, | ||||
|   output logic             IllegalCSRSAccessM, | ||||
|   output logic             STimerInt | ||||
|   input  logic [11:0]       MIP_REGW, MIE_REGW, MIDELEG_REGW, | ||||
|   input  logic [63:0]       MTIME_CLINT, | ||||
|   output logic              WriteSSTATUSM, | ||||
|   output logic              IllegalCSRSAccessM, | ||||
|   output logic              STimerInt | ||||
| ); | ||||
| 
 | ||||
|   // Supervisor CSRs
 | ||||
|   localparam SSTATUS = 12'h100; | ||||
|   localparam SIE = 12'h104; | ||||
|   localparam STVEC = 12'h105; | ||||
|   localparam SCOUNTEREN = 12'h106; | ||||
|   localparam SSCRATCH = 12'h140; | ||||
|   localparam SEPC = 12'h141; | ||||
|   localparam SCAUSE = 12'h142; | ||||
|   localparam STVAL = 12'h143; | ||||
|   localparam SIP= 12'h144; | ||||
|   localparam STIMECMP = 12'h14D; | ||||
|   localparam STIMECMPH = 12'h15D; | ||||
|   localparam SATP = 12'h180; | ||||
|   localparam SSTATUS      = 12'h100; | ||||
|   localparam SIE          = 12'h104; | ||||
|   localparam STVEC        = 12'h105; | ||||
|   localparam SCOUNTEREN   = 12'h106; | ||||
|   localparam SSCRATCH     = 12'h140; | ||||
|   localparam SEPC         = 12'h141; | ||||
|   localparam SCAUSE       = 12'h142; | ||||
|   localparam STVAL        = 12'h143; | ||||
|   localparam SIP          = 12'h144; | ||||
|   localparam STIMECMP     = 12'h14D; | ||||
|   localparam STIMECMPH    = 12'h15D; | ||||
|   localparam SATP         = 12'h180; | ||||
|   // Constants
 | ||||
|   localparam ZERO = {(P.XLEN){1'b0}}; | ||||
|   localparam ZERO         = {(P.XLEN){1'b0}}; | ||||
|   localparam SEDELEG_MASK = ~(ZERO | {{P.XLEN-3{1'b0}}, 3'b111} << 9); | ||||
| 
 | ||||
|   logic                    WriteSTVECM; | ||||
|   logic                    WriteSSCRATCHM, WriteSEPCM; | ||||
|   logic                    WriteSCAUSEM, WriteSTVALM, WriteSATPM, WriteSCOUNTERENM; | ||||
|   logic                    WriteSTIMECMPM, WriteSTIMECMPHM; | ||||
|   logic [P.XLEN-1:0]        SSCRATCH_REGW, STVAL_REGW, SCAUSE_REGW; | ||||
|   logic [P.XLEN-1:0]       SSCRATCH_REGW, STVAL_REGW, SCAUSE_REGW; | ||||
|   logic [63:0]             STIMECMP_REGW; | ||||
|    | ||||
|   // write enables
 | ||||
|   assign WriteSSTATUSM = CSRSWriteM & (CSRAdrM == SSTATUS); | ||||
|   assign WriteSTVECM = CSRSWriteM & (CSRAdrM == STVEC); | ||||
|   assign WriteSSCRATCHM = CSRSWriteM & (CSRAdrM == SSCRATCH); | ||||
|   assign WriteSEPCM = STrapM | (CSRSWriteM & (CSRAdrM == SEPC)); | ||||
|   assign WriteSCAUSEM = STrapM | (CSRSWriteM & (CSRAdrM == SCAUSE)); | ||||
|   assign WriteSTVALM = STrapM | (CSRSWriteM & (CSRAdrM == STVAL)); | ||||
|   assign WriteSATPM = CSRSWriteM & (CSRAdrM == SATP) & (PrivilegeModeW == P.M_MODE | ~STATUS_TVM); | ||||
|   assign WriteSSTATUSM    = CSRSWriteM & (CSRAdrM == SSTATUS); | ||||
|   assign WriteSTVECM      = CSRSWriteM & (CSRAdrM == STVEC); | ||||
|   assign WriteSSCRATCHM   = CSRSWriteM & (CSRAdrM == SSCRATCH); | ||||
|   assign WriteSEPCM       = STrapM | (CSRSWriteM & (CSRAdrM == SEPC)); | ||||
|   assign WriteSCAUSEM     = STrapM | (CSRSWriteM & (CSRAdrM == SCAUSE)); | ||||
|   assign WriteSTVALM      = STrapM | (CSRSWriteM & (CSRAdrM == STVAL)); | ||||
|   assign WriteSATPM       = CSRSWriteM & (CSRAdrM == SATP) & (PrivilegeModeW == P.M_MODE | ~STATUS_TVM); | ||||
|   assign WriteSCOUNTERENM = CSRSWriteM & (CSRAdrM == SCOUNTEREN); | ||||
|   assign WriteSTIMECMPM = CSRSWriteM & (CSRAdrM == STIMECMP) & (PrivilegeModeW == P.M_MODE | MCOUNTEREN_TM); | ||||
|   assign WriteSTIMECMPHM = CSRSWriteM & (CSRAdrM == STIMECMPH) & (PrivilegeModeW == P.M_MODE | MCOUNTEREN_TM) & (P.XLEN == 32); | ||||
|   assign WriteSTIMECMPM   = CSRSWriteM & (CSRAdrM == STIMECMP) & (PrivilegeModeW == P.M_MODE | MCOUNTEREN_TM); | ||||
|   assign WriteSTIMECMPHM  = CSRSWriteM & (CSRAdrM == STIMECMPH) & (PrivilegeModeW == P.M_MODE | MCOUNTEREN_TM) & (P.XLEN == 32); | ||||
| 
 | ||||
|   // CSRs
 | ||||
|   flopenr #(P.XLEN) STVECreg(clk, reset, WriteSTVECM, {CSRWriteValM[P.XLEN-1:2], 1'b0, CSRWriteValM[0]}, STVEC_REGW);  | ||||
| @ -95,7 +95,7 @@ module csrs import cvw::*;  #(parameter cvw_t P) ( | ||||
|     flopenr #(P.XLEN) SATPreg(clk, reset, WriteSATPM, CSRWriteValM, SATP_REGW); | ||||
|   else | ||||
|     assign SATP_REGW = 0; // hardwire to zero if virtual memory not supported
 | ||||
|   flopenr #(32)   SCOUNTERENreg(clk, reset, WriteSCOUNTERENM, CSRWriteValM[31:0], SCOUNTEREN_REGW); | ||||
|   flopenr #(32)     SCOUNTERENreg(clk, reset, WriteSCOUNTERENM, CSRWriteValM[31:0], SCOUNTEREN_REGW); | ||||
|   if (P.SSTC_SUPPORTED) begin : sstc | ||||
|     if (P.XLEN == 64) begin : sstc64 | ||||
|       flopenl #(P.XLEN) STIMECMPreg(clk, reset, WriteSTIMECMPM, CSRWriteValM, 64'hFFFFFFFFFFFFFFFF, STIMECMP_REGW); | ||||
| @ -108,7 +108,7 @@ module csrs import cvw::*;  #(parameter cvw_t P) ( | ||||
|   // Supervisor timer interrupt logic
 | ||||
|   // Spec is a bit peculiar - Machine timer interrupts are produced in CLINT, while Supervisor timer interrupts are in CSRs
 | ||||
|   if (P.SSTC_SUPPORTED) | ||||
|    assign STimerInt = ({1'b0, MTIME_CLINT} >= {1'b0, STIMECMP_REGW}); // unsigned comparison
 | ||||
|     assign STimerInt = ({1'b0, MTIME_CLINT} >= {1'b0, STIMECMP_REGW}); // unsigned comparison
 | ||||
|   else  | ||||
|     assign STimerInt = 0; | ||||
|      | ||||
| @ -140,10 +140,10 @@ module csrs import cvw::*;  #(parameter cvw_t P) ( | ||||
|                    CSRSReadValM = 0; | ||||
|                    IllegalCSRSAccessM = 1; | ||||
|                  end | ||||
|       default: begin | ||||
|                   CSRSReadValM = 0;  | ||||
|                   IllegalCSRSAccessM = 1;   | ||||
|                end        | ||||
|       default:   begin | ||||
|                    CSRSReadValM = 0;  | ||||
|                    IllegalCSRSAccessM = 1;   | ||||
|                  end        | ||||
|     endcase | ||||
|   end | ||||
| endmodule | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user