/* * File : MIPS_Parameters.v * Project : University of Utah, XUM Project MIPS32 core * Creator(s) : Grant Ayers (ayers@cs.utah.edu) * * Modification History: * Rev Date Initials Description of Change * 1.0 26-May-2012 GEA Release version. * 2.0 11-Mar-2021 ZI nMPRA * Standards/Formatting: * Verilog 2001, 4 soft tab, wide column. * * Description: * Provides a language abstraction for the MIPS32-specific op-codes and * the processor-specific datapath, hazard, and exception bits which * control the processor. These parameter names are used extensively * throughout the processor HDL modules. */ /*** Exception Vector Locations *** When the CPU powers up or is reset, it will begin execution at 'EXC_Vector_Base_Reset'. All other exceptions are the sum of a base address and offset: - The base address is either a bootstrap or normal value. It is controlled by the 'BEV' bit in the CP0 'Status' register. Both base addresses can be mapped to the same location. - The offset address is either a standard offset (which is always used for non-interrupt general exceptions in this processor because it lacks TLB Refill and Cache errors), or a special interrupt-only offset for interrupts, which is enabled with the 'IV' bit in the CP0 'Cause' register. Current Setup: General exceptions go to 0x0. Interrupts go to 0x8. Booting starts at 0x20. */ //20 20(addra=0xce) parameter [31:0] EXC_Vector_Base_Reset_T0_boot = 32'h0000_0010; // (MIPS Standard is 0xBFC0_0000) parameter [31:0] EXC_Vector_Base_Other_NoBoot = 32'h0000_0000; // MIPS Standard is 0x8000_0000 parameter [31:0] EXC_Vector_Base_Other_Boot = 32'h0000_0000; // MIPS Standard is 0xBFC0_0200 parameter [31:0] EXC_Vector_Offset_General = 32'h0000_0000; // MIPS Standard is 0x0000_0180 parameter [31:0] EXC_Vector_Offset_Special = 32'h0000_0008; // MIPS Standard is 0x0000_0200 //**************************************************************** // task //**************************************************************** parameter [31:0] EXC_Vector_Base_Reset_T0 = 32'h0000_0320; // (c8) parameter [31:0] EXC_Vector_Base_Reset_T1 = 32'h0000_04B0; // (12c) parameter [31:0] EXC_Vector_Base_Reset_T2 = 32'h0000_0640; // (190) parameter [31:0] EXC_Vector_Base_Reset_T3 = 32'h0000_07D0; // (1f4)) //**************************************************************** // int //**************************************************************** parameter [31:0] EXC_Vector_Base_INT0 = 32'h0000_0960; // (258) parameter [31:0] EXC_Vector_Base_INT1 = 32'h0000_0A28; // (28A) parameter [31:0] EXC_Vector_Base_INT2 = 32'h0000_0AF0; // (2BC) parameter [31:0] EXC_Vector_Base_INT3 = 32'h0000_0BB8; // (2EE) //**************************************************************** // ev. comm //**************************************************************** parameter [31:0] EXC_Vector_Base_ERF0 = 32'h0000_0C80; // (320) parameter [31:0] EXC_Vector_Base_ERF1 = 32'h0000_0CE4; // (339) parameter [31:0] EXC_Vector_Base_ERF2 = 32'h0000_0D48; // (352) parameter [31:0] EXC_Vector_Base_ERF3 = 32'h0000_0DAC; // (36B) //**************************************************************** // mutex //**************************************************************** parameter [31:0] EXC_Vector_Base_EMF0 = 32'h0000_0E10; // (384) parameter [31:0] EXC_Vector_Base_EMF1 = 32'h0000_0E74; // (39D) parameter [31:0] EXC_Vector_Base_EMF2 = 32'h0000_0ED8; // (3B6) parameter [31:0] EXC_Vector_Base_EMF3 = 32'h0000_0F3C; // (3CF) //**************************************************************** // //**************************************************************** parameter ARRAY_WIDTH_NR_Tasks = 5'd5; parameter ENABLE = 1'b1; parameter DISABLE = 1'b0; //**************************************************************** parameter Mask1_bit0 = 32'h0000_0001; parameter Mask1_bit1 = 32'h0000_0002; parameter Mask1_bit2 = 32'h0000_0004; parameter Mask1_bit3 = 32'h0000_0008; parameter Mask1_bit4 = 32'h0000_0010; parameter Mask1_bit5 = 32'h0000_0020; parameter Mask1_bit6 = 32'h0000_0040; parameter Mask1_bit7 = 32'h0000_0080; parameter Mask1_bit8 = 32'h0000_0100; parameter Mask1_bit9 = 32'h0000_0200; parameter Mask1_bit10 = 32'h0000_0400; parameter Mask1_bit11 = 32'h0000_0800; parameter Mask1_bit12 = 32'h0000_1000; parameter Mask1_bit13 = 32'h0000_2000; parameter Mask1_bit14 = 32'h0000_4000; parameter Mask1_bit15 = 32'h0000_8000; parameter Mask1_bit16 = 32'h0001_0000; parameter Mask1_bit17 = 32'h0002_0000; parameter Mask1_bit18 = 32'h0004_0000; parameter Mask1_bit19 = 32'h0008_0000; parameter Mask1_bit20 = 32'h0010_0000; parameter Mask1_bit21 = 32'h0020_0000; parameter Mask1_bit22 = 32'h0040_0000; parameter Mask1_bit23 = 32'h0080_0000; parameter Mask1_bit24 = 32'h0100_0000; parameter Mask1_bit25 = 32'h0200_0000; parameter Mask1_bit26 = 32'h0400_0000; parameter Mask1_bit27 = 32'h0800_0000; parameter Mask1_bit28 = 32'h1000_0000; parameter Mask1_bit29 = 32'h2000_0000; parameter Mask1_bit30 = 32'h4000_0000; parameter Mask1_bit31 = 32'h8000_0000; parameter Mask0_bit0 = 32'hFFFF_FFFE; parameter Mask0_bit1 = 32'hFFFF_FFFD; parameter Mask0_bit2 = 32'hFFFF_FFFB; parameter Mask0_bit3 = 32'hFFFF_FFF7; parameter Mask0_bit4 = 32'hFFFF_FFEF; parameter Mask0_bit5 = 32'hFFFF_FFDF; parameter Mask0_bit6 = 32'hFFFF_FFBF; parameter Mask0_bit7 = 32'hFFFF_FF7F; parameter Mask0_bit8 = 32'hFFFF_FEFF; parameter Mask0_bit9 = 32'hFFFF_FDFF; parameter Mask0_bit10 = 32'hFFFF_FBFF; parameter Mask0_bit11 = 32'hFFFF_F7FF; parameter Mask0_bit12 = 32'hFFFF_EFFF; parameter Mask0_bit13 = 32'hFFFF_DFFF; parameter Mask0_bit14 = 32'hFFFF_BFFF; parameter Mask0_bit15 = 32'hFFFF_7FFF; parameter Mask0_bit16 = 32'hFFFE_FFFF; parameter Mask0_bit17 = 32'hFFFD_FFFF; parameter Mask0_bit18 = 32'hFFFB_FFFF; parameter Mask0_bit19 = 32'hFFF7_FFFF; parameter Mask0_bit20 = 32'hFFEF_FFFF; parameter Mask0_bit21 = 32'hFFDF_FFFF; parameter Mask0_bit22 = 32'hFFBF_FFFF; parameter Mask0_bit23 = 32'hFF7F_FFFF; parameter Mask0_bit24 = 32'hFEFF_FFFF; parameter Mask0_bit25 = 32'hFDFF_FFFF; parameter Mask0_bit26 = 32'hFBFF_FFFF; parameter Mask0_bit27 = 32'hF7FF_FFFF; parameter Mask0_bit28 = 32'hEFFF_FFFF; parameter Mask0_bit29 = 32'hDFFF_FFFF; parameter Mask0_bit30 = 32'hBFFF_FFFF; parameter Mask0_bit31 = 32'h7FFF_FFFF; //**************************************************************** // //**************************************************************** parameter NR_INT = 5'd4; parameter NR_MUTEX = 5'd4; parameter NR_EV = 5'd4; parameter NR_REG_INTERTASK_COMM = 5'd16; //**************************************************************** // //**************************************************************** parameter RF_CONTEXT = 32; //**************************************************************** /*** Kernel/User Memory Areas *** Kernel memory starts at address 0x0. User memory starts at 'UMem_Lower' and extends to the end of the address space. A distinction is made to protect against accesses to kernel memory while the processor is in user mode. Lacking MMU hardware, these addresses are physical, not virtual. This simple two-part division of the address space can be extended almost arbitrarily in the Data Memory Controller. Note that there is currently no user/kernel space check for the Instruction Memory, because it is assumed that instructions are in the kernel space. */ //parameter [31:0] UMem_Lower = 32'h08000000; //ptr. prot mem parameter [31:0] UMem_Lower = 32'h00000000; /*** Processor Endianness *** The MIPS Configuration Register (CP0 Register 16 Select 0) specifies the processor's endianness. A processor in user mode may switch to reverse endianness, which will be the opposite of this parameter. */ parameter Big_Endian = 1; /*** Defineste algoritmul de planificare *** implementat de catre modulul nHSE_alg */ parameter nHSE_mode = 0; // 0 - Round Robin // 1 - Preemptiv /*** Encodings for MIPS32 Release 1 Architecture ***/ /* Op Code Categories */ parameter [5:0] Op_Type_R = 6'b00_0000; // Standard R-Type instructions parameter [5:0] Op_Type_R2 = 6'b01_1100; // Extended R-Like instructions parameter [5:0] Op_Type_BI = 6'b00_0001; // Branch/Trap extended instructions parameter [5:0] Op_Type_CP0 = 6'b01_0000; // Coprocessor 0 instructions parameter [5:0] Op_Type_CP1 = 6'b01_0001; // Coprocessor 1 instructions (not implemented) parameter [5:0] Op_Type_CP2 = 6'b01_0010; // Coprocessor 2 instructions parameter [5:0] Op_Type_CP3 = 6'b01_0011; // Coprocessor 3 instructions (not implemented) parameter [5:0] Op_Type_LWC2 = 6'b11_0010; // transfera un cuvant din mem in COP2 parameter [5:0] Op_Type_SWC2 = 6'b11_1010; //111010 // de schimbat in 111010 , transfera un cuvant din COP2 in mem /* Op Code Rs fields for Coprocessor 2 */ parameter [4:0] Rs_Type_CFC2 = 5'b0_0010; // Move Control Word From Coprocessor 2 parameter [4:0] Rs_Type_MFC2 = 5'b0_0000; // Move Word From Coprocessor 2 parameter [4:0] Rs_Type_CTC2 = 5'b0_0110; // Move Control Word To Coprocessor 2 parameter [4:0] Rs_Type_MTC2 = 5'b0_0100; // Move Word to Coprocessor 2 /* Op Code Rs fields for Coprocessor 0 */ parameter [4:0] OpRs_MF = 5'b00_000; parameter [4:0] OpRs_MT = 5'b00_100; // ------------- instructiuni dedicate planificatorului -------------------- // ------------------------------------------------------------------------ parameter [5:0] Op_Add = Op_Type_R; parameter [5:0] Op_Addi = 6'b00_1000; parameter [5:0] Op_Addiu = 6'b00_1001; parameter [5:0] Op_Addu = Op_Type_R; parameter [5:0] Op_And = Op_Type_R; parameter [5:0] Op_Andi = 6'b00_1100; parameter [5:0] Op_Beq = 6'b00_0100; parameter [5:0] Op_Bgez = Op_Type_BI; parameter [5:0] Op_Bgezal = Op_Type_BI; parameter [5:0] Op_Bgtz = 6'b00_0111; parameter [5:0] Op_Blez = 6'b00_0110; parameter [5:0] Op_Bltz = Op_Type_BI; parameter [5:0] Op_Bltzal = Op_Type_BI; parameter [5:0] Op_Bne = 6'b00_0101; parameter [5:0] Op_Break = Op_Type_R; parameter [5:0] Op_Clo = Op_Type_R2; parameter [5:0] Op_Clz = Op_Type_R2; parameter [5:0] Op_Div = Op_Type_R; parameter [5:0] Op_Divu = Op_Type_R; parameter [5:0] Op_Eret = Op_Type_CP0; parameter [5:0] Op_J = 6'b00_0010; parameter [5:0] Op_Jal = 6'b00_0011; parameter [5:0] Op_Jalr = Op_Type_R; parameter [5:0] Op_Jr = Op_Type_R; parameter [5:0] Op_Lb = 6'b10_0000; parameter [5:0] Op_Lbu = 6'b10_0100; parameter [5:0] Op_Lh = 6'b10_0001; parameter [5:0] Op_Lhu = 6'b10_0101; parameter [5:0] Op_Ll = 6'b11_0000; parameter [5:0] Op_Lui = 6'b00_1111; parameter [5:0] Op_Lw = 6'b10_0011; parameter [5:0] Op_Lwl = 6'b10_0010; parameter [5:0] Op_Lwr = 6'b10_0110; parameter [5:0] Op_Madd = Op_Type_R2; parameter [5:0] Op_Maddu = Op_Type_R2; parameter [5:0] Op_Mfc0 = Op_Type_CP0; parameter [5:0] Op_Mfhi = Op_Type_R; parameter [5:0] Op_Mflo = Op_Type_R; parameter [5:0] Op_Movn = Op_Type_R; parameter [5:0] Op_Movz = Op_Type_R; parameter [5:0] Op_Msub = Op_Type_R2; parameter [5:0] Op_Msubu = Op_Type_R2; parameter [5:0] Op_Mtc0 = Op_Type_CP0; parameter [5:0] Op_Mthi = Op_Type_R; parameter [5:0] Op_Mtlo = Op_Type_R; parameter [5:0] Op_Mul = Op_Type_R2; parameter [5:0] Op_Mult = Op_Type_R; parameter [5:0] Op_Multu = Op_Type_R; parameter [5:0] Op_Nor = Op_Type_R; parameter [5:0] Op_Or = Op_Type_R; parameter [5:0] Op_Ori = 6'b00_1101; parameter [5:0] Op_Pref = 6'b11_0011; // Prefetch does nothing in this implementation. parameter [5:0] Op_Sb = 6'b10_1000; parameter [5:0] Op_Sc = 6'b11_1000; parameter [5:0] Op_Sh = 6'b10_1001; parameter [5:0] Op_Sll = Op_Type_R; parameter [5:0] Op_Sllv = Op_Type_R; parameter [5:0] Op_Slt = Op_Type_R; parameter [5:0] Op_Slti = 6'b00_1010; parameter [5:0] Op_Sltiu = 6'b00_1011; parameter [5:0] Op_Sltu = Op_Type_R; parameter [5:0] Op_Sra = Op_Type_R; parameter [5:0] Op_Srav = Op_Type_R; parameter [5:0] Op_Srl = Op_Type_R; parameter [5:0] Op_Srlv = Op_Type_R; parameter [5:0] Op_Sub = Op_Type_R; parameter [5:0] Op_Subu = Op_Type_R; parameter [5:0] Op_Sw = 6'b10_1011; parameter [5:0] Op_Swl = 6'b10_1010; parameter [5:0] Op_Swr = 6'b10_1110; parameter [5:0] Op_Syscall = Op_Type_R; parameter [5:0] Op_Teq = Op_Type_R; parameter [5:0] Op_Teqi = Op_Type_BI; parameter [5:0] Op_Tge = Op_Type_R; parameter [5:0] Op_Tgei = Op_Type_BI; parameter [5:0] Op_Tgeiu = Op_Type_BI; parameter [5:0] Op_Tgeu = Op_Type_R; parameter [5:0] Op_Tlt = Op_Type_R; parameter [5:0] Op_Tlti = Op_Type_BI; parameter [5:0] Op_Tltiu = Op_Type_BI; parameter [5:0] Op_Tltu = Op_Type_R; parameter [5:0] Op_Tne = Op_Type_R; parameter [5:0] Op_Tnei = Op_Type_BI; parameter [5:0] Op_Xor = Op_Type_R; parameter [5:0] Op_Xori = 6'b00_1110; /* Op Code Rt fields for Branches & Traps */ parameter [4:0] OpRt_Bgez = 5'b00001; parameter [4:0] OpRt_Bgezal = 5'b10001; parameter [4:0] OpRt_Bltz = 5'b00000; parameter [4:0] OpRt_Bltzal = 5'b10000; parameter [4:0] OpRt_Teqi = 5'b01100; parameter [4:0] OpRt_Tgei = 5'b01000; parameter [4:0] OpRt_Tgeiu = 5'b01001; parameter [4:0] OpRt_Tlti = 5'b01010; parameter [4:0] OpRt_Tltiu = 5'b01011; parameter [4:0] OpRt_Tnei = 5'b01110; /* Special handling for ERET */ parameter [4:0] OpRs_ERET = 5'b10000; parameter [5:0] Funct_ERET = 6'b011000; /* Function Codes for R-Type Op Codes */ parameter [5:0] Funct_Add = 6'b10_0000; parameter [5:0] Funct_Addu = 6'b10_0001; parameter [5:0] Funct_And = 6'b10_0100; parameter [5:0] Funct_Break = 6'b00_1101; parameter [5:0] Funct_Clo = 6'b10_0001; // same as Addu parameter [5:0] Funct_Clz = 6'b10_0000; // same as Add parameter [5:0] Funct_Div = 6'b01_1010; parameter [5:0] Funct_Divu = 6'b01_1011; parameter [5:0] Funct_Jr = 6'b00_1000; parameter [5:0] Funct_Jalr = 6'b00_1001; parameter [5:0] Funct_Madd = 6'b00_0000; parameter [5:0] Funct_Maddu = 6'b00_0001; parameter [5:0] Funct_Mfhi = 6'b01_0000; parameter [5:0] Funct_Mflo = 6'b01_0010; parameter [5:0] Funct_Movn = 6'b00_1011; parameter [5:0] Funct_Movz = 6'b00_1010; parameter [5:0] Funct_Msub = 6'b00_0100; // same as Sllv parameter [5:0] Funct_Msubu = 6'b00_0101; parameter [5:0] Funct_Mthi = 6'b01_0001; parameter [5:0] Funct_Mtlo = 6'b01_0011; parameter [5:0] Funct_Mul = 6'b00_0010; // same as Srl parameter [5:0] Funct_Mult = 6'b01_1000; parameter [5:0] Funct_Multu = 6'b01_1001; parameter [5:0] Funct_Nor = 6'b10_0111; parameter [5:0] Funct_Or = 6'b10_0101; parameter [5:0] Funct_Sll = 6'b00_0000; parameter [5:0] Funct_Sllv = 6'b00_0100; parameter [5:0] Funct_Slt = 6'b10_1010; parameter [5:0] Funct_Sltu = 6'b10_1011; parameter [5:0] Funct_Sra = 6'b00_0011; parameter [5:0] Funct_Srav = 6'b00_0111; parameter [5:0] Funct_Srl = 6'b00_0010; parameter [5:0] Funct_Srlv = 6'b00_0110; parameter [5:0] Funct_Sub = 6'b10_0010; parameter [5:0] Funct_Subu = 6'b10_0011; parameter [5:0] Funct_Syscall = 6'b00_1100; parameter [5:0] Funct_Teq = 6'b11_0100; parameter [5:0] Funct_Tge = 6'b11_0000; parameter [5:0] Funct_Tgeu = 6'b11_0001; parameter [5:0] Funct_Tlt = 6'b11_0010; parameter [5:0] Funct_Tltu = 6'b11_0011; parameter [5:0] Funct_Tne = 6'b11_0110; parameter [5:0] Funct_Xor = 6'b10_0110; /* ALU Operations (Implementation) */ parameter [4:0] AluOp_Add = 5'd1; parameter [4:0] AluOp_Addu = 5'd0; parameter [4:0] AluOp_And = 5'd2; parameter [4:0] AluOp_Clo = 5'd3; parameter [4:0] AluOp_Clz = 5'd4; parameter [4:0] AluOp_Div = 5'd5; parameter [4:0] AluOp_Divu = 5'd6; parameter [4:0] AluOp_Madd = 5'd7; parameter [4:0] AluOp_Maddu = 5'd8; parameter [4:0] AluOp_Mfhi = 5'd9; parameter [4:0] AluOp_Mflo = 5'd10; parameter [4:0] AluOp_Msub = 5'd13; parameter [4:0] AluOp_Msubu = 5'd14; parameter [4:0] AluOp_Mthi = 5'd11; parameter [4:0] AluOp_Mtlo = 5'd12; parameter [4:0] AluOp_Mul = 5'd15; parameter [4:0] AluOp_Mult = 5'd16; parameter [4:0] AluOp_Multu = 5'd17; parameter [4:0] AluOp_Nor = 5'd18; parameter [4:0] AluOp_Or = 5'd19; parameter [4:0] AluOp_Sll = 5'd20; //5'h14 parameter [4:0] AluOp_Sllc = 5'd21; // Move this if another AluOp is needed parameter [4:0] AluOp_Sllv = 5'd22; parameter [4:0] AluOp_Slt = 5'd23; parameter [4:0] AluOp_Sltu = 5'd24; parameter [4:0] AluOp_Sra = 5'd25; parameter [4:0] AluOp_Srav = 5'd26; parameter [4:0] AluOp_Srl = 5'd27; parameter [4:0] AluOp_Srlv = 5'd28; parameter [4:0] AluOp_Sub = 5'd29; parameter [4:0] AluOp_Subu = 5'd30; parameter [4:0] AluOp_Xor = 5'd31; // Movc:10->11, Trap:9->10, TrapCond:8->9, RegDst:7->8 /*** Datapath *** All Signals are Active High. Branching and Jump signals (determined by "PCSrc"), as well as ALU operation signals ("ALUOp") are handled by the controller and are not found here. Bit Name Description ------------------------------ 19: MemWriteDataGPRnHSE (GPR sau nHSE la Memorie) 0 = GPR la Mem; 1 = GPR la Mem 18: MemtoReg_nHSE (GPR sau Memory la nHSE) 0 = nHSE primeste de la iesirea ALU (GPR) ; 1 = de la Data Memory 17: nHSE RegWrite (nHSE reg Write) ----------------------------- 16: PCSrc[1] (Instruction Type) 15: PCSrc[0] 11: Instruction is Jump to Register 10: Instruction is Branch 01: Instruction is Jump to Immediate 00: Instruction does not branch nor jump 14: Link (Link on Branch/Jump) ------------------------------ 13: ALUSrc (ALU Source) [0=ALU input B is 2nd register file output; 1=Immediate value] 12: Movc (Conditional Move) 11: Trap (Trap Instruction) 10: TrapCond (Trap Condition) [0=ALU result is 0; 1=ALU result is not 0] 9 : RegDst (Register File Target) [0=Rt field; 1=Rd field] ------------------------------ 8 : LLSC (Load Linked or Store Conditional) 7 : MemRead (Data Memory Read) 6 : MemWrite (Data Memory Write) 5 : MemHalf (Half Word Memory Access) 4 : MemByte (Byte size Memory Access) 3 : MemSignExtend (Sign Extend Read Memory) [0=Zero Extend; 1=Sign Extend] ------------------------------ 2 : RegWrite (Register File Write) 1 : MemtoReg[1] (nHSE sau Memory la GPR) [10=nHSE to Register File (CFC2, MFC2, LWC2); 11=nu este folosit] 0 : MemtoReg[0] (nHSE sau Memory la GPR) [00=Register File este de la iesirea ALU ; 01= de la Data Memory] ------------------------------ */ parameter [19:0] DP_None = 20'b000_000_00000_000000_000; // Instructions which require nothing of the main datapath. parameter [19:0] DP_RType = 20'b000_000_00001_000000_100; // Standard R-Type parameter [19:0] DP_IType = 20'b000_000_10000_000000_100; // Standard I-Type parameter [19:0] DP_Branch = 20'b000_100_00000_000000_000; // Standard Branch parameter [19:0] DP_BranchLink = 20'b000_101_00000_000000_100; // Branch and Link parameter [19:0] DP_HiLoWr = 20'b000_000_00000_000000_000; // Write to Hi/Lo ALU register (Div,Divu,Mult,Multu,Mthi,Mtlo). Currently 'DP_None'. parameter [19:0] DP_Jump = 20'b000_010_00000_000000_000; // Standard Jump parameter [19:0] DP_JumpLink = 20'b000_011_00000_000000_100; // Jump and Link parameter [19:0] DP_JumpLinkReg = 20'b000_111_00000_000000_100; // Jump and Link Register parameter [19:0] DP_JumpReg = 20'b000_110_00000_000000_000; // Jump Register parameter [19:0] DP_LoadByteS = 20'b000_000_10000_010011_101; // Load Byte Signed parameter [19:0] DP_LoadByteU = 20'b000_000_10000_010010_101; // Load Byte Unsigned parameter [19:0] DP_LoadHalfS = 20'b000_000_10000_010101_101; // Load Half Signed parameter [19:0] DP_LoadHalfU = 20'b000_000_10000_010100_101; // Load Half Unsigned parameter [19:0] DP_LoadWord = 20'b000_000_10000_010000_101; // Load Word parameter [19:0] DP_LoadWordC2 = 20'b011_000_10000_010000_000; // Load Word from Memory to nHSE(COP2) parameter [19:0] DP_LoadWordC2_r = 20'b011_000_10000_010000_110; // Load Word from Memory to nHSE(COP2), scrie val. 0/1 din nHSE in GPR[rt] parameter [19:0] DP_LoadWordC2_r1= 20'b011_000_10000_010000_111; // Load Word from Memory to nHSE(COP2), scrie val. 0/1 din nHSE in GPR[rt] parameter [19:0] DP_ExtWrRt = 20'b000_000_00000_000000_100; // A DP-external write to Rt parameter [19:0] DP_ExtWrRd = 20'b000_000_00001_000000_100; // A DP-external write to Rd parameter [19:0] DP_ExtWrRtC2 = 20'b000_000_00000_000000_110; // A DP-COP2 write to Rt mfc2 to GPR parameter [19:0] DP_WrC2byRt = 20'b001_000_00000_000000_000; // A Rt write to COP2 !!! mtc2 parameter [19:0] DP_WrC2byRt_w = 20'b001_000_00000_000000_110; // instr. WAIT ce scrie in COP2 si in GPR parameter [19:0] DP_Movc = 20'b000_000_01001_000000_100; // Conditional Move parameter [19:0] DP_LoadLinked = 20'b000_000_10000_110000_101; // Load Linked parameter [19:0] DP_StoreCond = 20'b000_000_10000_101000_101; // Store Conditional parameter [19:0] DP_StoreByte = 20'b000_000_10000_001010_000; // Store Byte parameter [19:0] DP_StoreHalf = 20'b000_000_10000_001100_000; // Store Half parameter [19:0] DP_StoreWord = 20'b000_000_10000_001000_000; // Store Word parameter [19:0] DP_StoreWordC2 = 20'b100_000_10000_001000_000;// Store Word from nHSE (COP2) to Memory (nu scrie nimic in GPR) parameter [19:0] DP_TrapRegCNZ = 20'b000_000_00110_000000_000; // Trap using Rs and Rt, non-zero ALU (Tlt, Tltu, Tne) parameter [19:0] DP_TrapRegCZ = 20'b000_000_00100_000000_000; // Trap using RS and Rt, zero ALU (Teq, Tge, Tgeu) parameter [19:0] DP_TrapImmCNZ = 20'b000_000_10110_000000_000; // Trap using Rs and Imm, non-zero ALU (Tlti, Tltiu, Tnei) parameter [19:0] DP_TrapImmCZ = 20'b000_000_10100_000000_000; // Trap using Rs and Imm, zero ALU (Teqi, Tgei, Tgeiu) //-------------------------------------------------------- parameter [19:0] DP_Add = DP_RType; parameter [19:0] DP_Addi = DP_IType; parameter [19:0] DP_Addiu = DP_IType; parameter [19:0] DP_Addu = DP_RType; parameter [19:0] DP_And = DP_RType; parameter [19:0] DP_Andi = DP_IType; parameter [19:0] DP_Beq = DP_Branch; parameter [19:0] DP_Bgez = DP_Branch; parameter [19:0] DP_Bgezal = DP_BranchLink; parameter [19:0] DP_Bgtz = DP_Branch; parameter [19:0] DP_Blez = DP_Branch; parameter [19:0] DP_Bltz = DP_Branch; parameter [19:0] DP_Bltzal = DP_BranchLink; parameter [19:0] DP_Bne = DP_Branch; parameter [19:0] DP_Break = DP_None; parameter [19:0] DP_Clo = DP_RType; parameter [19:0] DP_Clz = DP_RType; parameter [19:0] DP_Div = DP_HiLoWr; parameter [19:0] DP_Divu = DP_HiLoWr; parameter [19:0] DP_Eret = DP_None; parameter [19:0] DP_J = DP_Jump; parameter [19:0] DP_Jal = DP_JumpLink; parameter [19:0] DP_Jalr = DP_JumpLinkReg; parameter [19:0] DP_Jr = DP_JumpReg; parameter [19:0] DP_Lb = DP_LoadByteS; parameter [19:0] DP_Lbu = DP_LoadByteU; parameter [19:0] DP_Lh = DP_LoadHalfS; parameter [19:0] DP_Lhu = DP_LoadHalfU; parameter [19:0] DP_Ll = DP_LoadLinked; parameter [19:0] DP_Lui = DP_IType; parameter [19:0] DP_Lw = DP_LoadWord; parameter [19:0] DP_Lwl = DP_LoadWord; parameter [19:0] DP_Lwr = DP_LoadWord; parameter [19:0] DP_Madd = DP_HiLoWr; parameter [19:0] DP_Maddu = DP_HiLoWr; parameter [19:0] DP_Mfc0 = DP_ExtWrRt; parameter [19:0] DP_Mfc2 = DP_ExtWrRtC2; parameter [19:0] DP_Mfhi = DP_ExtWrRd; parameter [19:0] DP_Mflo = DP_ExtWrRd; parameter [19:0] DP_Movn = DP_Movc; parameter [19:0] DP_Movz = DP_Movc; parameter [19:0] DP_Msub = DP_HiLoWr; parameter [19:0] DP_Msubu = DP_HiLoWr; parameter [19:0] DP_Mtc0 = DP_None; parameter [19:0] DP_Mtc2 = DP_WrC2byRt; parameter [19:0] DP_Mtc2_w = DP_WrC2byRt_w; parameter [19:0] DP_Mthi = DP_HiLoWr; parameter [19:0] DP_Mtlo = DP_HiLoWr; parameter [19:0] DP_Mul = DP_RType; parameter [19:0] DP_Mult = DP_HiLoWr; parameter [19:0] DP_Multu = DP_HiLoWr; parameter [19:0] DP_Nor = DP_RType; parameter [19:0] DP_Or = DP_RType; parameter [19:0] DP_Ori = DP_IType; parameter [19:0] DP_Pref = DP_None; parameter [19:0] DP_Sb = DP_StoreByte; parameter [19:0] DP_Sc = DP_StoreCond; parameter [19:0] DP_Sh = DP_StoreHalf; parameter [19:0] DP_Sll = DP_RType; parameter [19:0] DP_Sllv = DP_RType; parameter [19:0] DP_Slt = DP_RType; parameter [19:0] DP_Slti = DP_IType; parameter [19:0] DP_Sltiu = DP_IType; parameter [19:0] DP_Sltu = DP_RType; parameter [19:0] DP_Sra = DP_RType; parameter [19:0] DP_Srav = DP_RType; parameter [19:0] DP_Srl = DP_RType; parameter [19:0] DP_Srlv = DP_RType; parameter [19:0] DP_Sub = DP_RType; parameter [19:0] DP_Subu = DP_RType; parameter [19:0] DP_Sw = DP_StoreWord; parameter [19:0] DP_Swl = DP_StoreWord; parameter [19:0] DP_Swr = DP_StoreWord; parameter [19:0] DP_Syscall = DP_None; parameter [19:0] DP_Teq = DP_TrapRegCZ; parameter [19:0] DP_Teqi = DP_TrapImmCZ; parameter [19:0] DP_Tge = DP_TrapRegCZ; parameter [19:0] DP_Tgei = DP_TrapImmCZ; parameter [19:0] DP_Tgeiu = DP_TrapImmCZ; parameter [19:0] DP_Tgeu = DP_TrapRegCZ; parameter [19:0] DP_Tlt = DP_TrapRegCNZ; parameter [19:0] DP_Tlti = DP_TrapImmCNZ; parameter [19:0] DP_Tltiu = DP_TrapImmCNZ; parameter [19:0] DP_Tltu = DP_TrapRegCNZ; parameter [19:0] DP_Tne = DP_TrapRegCNZ; parameter [19:0] DP_Tnei = DP_TrapImmCNZ; parameter [19:0] DP_Xor = DP_RType; parameter [19:0] DP_Xori = DP_IType; /*** Exception Information *** All signals are Active High. Bit Meaning ------------ 2: Instruction can cause exceptions in ID 1: Instruction can cause exceptions in EX 0: Instruction can cause exceptions in MEM */ parameter [2:0] EXC_None = 3'b000; parameter [2:0] EXC_ID = 3'b100; parameter [2:0] EXC_EX = 3'b010; parameter [2:0] EXC_MEM = 3'b001; //-------------------------------- parameter [2:0] EXC_Add = EXC_EX; parameter [2:0] EXC_Addi = EXC_EX; parameter [2:0] EXC_Addiu = EXC_None; parameter [2:0] EXC_Addu = EXC_None; parameter [2:0] EXC_And = EXC_None; parameter [2:0] EXC_Andi = EXC_None; parameter [2:0] EXC_Beq = EXC_None; parameter [2:0] EXC_Bgez = EXC_None; parameter [2:0] EXC_Bgezal = EXC_None; parameter [2:0] EXC_Bgtz = EXC_None; parameter [2:0] EXC_Blez = EXC_None; parameter [2:0] EXC_Bltz = EXC_None; parameter [2:0] EXC_Bltzal = EXC_None; parameter [2:0] EXC_Bne = EXC_None; parameter [2:0] EXC_Break = EXC_ID; parameter [2:0] EXC_Clo = EXC_None; parameter [2:0] EXC_Clz = EXC_None; parameter [2:0] EXC_Div = EXC_None; parameter [2:0] EXC_Divu = EXC_None; parameter [2:0] EXC_Eret = EXC_ID; parameter [2:0] EXC_J = EXC_None; parameter [2:0] EXC_Jal = EXC_None; parameter [2:0] EXC_Jalr = EXC_None; parameter [2:0] EXC_Jr = EXC_None; parameter [2:0] EXC_Lb = EXC_MEM; parameter [2:0] EXC_Lbu = EXC_MEM; parameter [2:0] EXC_Lh = EXC_MEM; parameter [2:0] EXC_Lhu = EXC_MEM; parameter [2:0] EXC_Ll = EXC_MEM; parameter [2:0] EXC_Lui = EXC_None; parameter [2:0] EXC_Lw = EXC_MEM; parameter [2:0] EXC_Lwl = EXC_MEM; parameter [2:0] EXC_Lwr = EXC_MEM; parameter [2:0] EXC_Madd = EXC_None; parameter [2:0] EXC_Maddu = EXC_None; parameter [2:0] EXC_Mfc0 = EXC_ID; parameter [2:0] EXC_Mfc2 = EXC_ID; parameter [2:0] EXC_Mfhi = EXC_None; parameter [2:0] EXC_Mflo = EXC_None; parameter [2:0] EXC_Movn = EXC_None; parameter [2:0] EXC_Movz = EXC_None; parameter [2:0] EXC_Msub = EXC_None; parameter [2:0] EXC_Msubu = EXC_None; parameter [2:0] EXC_Mtc0 = EXC_ID; parameter [2:0] EXC_Mtc2 = EXC_ID; parameter [2:0] EXC_Mthi = EXC_None; parameter [2:0] EXC_Mtlo = EXC_None; parameter [2:0] EXC_Mul = EXC_None; parameter [2:0] EXC_Mult = EXC_None; parameter [2:0] EXC_Multu = EXC_None; parameter [2:0] EXC_Nor = EXC_None; parameter [2:0] EXC_Or = EXC_None; parameter [2:0] EXC_Ori = EXC_None; parameter [2:0] EXC_Pref = EXC_None; // XXX parameter [2:0] EXC_Sb = EXC_MEM; parameter [2:0] EXC_Sc = EXC_MEM; parameter [2:0] EXC_Sh = EXC_MEM; parameter [2:0] EXC_Sll = EXC_None; parameter [2:0] EXC_Sllv = EXC_None; parameter [2:0] EXC_Slt = EXC_None; parameter [2:0] EXC_Slti = EXC_None; parameter [2:0] EXC_Sltiu = EXC_None; parameter [2:0] EXC_Sltu = EXC_None; parameter [2:0] EXC_Sra = EXC_None; parameter [2:0] EXC_Srav = EXC_None; parameter [2:0] EXC_Srl = EXC_None; parameter [2:0] EXC_Srlv = EXC_None; parameter [2:0] EXC_Sub = EXC_EX; parameter [2:0] EXC_Subu = EXC_None; parameter [2:0] EXC_Sw = EXC_MEM; parameter [2:0] EXC_Swl = EXC_MEM; parameter [2:0] EXC_Swr = EXC_MEM; parameter [2:0] EXC_Syscall = EXC_ID; parameter [2:0] EXC_Teq = EXC_MEM; parameter [2:0] EXC_Teqi = EXC_MEM; parameter [2:0] EXC_Tge = EXC_MEM; parameter [2:0] EXC_Tgei = EXC_MEM; parameter [2:0] EXC_Tgeiu = EXC_MEM; parameter [2:0] EXC_Tgeu = EXC_MEM; parameter [2:0] EXC_Tlt = EXC_MEM; parameter [2:0] EXC_Tlti = EXC_MEM; parameter [2:0] EXC_Tltiu = EXC_MEM; parameter [2:0] EXC_Tltu = EXC_MEM; parameter [2:0] EXC_Tne = EXC_MEM; parameter [2:0] EXC_Tnei = EXC_MEM; parameter [2:0] EXC_Xor = EXC_None; parameter [2:0] EXC_Xori = EXC_None; /*** Hazard & Forwarding Datapath *** All signals are Active High. Bit Meaning ------------ 7: Wants Rs by ID 6: Needs Rs by ID 5: Wants Rt by ID 4: Needs Rt by ID 3: Wants Rs by EX 2: Needs Rs by EX 1: Wants Rt by EX 0: Needs Rt by EX */ parameter [7:0] HAZ_Nothing = 8'b00000000; // Jumps, Lui, Mfhi/lo, special, etc. parameter [7:0] HAZ_IDRsIDRt = 8'b11110000; // Beq, Bne, Traps parameter [7:0] HAZ_IDRs = 8'b11000000; // Most branches, Jumps to registers parameter [7:0] HAZ_IDRt = 8'b00110000; // Mtc0 parameter [7:0] HAZ_IDRtEXRs = 8'b10111100; // Movn, Movz parameter [7:0] HAZ_EXRsEXRt = 8'b10101111; // Many R-Type ops parameter [7:0] HAZ_EXRs = 8'b10001100; // Immediates: Loads, Clo/z, Mthi/lo, etc. parameter [7:0] HAZ_EXRsWRt = 8'b10101110; // Stores parameter [7:0] HAZ_EXRt = 8'b00100011; // Shifts using Shamt field //----------------------------------------- parameter [7:0] HAZ_Add = HAZ_EXRsEXRt; parameter [7:0] HAZ_Addi = HAZ_EXRs; parameter [7:0] HAZ_Addiu = HAZ_EXRs; parameter [7:0] HAZ_Addu = HAZ_EXRsEXRt; parameter [7:0] HAZ_And = HAZ_EXRsEXRt; parameter [7:0] HAZ_Andi = HAZ_EXRs; parameter [7:0] HAZ_Beq = HAZ_IDRsIDRt; parameter [7:0] HAZ_Bgez = HAZ_IDRs; parameter [7:0] HAZ_Bgezal = HAZ_IDRs; parameter [7:0] HAZ_Bgtz = HAZ_IDRs; parameter [7:0] HAZ_Blez = HAZ_IDRs; parameter [7:0] HAZ_Bltz = HAZ_IDRs; parameter [7:0] HAZ_Bltzal = HAZ_IDRs; parameter [7:0] HAZ_Bne = HAZ_IDRsIDRt; parameter [7:0] HAZ_Break = HAZ_Nothing; parameter [7:0] HAZ_Clo = HAZ_EXRs; parameter [7:0] HAZ_Clz = HAZ_EXRs; parameter [7:0] HAZ_Div = HAZ_EXRsEXRt; parameter [7:0] HAZ_Divu = HAZ_EXRsEXRt; parameter [7:0] HAZ_Eret = HAZ_Nothing; parameter [7:0] HAZ_J = HAZ_Nothing; parameter [7:0] HAZ_Jal = HAZ_Nothing; parameter [7:0] HAZ_Jalr = HAZ_IDRs; parameter [7:0] HAZ_Jr = HAZ_IDRs; parameter [7:0] HAZ_Lb = HAZ_EXRs; parameter [7:0] HAZ_Lbu = HAZ_EXRs; parameter [7:0] HAZ_Lh = HAZ_EXRs; parameter [7:0] HAZ_Lhu = HAZ_EXRs; parameter [7:0] HAZ_Ll = HAZ_EXRs; parameter [7:0] HAZ_Lui = HAZ_Nothing; parameter [7:0] HAZ_Lw = HAZ_EXRs; parameter [7:0] HAZ_Lwl = HAZ_EXRsEXRt; parameter [7:0] HAZ_Lwr = HAZ_EXRsEXRt; parameter [7:0] HAZ_Madd = HAZ_EXRsEXRt; parameter [7:0] HAZ_Maddu = HAZ_EXRsEXRt; parameter [7:0] HAZ_Mfc0 = HAZ_Nothing; parameter [7:0] HAZ_Mfhi = HAZ_Nothing; parameter [7:0] HAZ_Mflo = HAZ_Nothing; parameter [7:0] HAZ_Movn = HAZ_IDRtEXRs; parameter [7:0] HAZ_Movz = HAZ_IDRtEXRs; parameter [7:0] HAZ_Msub = HAZ_EXRsEXRt; parameter [7:0] HAZ_Msubu = HAZ_EXRsEXRt; parameter [7:0] HAZ_Mtc0 = HAZ_IDRt; parameter [7:0] HAZ_Mthi = HAZ_EXRs; parameter [7:0] HAZ_Mtlo = HAZ_EXRs; parameter [7:0] HAZ_Mul = HAZ_EXRsEXRt; parameter [7:0] HAZ_Mult = HAZ_EXRsEXRt; parameter [7:0] HAZ_Multu = HAZ_EXRsEXRt; parameter [7:0] HAZ_Nor = HAZ_EXRsEXRt; parameter [7:0] HAZ_Or = HAZ_EXRsEXRt; parameter [7:0] HAZ_Ori = HAZ_EXRs; parameter [7:0] HAZ_Pref = HAZ_Nothing; // XXX parameter [7:0] HAZ_Sb = HAZ_EXRsWRt; parameter [7:0] HAZ_Sc = HAZ_EXRsWRt; parameter [7:0] HAZ_Sh = HAZ_EXRsWRt; parameter [7:0] HAZ_Sll = HAZ_EXRt; parameter [7:0] HAZ_Sllv = HAZ_EXRsEXRt; parameter [7:0] HAZ_Slt = HAZ_EXRsEXRt; parameter [7:0] HAZ_Slti = HAZ_EXRs; parameter [7:0] HAZ_Sltiu = HAZ_EXRs; parameter [7:0] HAZ_Sltu = HAZ_EXRsEXRt; parameter [7:0] HAZ_Sra = HAZ_EXRt; parameter [7:0] HAZ_Srav = HAZ_EXRsEXRt; parameter [7:0] HAZ_Srl = HAZ_EXRt; parameter [7:0] HAZ_Srlv = HAZ_EXRsEXRt; parameter [7:0] HAZ_Sub = HAZ_EXRsEXRt; parameter [7:0] HAZ_Subu = HAZ_EXRsEXRt; parameter [7:0] HAZ_Sw = HAZ_EXRsWRt; parameter [7:0] HAZ_Swl = HAZ_EXRsWRt; parameter [7:0] HAZ_Swr = HAZ_EXRsWRt; parameter [7:0] HAZ_Syscall = HAZ_Nothing; parameter [7:0] HAZ_Teq = HAZ_EXRsEXRt; parameter [7:0] HAZ_Teqi = HAZ_EXRs; parameter [7:0] HAZ_Tge = HAZ_EXRsEXRt; parameter [7:0] HAZ_Tgei = HAZ_EXRs; parameter [7:0] HAZ_Tgeiu = HAZ_EXRs; parameter [7:0] HAZ_Tgeu = HAZ_EXRsEXRt; parameter [7:0] HAZ_Tlt = HAZ_EXRsEXRt; parameter [7:0] HAZ_Tlti = HAZ_EXRs; parameter [7:0] HAZ_Tltiu = HAZ_EXRs; parameter [7:0] HAZ_Tltu = HAZ_EXRsEXRt; parameter [7:0] HAZ_Tne = HAZ_EXRsEXRt; parameter [7:0] HAZ_Tnei = HAZ_EXRs; parameter [7:0] HAZ_Xor = HAZ_EXRsEXRt; parameter [7:0] HAZ_Xori = HAZ_EXRs;