mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Added generates to pcnextf muxes for privileged and caches.
This commit is contained in:
		
							parent
							
								
									d331b9f29d
								
							
						
					
					
						commit
						62e1a97287
					
				| @ -76,7 +76,6 @@ module ifu ( | ||||
| 	input logic [1:0] 			STATUS_MPP, | ||||
| 	input logic 				ITLBWriteF, ITLBFlushF, | ||||
| 	output logic 				ITLBMissF, InstrDAPageFaultF, | ||||
|   // pmp/pma (inside mmu) signals.  *** temporarily from AHB bus but eventually replace with internal versions pre H
 | ||||
| 	input 						var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], | ||||
| 	input 						var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0],  | ||||
| 	output logic 				InstrAccessFaultF, | ||||
| @ -120,7 +119,7 @@ module ifu ( | ||||
|   assign PCFExt = {2'b00, PCFSpill}; | ||||
| 
 | ||||
|   /////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|   // Spill Support  *** add other banners
 | ||||
|   // Spill Support
 | ||||
|   /////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
|   if(`C_SUPPORTED) begin : SpillSupport | ||||
| @ -247,18 +246,28 @@ module ifu ( | ||||
|    | ||||
|   flopenl #(32) AlignedInstrRawDFlop(clk, reset, ~StallD, FlushD ? nop : PostSpillInstrRawF, nop, InstrRawD); | ||||
| 
 | ||||
|   ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|   // PCNextF logic
 | ||||
|   ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
|   assign PrivilegedChangePCM = RetM | TrapM; | ||||
| 
 | ||||
|   // *** look at moves pcmux2 and pcmux3 to generates as they are needed only on supporting caches and
 | ||||
|   // privilege instructions respectively.
 | ||||
|   mux2 #(`XLEN) pcmux1(.d0(PCNext0F), .d1(PCCorrectE), .s(BPPredWrongE), .y(PCNext1F)); | ||||
|   mux2 #(`XLEN) pcmux2(.d0(PCNext1F), .d1(PCBPWrongInvalidate), .s(InvalidateICacheM), .y(PCNext2F)); | ||||
|   mux2 #(`XLEN) pcmux3(.d0(PCNext2F), .d1(PrivilegedNextPCM), .s(PrivilegedChangePCM), .y(UnalignedPCNextF)); | ||||
|   if(CACHE_ENABLED) | ||||
|     mux2 #(`XLEN) pcmux2(.d0(PCNext1F), .d1(PCBPWrongInvalidate), .s(InvalidateICacheM),  | ||||
|       .y(PCNext2F)); | ||||
|   else assign PCNext2F = PCNext1F; | ||||
|   if(`ZICSR_SUPPORTED) | ||||
|     mux2 #(`XLEN) pcmux3(.d0(PCNext2F), .d1(PrivilegedNextPCM), .s(PrivilegedChangePCM),  | ||||
|       .y(UnalignedPCNextF)); | ||||
|   else assign UnalignedPCNextF = PCNext2F; | ||||
| 
 | ||||
|   assign  PCNextF = {UnalignedPCNextF[`XLEN-1:1], 1'b0}; // hart-SPEC p. 21 about 16-bit alignment
 | ||||
|   flopenl #(`XLEN) pcreg(clk, reset, ~StallF, PCNextF, `RESET_VECTOR, PCF); | ||||
| 
 | ||||
|   // branch and jump predictor
 | ||||
|   ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|   // Branch and Jump Predictor
 | ||||
|   ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|   if (`BPRED_ENABLED) begin : bpred | ||||
|     logic                        BPPredWrongM; | ||||
|     logic                        SelBPPredF; | ||||
| @ -295,6 +304,9 @@ module ifu ( | ||||
|       else        PCPlus2or4F = {PCF[`XLEN-1:2], 2'b10}; | ||||
|     else          PCPlus2or4F = {PCPlusUpperF, PCF[1:0]}; // add 4
 | ||||
| 
 | ||||
|   ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|   // Decode stage pipeline register and compressed instruction decoding.
 | ||||
|   ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|   // Decode stage pipeline register and logic
 | ||||
|   flopenrc #(`XLEN) PCDReg(clk, reset, FlushD, ~StallD, PCF, PCD); | ||||
|     | ||||
|  | ||||
| @ -67,17 +67,17 @@ module busdp #(parameter WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLED) | ||||
|    | ||||
| 
 | ||||
|   localparam integer   WordCountThreshold = CACHE_ENABLED ? WORDSPERLINE - 1 : 0; | ||||
| 
 | ||||
|   logic [`PA_BITS-1:0]        LocalLSUBusAdr; | ||||
|   genvar                      index; | ||||
| 
 | ||||
|   for (index = 0; index < WORDSPERLINE; index++) begin:fetchbuffer | ||||
|     flopen #(`XLEN) fb(.clk, .en(LSUBusAck & LSUBusRead & (index == WordCount)), | ||||
|                        .d(LSUBusHRDATA), .q(DCacheBusWriteData[(index+1)*`XLEN-1:index*`XLEN])); | ||||
|     logic [WORDSPERLINE-1:0] CaptureWord; | ||||
|     assign CaptureWord[index] = LSUBusAck & LSUBusRead & (index == WordCount); | ||||
|     flopen #(`XLEN) fb(.clk, .en(CaptureWord[index]), .d(LSUBusHRDATA), | ||||
|       .q(DCacheBusWriteData[(index+1)*`XLEN-1:index*`XLEN])); | ||||
|   end | ||||
|   mux2 #(`PA_BITS) localadrmux(DCacheBusAdr, LSUPAdrM, SelUncachedAdr, LocalLSUBusAdr); | ||||
|   assign LSUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalLSUBusAdr; | ||||
|    mux2 #(3) lsubussizemux(.d0(`XLEN == 32 ? 3'b010 : 3'b011), .d1(LSUFunct3M),  | ||||
|   mux2 #(3) lsubussizemux(.d0(`XLEN == 32 ? 3'b010 : 3'b011), .d1(LSUFunct3M),  | ||||
|     .s(SelUncachedAdr), .y(LSUBusSize)); | ||||
| 
 | ||||
|   busfsm #(WordCountThreshold, LOGWPL, CACHE_ENABLED)  | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user