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

Subversion Repositories aemb

[/] [aemb/] [branches/] [DEV_SYBREON/] [rtl/] [verilog/] [aeMB2_opmx.v] - Blame information for rev 195

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

Line No. Rev Author Line
1 81 sybreon
/* $Id: aeMB2_opmx.v,v 1.3 2007-12-13 20:12:11 sybreon Exp $
2 78 sybreon
**
3
** AEMB2 OPERAND FETCH MUX
4
**
5
** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6
**
7
** This file is part of AEMB.
8
**
9
** AEMB is free software: you can redistribute it and/or modify it
10
** under the terms of the GNU Lesser General Public License as
11
** published by the Free Software Foundation, either version 3 of the
12
** License, or (at your option) any later version.
13
**
14
** AEMB is distributed in the hope that it will be useful, but WITHOUT
15
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16
** or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
17
** Public License for more details.
18
**
19
** You should have received a copy of the GNU Lesser General Public
20
** License along with AEMB. If not, see <http://www.gnu.org/licenses/>.
21
*/
22
 
23
module aeMB2_opmx (/*AUTOARG*/
24
   // Outputs
25
   rOPM_OF, rOPX_OF, rOPA_OF, rOPB_OF,
26
   // Inputs
27
   rRES_EX, rRD_EX, rOPD_EX, rOPC_IF, rIMM_IF, rPC_IF, rRD_IF, rRA_IF,
28 81 sybreon
   rRB_IF, rREGD_OF, rREGA_OF, rREGB_OF, rBRA, pha_i, clk_i, rst_i,
29
   ena_i
30 78 sybreon
   );
31
   parameter TXE = 1;
32
 
33
   output [31:0] rOPM_OF, // used for store
34
                 rOPX_OF, // used for BCC checking
35
                 rOPA_OF, // OPA as per ISA
36
                 rOPB_OF; // OPB as per ISA
37
 
38
   input [31:0]  rRES_EX;
39
   input [4:0]    rRD_EX;
40
   input [1:0]    rOPD_EX;
41
 
42
   input [5:0]    rOPC_IF;
43
   input [15:0]  rIMM_IF;
44
   input [31:2]  rPC_IF;
45
   input [4:0]    rRD_IF,
46
                 rRA_IF,
47
                 rRB_IF;
48
 
49
   input [31:0]  rREGD_OF,
50
                 rREGA_OF,
51
                 rREGB_OF;
52
 
53
   input [1:0]    rBRA;
54
 
55
   // SYSTEM
56
   input         pha_i,
57
                 clk_i,
58
                 rst_i,
59
                 ena_i;
60
 
61
   /*AUTOREG*/
62
   // Beginning of automatic regs (for this module's undeclared outputs)
63
   reg [31:0]            rOPA_OF;
64
   reg [31:0]            rOPB_OF;
65
   reg [31:0]            rOPM_OF;
66
   reg [31:0]            rOPX_OF;
67
   // End of automatics
68
 
69
   wire                 fSKP = (rBRA == 2'b10); // branch without delay
70
 
71
   /* Partial decoding */
72
   wire [5:0]            rOPC = rOPC_IF;
73
   wire [4:0]            rRA = rRA_IF;
74
   wire [4:0]            rRB = rRB_IF;
75
   wire                 fSFT = (rOPC == 6'o44);
76
   wire                 fLOG = ({rOPC[5:4],rOPC[2]} == 3'o4);
77
   wire                 fMUL = (rOPC == 6'o20) | (rOPC == 6'o30);
78
   wire                 fBSF = (rOPC == 6'o21) | (rOPC == 6'o31);
79
   wire                 fDIV = (rOPC == 6'o22);
80
   wire                 fRTD = (rOPC == 6'o55);
81
   wire                 fBCC = (rOPC == 6'o47) | (rOPC == 6'o57);
82
   wire                 fBRU = (rOPC == 6'o46) | (rOPC == 6'o56);
83
   wire                 fBRA = fBRU & rRA[3];
84
   wire                 fIMM = (rOPC == 6'o54);
85
   wire                 fMOV = (rOPC == 6'o45);
86
   wire                 fLOD = ({rOPC[5:4],rOPC[2]} == 3'o6);
87
   wire                 fSTR = ({rOPC[5:4],rOPC[2]} == 3'o7);
88
   wire                 fLDST = (rOPC[5:4] == 2'o3);
89
   wire                 fPUT = (rOPC == 6'o33) & rRB[4];
90
   wire                 fGET = (rOPC == 6'o33) & !rRB[4];
91
 
92
   /* IMMI implementation */
93
 
94 80 sybreon
   reg [15:0]            rIMM0, rIMM1, rIMML[0:1];
95
   reg                  rFIM0, rFIM1, rFIML[0:1];
96 78 sybreon
   wire [15:0]           wIMM = rIMML[!pha_i];
97
   wire [31:0]           wSIMM;
98
 
99 81 sybreon
   wire                 rFIM = (pha_i) ? rFIM0 : rFIM1;
100
   wire [15:0]           rIMM = (pha_i) ? rIMM0 : rIMM1;
101 78 sybreon
 
102 80 sybreon
   assign               wSIMM[15:0] = rIMM_IF[15:0];
103 78 sybreon
   assign               wSIMM[31:16] = (rFIM) ?
104
                                       {rIMM} :
105
                                       {(16){rIMM_IF[15]}};
106
 
107
   always @(posedge clk_i)
108
     if (rst_i) begin
109
        /*AUTORESET*/
110
        // Beginning of autoreset for uninitialized flops
111
        rFIM0 <= 1'h0;
112
        rFIM1 <= 1'h0;
113
        rIMM0 <= 16'h0;
114
        rIMM1 <= 16'h0;
115
        // End of automatics
116 81 sybreon
     end else if (ena_i) begin
117
        if (pha_i) begin
118 78 sybreon
           rFIM0 <= #1 fIMM & !fSKP;
119
           rIMM0 <= #1 rIMM_IF;
120 81 sybreon
        end else begin
121 78 sybreon
           rFIM1 <= #1 fIMM & !fSKP;
122
           rIMM1 <= #1 rIMM_IF;
123
        end
124 80 sybreon
     end // else: !if(rst_i)
125 78 sybreon
 
126
   /* Latch onto the operand */
127
   // TODO: Optimise
128
 
129
   wire                 fALU = (rOPD_EX == 3'o0);
130
   wire                 fWRE = |rRD_EX;
131
   wire                 wOPBFWD = !rOPC_IF[3] & (rRB_IF == rRD_EX) & fALU & !fMOV & fWRE;
132 81 sybreon
   wire                 wOPAFWD = !(fBRU|fBCC) & (rRA_IF == rRD_EX) & fALU & fWRE;
133 78 sybreon
   wire                 wOPXFWD = (fBCC) & (rRA_IF == rRD_EX) & fALU & fWRE;
134
   wire                 wOPMFWD = (rRD_IF == rRD_EX) & fALU & fWRE;
135
 
136
   wire [1:0]            wOPB_MX = {rOPC_IF[3], wOPBFWD};
137 81 sybreon
   wire [1:0]            wOPA_MX = {fBRU|fBCC| (fMOV & !rRB[3]) , wOPAFWD};
138 78 sybreon
   wire [1:0]            wOPX_MX = {fBCC, wOPXFWD};
139
   wire [1:0]            wOPM_MX = {fSTR, wOPMFWD};
140
 
141
   always @(posedge clk_i)
142
     if (rst_i) begin
143
        /*AUTORESET*/
144
        // Beginning of autoreset for uninitialized flops
145
        rOPA_OF <= 32'h0;
146
        rOPB_OF <= 32'h0;
147
        rOPM_OF <= 32'h0;
148
        rOPX_OF <= 32'h0;
149
        // End of automatics
150
     end else if (ena_i) begin
151
 
152
        case (wOPX_MX)
153
          // BCC
154
          2'o2: rOPX_OF <= #1 rREGA_OF; // reg  
155
          2'o3: rOPX_OF <= #1 rRES_EX; // forward
156
          default: rOPX_OF <= #1 32'hX;
157
        endcase // case (wOPX_MX)
158
 
159
        case (wOPM_MX)
160
          2'o2: rOPM_OF <= #1 rREGD_OF; // reg
161
          2'o3: rOPM_OF <= #1 rRES_EX; // forward
162
          default: rOPM_OF <= #1 32'hX;
163
        endcase // case (wOPM_MX)
164
 
165
        // OP B
166
        case (wOPB_MX)
167
          2'o0: rOPB_OF <= #1 rREGB_OF; // reg
168
          2'o1: rOPB_OF <= #1 rRES_EX; // forward
169
          2'o2: rOPB_OF <= #1 wSIMM; // immediate
170
          default: rOPB_OF <= #1 32'hX;
171
        endcase // case (wOPB_MX)
172
 
173
        case (wOPA_MX)
174
          2'o0: rOPA_OF <= #1 rREGA_OF; // reg
175
          2'o1: rOPA_OF <= #1 rRES_EX; // forward
176
          2'o2: rOPA_OF <= #1 {rPC_IF, 2'd0}; // pc 
177
          default: rOPA_OF <= #1 32'hX;
178
        endcase // case (wOPA_MX)
179
 
180 80 sybreon
     end // if (ena_i)
181 78 sybreon
 
182
endmodule // aeMB2_opmx
183
 
184 80 sybreon
/* $Log: not supported by cvs2svn $
185 81 sybreon
/* Revision 1.2  2007/12/12 19:16:59  sybreon
186
/* Minor optimisations (~10% faster)
187
/*
188 80 sybreon
/* Revision 1.1  2007/12/11 00:43:17  sybreon
189
/* initial import
190
/* */

powered by: WebSVN 2.1.0

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