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

Subversion Repositories mips32r1

[/] [mips32r1/] [trunk/] [Hardware/] [MIPS32_Standalone/] [EXMEM_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         : EXMEM_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 Execute and Memory stages.
17
 */
18
module EXMEM_Stage(
19
        input  clock,
20
        input  reset,
21
    input  EX_Flush,
22
        input  EX_Stall,
23
        input  M_Stall,
24
        // Control Signals
25
    input  EX_Movn,
26
    input  EX_Movz,
27
    input  EX_BZero,
28
        input  EX_RegWrite,  // Future Control to WB
29
        input  EX_MemtoReg,  // Future Control to WB
30
    input  EX_ReverseEndian,
31
    input  EX_LLSC,
32
        input  EX_MemRead,
33
        input  EX_MemWrite,
34
        input  EX_MemByte,
35
        input  EX_MemHalf,
36
        input  EX_MemSignExtend,
37
    input  EX_Left,
38
    input  EX_Right,
39
        // Exception Control/Info
40
    input  EX_KernelMode,
41
    input  [31:0] EX_RestartPC,
42
    input  EX_IsBDS,
43
    input  EX_Trap,
44
    input  EX_TrapCond,
45
    input  EX_M_CanErr,
46
        // Data Signals
47
        input  [31:0] EX_ALU_Result,
48
        input  [31:0] EX_ReadData2,
49
        input  [4:0]  EX_RtRd,
50
        // ------------------
51
        output reg M_RegWrite,
52
        output reg M_MemtoReg,
53
    output reg M_ReverseEndian,
54
    output reg M_LLSC,
55
        output reg M_MemRead,
56
        output reg M_MemWrite,
57
        output reg M_MemByte,
58
        output reg M_MemHalf,
59
        output reg M_MemSignExtend,
60
    output reg M_Left,
61
    output reg M_Right,
62
    output reg M_KernelMode,
63
    output reg [31:0] M_RestartPC,
64
    output reg M_IsBDS,
65
    output reg M_Trap,
66
    output reg M_TrapCond,
67
    output reg M_M_CanErr,
68
        output reg [31:0] M_ALU_Result,
69
        output reg [31:0] M_ReadData2,
70
        output reg [4:0]  M_RtRd
71
        );
72
 
73
    /***
74
     The purpose of a pipeline register is to capture data from one pipeline stage
75
     and provide it to the next pipeline stage. This creates at least one clock cycle
76
     of delay, but reduces the combinatorial path length of signals which allows for
77
     higher clock speeds.
78
 
79
     All pipeline registers update unless the forward stage is stalled. When this occurs
80
     or when the current stage is being flushed, the forward stage will receive data that
81
     is effectively a NOP and causes nothing to happen throughout the remaining pipeline
82
     traversal. In other words:
83
 
84
     A stall masks all control signals to forward stages. A flush permanently clears
85
     control signals to forward stages (but not certain data for exception purposes).
86
    ***/
87
 
88
    // Mask of RegWrite if a Move Conditional failed.
89
    wire MovcRegWrite = (EX_Movn & ~EX_BZero) | (EX_Movz & EX_BZero);
90
 
91
    always @(posedge clock) begin
92
        M_RegWrite      <= (reset) ? 0     : ((M_Stall) ? M_RegWrite      : ((EX_Stall | EX_Flush) ? 0 : EX_RegWrite));
93
        M_RegWrite      <= (reset) ? 0     : ((M_Stall) ? M_RegWrite      : ((EX_Stall | EX_Flush) ? 0 : ((EX_Movn | EX_Movz) ? MovcRegWrite : EX_RegWrite)));
94
        M_MemtoReg      <= (reset) ? 0     : ((M_Stall) ? M_MemtoReg                                   : EX_MemtoReg);
95
        M_ReverseEndian <= (reset) ? 0     : ((M_Stall) ? M_ReverseEndian                              : EX_ReverseEndian);
96
        M_LLSC          <= (reset) ? 0     : ((M_Stall) ? M_LLSC                                       : EX_LLSC);
97
        M_MemRead       <= (reset) ? 0     : ((M_Stall) ? M_MemRead       : ((EX_Stall | EX_Flush) ? 0 : EX_MemRead));
98
        M_MemWrite      <= (reset) ? 0     : ((M_Stall) ? M_MemWrite      : ((EX_Stall | EX_Flush) ? 0 : EX_MemWrite));
99
        M_MemByte       <= (reset) ? 0     : ((M_Stall) ? M_MemByte                                    : EX_MemByte);
100
        M_MemHalf       <= (reset) ? 0     : ((M_Stall) ? M_MemHalf                                    : EX_MemHalf);
101
        M_MemSignExtend <= (reset) ? 0     : ((M_Stall) ? M_MemSignExtend                              : EX_MemSignExtend);
102
        M_Left          <= (reset) ? 0     : ((M_Stall) ? M_Left                                       : EX_Left);
103
        M_Right         <= (reset) ? 0     : ((M_Stall) ? M_Right                                      : EX_Right);
104
        M_KernelMode    <= (reset) ? 0     : ((M_Stall) ? M_KernelMode                                 : EX_KernelMode);
105
        M_RestartPC     <= (reset) ? 32'b0 : ((M_Stall) ? M_RestartPC                                  : EX_RestartPC);
106
        M_IsBDS         <= (reset) ? 0     : ((M_Stall) ? M_IsBDS                                      : EX_IsBDS);
107
        M_Trap          <= (reset) ? 0     : ((M_Stall) ? M_Trap          : ((EX_Stall | EX_Flush) ? 0 : EX_Trap));
108
        M_TrapCond      <= (reset) ? 0     : ((M_Stall) ? M_TrapCond                                   : EX_TrapCond);
109
        M_M_CanErr      <= (reset) ? 0     : ((M_Stall) ? M_M_CanErr      : ((EX_Stall | EX_Flush) ? 0 : EX_M_CanErr));
110
        M_ALU_Result    <= (reset) ? 32'b0 : ((M_Stall) ? M_ALU_Result                                 : EX_ALU_Result);
111
        M_ReadData2     <= (reset) ? 32'b0 : ((M_Stall) ? M_ReadData2                                  : EX_ReadData2);
112
        M_RtRd          <= (reset) ? 5'b0  : ((M_Stall) ? M_RtRd                                       : EX_RtRd);
113
    end
114
 
115
endmodule

powered by: WebSVN 2.1.0

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