OpenCores
URL https://opencores.org/ocsvn/mips32r1/mips32r1/trunk

Subversion Repositories mips32r1

[/] [mips32r1/] [trunk/] [Hardware/] [XUPV5-LX110T_SoC/] [MIPS32-Pipelined-Hw/] [src/] [MIPS32/] [IDEX_Stage.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ayersg
`timescale 1ns / 1ps
2
/*
3
 * File         : IDEX_Stage.v
4
 * Project      : University of Utah, XUM Project MIPS32 core
5
 * Creator(s)   : Grant Ayers (ayers@cs.utah.edu)
6
 *
7
 * Modification History:
8
 *   Rev   Date         Initials  Description of Change
9
 *   1.0   9-Jun-2011   GEA       Initial design.
10
 *   2.0   26-Jul-2012  GEA       Many updates have been made.
11
 *
12
 * Standards/Formatting:
13
 *   Verilog 2001, 4 soft tab, wide column.
14
 *
15
 * Description:
16
 *   The Pipeline Register to bridge the Instruction Decode
17
 *   and Execute stages.
18
 */
19
module IDEX_Stage(
20
    input  clock,
21
    input  reset,
22
    input  ID_Flush,
23
    input  ID_Stall,
24
    input  EX_Stall,
25
    // Control Signals
26
    input  ID_Link,
27
    input  ID_RegDst,
28
    input  ID_ALUSrcImm,
29
    input  [4:0] ID_ALUOp,
30
    input  ID_Movn,
31
    input  ID_Movz,
32
    input  ID_LLSC,
33
    input  ID_MemRead,
34
    input  ID_MemWrite,
35
    input  ID_MemByte,
36
    input  ID_MemHalf,
37
    input  ID_MemSignExtend,
38
    input  ID_Left,
39
    input  ID_Right,
40
    input  ID_RegWrite,
41
    input  ID_MemtoReg,
42
    input  ID_ReverseEndian,
43
    // Hazard & Forwarding
44
    input  [4:0] ID_Rs,
45
    input  [4:0] ID_Rt,
46
    input  ID_WantRsByEX,
47
    input  ID_NeedRsByEX,
48
    input  ID_WantRtByEX,
49
    input  ID_NeedRtByEX,
50
    // Exception Control/Info
51
    input  ID_KernelMode,
52
    input  [31:0] ID_RestartPC,
53
    input  ID_IsBDS,
54
    input  ID_Trap,
55
    input  ID_TrapCond,
56
    input  ID_EX_CanErr,
57
    input  ID_M_CanErr,
58
    // Data Signals
59
    input  [31:0] ID_ReadData1,
60
    input  [31:0] ID_ReadData2,
61
    input  [16:0] ID_SignExtImm, // ID_Rd, ID_Shamt included here
62
    // ----------------
63
    output reg EX_Link,
64
    output [1:0] EX_LinkRegDst,
65
    output reg EX_ALUSrcImm,
66
    output reg [4:0] EX_ALUOp,
67
    output reg EX_Movn,
68
    output reg EX_Movz,
69
    output reg EX_LLSC,
70
    output reg EX_MemRead,
71
    output reg EX_MemWrite,
72
    output reg EX_MemByte,
73
    output reg EX_MemHalf,
74
    output reg EX_MemSignExtend,
75
    output reg EX_Left,
76
    output reg EX_Right,
77
    output reg EX_RegWrite,
78
    output reg EX_MemtoReg,
79
    output reg EX_ReverseEndian,
80
    output reg [4:0]  EX_Rs,
81
    output reg [4:0]  EX_Rt,
82
    output reg EX_WantRsByEX,
83
    output reg EX_NeedRsByEX,
84
    output reg EX_WantRtByEX,
85
    output reg EX_NeedRtByEX,
86
    output reg EX_KernelMode,
87
    output reg [31:0] EX_RestartPC,
88
    output reg EX_IsBDS,
89
    output reg EX_Trap,
90
    output reg EX_TrapCond,
91
    output reg EX_EX_CanErr,
92
    output reg EX_M_CanErr,
93
    output reg [31:0] EX_ReadData1,
94
    output reg [31:0] EX_ReadData2,
95
    output [31:0] EX_SignExtImm,
96
    output [4:0]      EX_Rd,
97
    output [4:0]      EX_Shamt
98
    );
99
 
100
    /***
101
     The purpose of a pipeline register is to capture data from one pipeline stage
102
     and provide it to the next pipeline stage. This creates at least one clock cycle
103
     of delay, but reduces the combinatorial path length of signals which allows for
104
     higher clock speeds.
105
 
106
     All pipeline registers update unless the forward stage is stalled. When this occurs
107
     or when the current stage is being flushed, the forward stage will receive data that
108
     is effectively a NOP and causes nothing to happen throughout the remaining pipeline
109
     traversal. In other words:
110
 
111
     A stall masks all control signals to forward stages. A flush permanently clears
112
     control signals to forward stages (but not certain data for exception purposes).
113
    ***/
114
 
115
    reg [16:0] EX_SignExtImm_pre;
116
    reg EX_RegDst;
117
    assign EX_LinkRegDst = (EX_Link) ? 2'b10 : ((EX_RegDst) ? 2'b01 : 2'b00);
118
    assign EX_Rd = EX_SignExtImm[15:11];
119
    assign EX_Shamt = EX_SignExtImm[10:6];
120
    assign EX_SignExtImm = (EX_SignExtImm_pre[16]) ? {15'h7fff, EX_SignExtImm_pre[16:0]} : {15'h0000, EX_SignExtImm_pre[16:0]};
121
 
122
    always @(posedge clock) begin
123
        EX_Link           <= (reset) ? 0     : ((EX_Stall) ? EX_Link                                       : ID_Link);
124
        EX_RegDst         <= (reset) ? 0     : ((EX_Stall) ? EX_RegDst                                     : ID_RegDst);
125
        EX_ALUSrcImm      <= (reset) ? 0     : ((EX_Stall) ? EX_ALUSrcImm                                  : ID_ALUSrcImm);
126
        EX_ALUOp          <= (reset) ? 5'b0  : ((EX_Stall) ? EX_ALUOp         : ((ID_Stall | ID_Flush) ? 5'b0 : ID_ALUOp));
127
        EX_Movn           <= (reset) ? 0     : ((EX_Stall) ? EX_Movn                                       : ID_Movn);
128
        EX_Movz           <= (reset) ? 0     : ((EX_Stall) ? EX_Movz                                       : ID_Movz);
129
        EX_LLSC           <= (reset) ? 0     : ((EX_Stall) ? EX_LLSC                                       : ID_LLSC);
130
        EX_MemRead        <= (reset) ? 0     : ((EX_Stall) ? EX_MemRead       : ((ID_Stall | ID_Flush) ? 0 : ID_MemRead));
131
        EX_MemWrite       <= (reset) ? 0     : ((EX_Stall) ? EX_MemWrite      : ((ID_Stall | ID_Flush) ? 0 : ID_MemWrite));
132
        EX_MemByte        <= (reset) ? 0     : ((EX_Stall) ? EX_MemByte                                    : ID_MemByte);
133
        EX_MemHalf        <= (reset) ? 0     : ((EX_Stall) ? EX_MemHalf                                    : ID_MemHalf);
134
        EX_MemSignExtend  <= (reset) ? 0     : ((EX_Stall) ? EX_MemSignExtend                              : ID_MemSignExtend);
135
        EX_Left           <= (reset) ? 0     : ((EX_Stall) ? EX_Left                                       : ID_Left);
136
        EX_Right          <= (reset) ? 0     : ((EX_Stall) ? EX_Right                                      : ID_Right);
137
        EX_RegWrite       <= (reset) ? 0     : ((EX_Stall) ? EX_RegWrite      : ((ID_Stall | ID_Flush) ? 0 : ID_RegWrite));
138
        EX_MemtoReg       <= (reset) ? 0     : ((EX_Stall) ? EX_MemtoReg                                   : ID_MemtoReg);
139
        EX_ReverseEndian  <= (reset) ? 0     : ((EX_Stall) ? EX_ReverseEndian                              : ID_ReverseEndian);
140
        EX_RestartPC      <= (reset) ? 32'b0 : ((EX_Stall) ? EX_RestartPC                                  : ID_RestartPC);
141
        EX_IsBDS          <= (reset) ? 0     : ((EX_Stall) ? EX_IsBDS                                      : ID_IsBDS);
142
        EX_Trap           <= (reset) ? 0     : ((EX_Stall) ? EX_Trap          : ((ID_Stall | ID_Flush) ? 0 : ID_Trap));
143
        EX_TrapCond       <= (reset) ? 0     : ((EX_Stall) ? EX_TrapCond                                   : ID_TrapCond);
144
        EX_EX_CanErr      <= (reset) ? 0     : ((EX_Stall) ? EX_EX_CanErr     : ((ID_Stall | ID_Flush) ? 0 : ID_EX_CanErr));
145
        EX_M_CanErr       <= (reset) ? 0     : ((EX_Stall) ? EX_M_CanErr      : ((ID_Stall | ID_Flush) ? 0 : ID_M_CanErr));
146
        EX_ReadData1      <= (reset) ? 32'b0 : ((EX_Stall) ? EX_ReadData1                                  : ID_ReadData1);
147
        EX_ReadData2      <= (reset) ? 32'b0 : ((EX_Stall) ? EX_ReadData2                                  : ID_ReadData2);
148
        EX_SignExtImm_pre <= (reset) ? 17'b0 : ((EX_Stall) ? EX_SignExtImm_pre                             : ID_SignExtImm);
149
        EX_Rs             <= (reset) ? 5'b0  : ((EX_Stall) ? EX_Rs                                         : ID_Rs);
150
        EX_Rt             <= (reset) ? 5'b0  : ((EX_Stall) ? EX_Rt                                         : ID_Rt);
151
        EX_WantRsByEX     <= (reset) ? 0     : ((EX_Stall) ? EX_WantRsByEX    : ((ID_Stall | ID_Flush) ? 0 : ID_WantRsByEX));
152
        EX_NeedRsByEX     <= (reset) ? 0     : ((EX_Stall) ? EX_NeedRsByEX    : ((ID_Stall | ID_Flush) ? 0 : ID_NeedRsByEX));
153
        EX_WantRtByEX     <= (reset) ? 0     : ((EX_Stall) ? EX_WantRtByEX    : ((ID_Stall | ID_Flush) ? 0 : ID_WantRtByEX));
154
        EX_NeedRtByEX     <= (reset) ? 0     : ((EX_Stall) ? EX_NeedRtByEX    : ((ID_Stall | ID_Flush) ? 0 : ID_NeedRtByEX));
155
        EX_KernelMode     <= (reset) ? 0     : ((EX_Stall) ? EX_KernelMode                                 : ID_KernelMode);
156
    end
157
 
158
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.