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

Subversion Repositories fluid_core_2

[/] [fluid_core_2/] [trunk/] [rtl/] [MEM_Stage.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 azmathmoos
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
//// Copyright (C) 2014-2015 Azmath Moosa                         ////
4
////                                                              ////
5
//// This source file may be used and distributed without         ////
6
//// restriction provided that this copyright statement is not    ////
7
//// removed from the file and that any derivative work contains  ////
8
//// the original copyright notice and the associated disclaimer. ////
9
////                                                              ////
10
//// This source file is free software; you can redistribute it   ////
11
//// and/or modify it under the terms of the GNU Lesser General   ////
12
//// Public License as published by the Free Software Foundation; ////
13
//// either version 3 of the License, or (at your option) any     ////
14
//// later version.                                               ////
15
////                                                              ////
16
//// This source is distributed in the hope that it will be       ////
17
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
18
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
19
//// PURPOSE.  See the GNU Lesser General Public License for more ////
20
//// details.                                                     ////
21
////                                                              ////
22
//// You should have received a copy of the GNU Lesser General    ////
23
//// Public License along with this source; if not, download it   ////
24
//// from http://www.opencores.org/lgpl.shtml                     ////
25
////                                                              ////
26
//////////////////////////////////////////////////////////////////////
27
`timescale 1ns / 1ps
28
`include "Configuration.v"
29
 
30
module MEM_Stage(
31
        input Clk,
32
        input RST,
33
        input [0:`EX_MEM_reg_w] EX_MEM_reg,
34
        output [0:`MEM_WB_reg_w] MEM_WB_reg,
35
        output [0:`memory_bus_w] ex_mem_addr,
36
        inout [0:`dpw] ex_mem_data,
37
        output mem_Clk,
38
        output mem_wr,
39
        output branch, linked,
40
        output return_back,
41
        output [0:`pc_w] branch_target
42
    );
43
 
44
        wire [0:`type_msb] Type;
45
        wire [0:`wb_dst_msb] WB_Dest;
46
        wire [0:`bc_msb] Rd_BC;
47
        wire [0:`dpw] E1, E0, M0;
48
        wire C,Z,S,O;
49
 
50
        assign Type = EX_MEM_reg[0:`type_msb];
51
        assign WB_Dest = EX_MEM_reg[`type_msb+1:`type_msb+1+`wb_dst_msb];
52
        assign Rd_BC = EX_MEM_reg[`type_msb+1+`wb_dst_msb+1:`type_msb+1+`wb_dst_msb+1+`bc_msb];
53
        assign E0 = EX_MEM_reg[`type_msb+1+`wb_dst_msb+1+`bc_msb+1:`type_msb+1+`wb_dst_msb+1+`bc_msb+1+`dpw];
54
        assign E1 = EX_MEM_reg[`type_msb+1+`wb_dst_msb+1+`bc_msb+1+`dpw+1:`type_msb+1+`wb_dst_msb+1+`bc_msb+1+`dpw+1+`dpw];
55
        assign {C,Z,S,O} = E0[`dpw+1-4:`dpw];
56
 
57
        assign ex_mem_addr = E1;
58
 
59
        assign mem_wr = (Type==`type_store) ? 1: 0;
60
        assign ex_mem_data = (Type==`type_store) ? E0 : 'bZ;
61
        assign M0 = (Type==`type_load) ? ex_mem_data : E1;
62
 
63
        assign mem_Clk = ((Type==`type_load) || (Type==`type_store)) ? ~Clk : 'bZ;
64
 
65
 
66
        //--branch logic--//
67
        reg bc, ret;
68
        always@(*) begin
69
        if (Type==`type_branch) begin
70
                case (Rd_BC[1:`bc_msb])
71
                        `bLT: bc <= S^O;
72
                        `bLE: bc <= Z + (S^O);
73
                        `bNEG: bc <= S;
74
                        `bPOS: bc <= ~S;
75
                        `bEQ: bc <= Z;
76
                        `bNEQ: bc <= ~Z;
77
                        `bGE: bc <= ~(S^O);
78
                        `bGT: bc <= ~(Z+(S^O));
79
                        `bLTU: bc <= C;
80
                        `bLEU: bc <= C + Z;
81
                        `bGTU: bc <= ~(C+Z);
82
                        `bGEU: bc <= ~C;
83
                        `bOVF: bc <= O;
84
                        `bNOVF: bc <= ~O;
85
                        `bALL: bc <= 1;
86
                        `bRET: begin
87
                                        bc <= 1;
88
                                        ret <= 1;
89
                                        end
90
                endcase
91
        end else begin
92
                bc <= 0;
93
                ret <= 0;
94
        end
95
        end
96
        assign branch = (Type==`type_branch) & bc & ~ret;
97
        assign linked = Rd_BC[0];
98
        assign return_back = ret;
99
        assign branch_target = (Type==`type_branch) ? E1:'bZ;
100
 
101
        assign MEM_WB_reg = {Type,WB_Dest, Rd_BC[2:`bc_msb], M0};
102
 
103
endmodule

powered by: WebSVN 2.1.0

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