mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	moved SubArith and RegWriteE into configurable block
This commit is contained in:
		
							parent
							
								
									7dd4a2e975
								
							
						
					
					
						commit
						1e1ecaafb1
					
				| @ -114,6 +114,7 @@ module controller( | |||||||
|   logic        unused;  |   logic        unused;  | ||||||
| 	logic        BranchFlagE;                    // Branch flag to use (chosen between eq or lt)
 | 	logic        BranchFlagE;                    // Branch flag to use (chosen between eq or lt)
 | ||||||
|   logic        IEURegWriteE;                   // Register write 
 |   logic        IEURegWriteE;                   // Register write 
 | ||||||
|  |   logic        BRegWriteE;                     // Register write from BMU controller in Execute Stage
 | ||||||
|   logic        IllegalERegAdrD;                // RV32E attempts to write upper 16 registers
 |   logic        IllegalERegAdrD;                // RV32E attempts to write upper 16 registers
 | ||||||
|   logic [1:0]  AtomicE;                        // Atomic instruction 
 |   logic [1:0]  AtomicE;                        // Atomic instruction 
 | ||||||
|   logic        FenceD, FenceE, FenceM;         // Fence instruction
 |   logic        FenceD, FenceE, FenceM;         // Fence instruction
 | ||||||
| @ -240,17 +241,26 @@ module controller( | |||||||
|   assign sltuD = (Funct3D == 3'b011);  |   assign sltuD = (Funct3D == 3'b011);  | ||||||
|   assign subD = (Funct3D == 3'b000 & Funct7D[5] & OpD[5]);  // OpD[5] needed to distinguish sub from addi
 |   assign subD = (Funct3D == 3'b000 & Funct7D[5] & OpD[5]);  // OpD[5] needed to distinguish sub from addi
 | ||||||
|   assign sraD = (Funct3D == 3'b101 & Funct7D[5]); |   assign sraD = (Funct3D == 3'b101 & Funct7D[5]); | ||||||
|   assign SubArithD = ALUOpD & (subD | sraD | sltD | sltuD | (`ZBS_SUPPORTED & (bextD | bclrD)) | (`ZBB_SUPPORTED & (andnD | ornD | xnorD))); // TRUE for R-type subtracts and sra, slt, sltu, and any B instruction that requires inverted operand
 |   assign ALUControlD = {(W64D | BW64D), SubArithD, ALUOpD}; | ||||||
|   assign ALUControlD = {W64D, SubArithD, ALUOpD}; |  | ||||||
| 
 | 
 | ||||||
|   if (`ZBS_SUPPORTED | `ZBA_SUPPORTED | `ZBB_SUPPORTED | `ZBC_SUPPORTED) begin: bitmanipi //change the conditional expression to OR any Z supported flags
 |   if (`ZBS_SUPPORTED | `ZBA_SUPPORTED | `ZBB_SUPPORTED | `ZBC_SUPPORTED) begin: bitmanipi //change the conditional expression to OR any Z supported flags
 | ||||||
|     bmuctrl bmuctrl(.clk, .reset, .StallD, .FlushD, .InstrD, .ALUSelectD, .BSelectD, .ZBBSelectD, .BRegWriteD, .BW64D, .BALUOpD, .StallE, .FlushE, .ALUSelectE, .BSelectE, .ZBBSelectE); |     bmuctrl bmuctrl(.clk, .reset, .StallD, .FlushD, .InstrD, .ALUSelectD, .BSelectD, .ZBBSelectD, .BRegWriteD, .BW64D, .BALUOpD, .StallE, .FlushE, .ALUSelectE, .BSelectE, .ZBBSelectE, .BRegWriteE); | ||||||
|  | 
 | ||||||
|  |     assign RegWriteE = IEURegWriteE | FWriteIntE | BRegWriteE; // IRF register writes could come from IEU, BMU or FPU controllers
 | ||||||
|  |     assign SubArithD = (ALUOpD | BALUOpD) & (subD | sraD | sltD | sltuD | (`ZBS_SUPPORTED & (bextD | bclrD)) | (`ZBB_SUPPORTED & (andnD | ornD | xnorD))); // TRUE for R-type subtracts and sra, slt, sltu, and any B instruction that requires inverted operand
 | ||||||
|   end else begin: bitmanipi |   end else begin: bitmanipi | ||||||
|     assign ALUSelectD = Funct3D; |     assign ALUSelectD = Funct3D; | ||||||
|     assign ALUSelectE = Funct3E; |     assign ALUSelectE = Funct3E; | ||||||
|     assign BSelectE = 4'b0000; |     assign BSelectE = 4'b0000; | ||||||
|     assign BSelectD = 4'b0000; |     assign BSelectD = 4'b0000; | ||||||
|     assign ZBBSelectE = 3'b000; |     assign ZBBSelectE = 3'b000; | ||||||
|  |     assign BRegWriteD = 1'b0; | ||||||
|  |     assign BW64D = 1'b0; | ||||||
|  |     assign BALUOpD = 1'b0; | ||||||
|  |     assign BRegWriteE = 1'b0; | ||||||
|  | 
 | ||||||
|  |     assign RegWriteE = IEURegWriteE | FWriteIntE; // IRF register writes could come from IEU or FPU controllers
 | ||||||
|  |     assign SubArithD = ALUOpD & (subD | sraD | sltD | sltuD); | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   // Fences
 |   // Fences
 | ||||||
| @ -287,7 +297,6 @@ module controller( | |||||||
|   // Other execute stage controller signals
 |   // Other execute stage controller signals
 | ||||||
|   assign MemReadE = MemRWE[1]; |   assign MemReadE = MemRWE[1]; | ||||||
|   assign SCE = (ResultSrcE == 3'b100); |   assign SCE = (ResultSrcE == 3'b100); | ||||||
|   assign RegWriteE = IEURegWriteE | FWriteIntE; // IRF register writes could come from IEU or FPU controllers
 |  | ||||||
|   assign IntDivE = MDUE & Funct3E[2]; // Integer division operation
 |   assign IntDivE = MDUE & Funct3E[2]; // Integer division operation
 | ||||||
|    |    | ||||||
|   // Memory stage pipeline control register
 |   // Memory stage pipeline control register
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user