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

Subversion Repositories aemb

[/] [aemb/] [branches/] [DEV_SYBREON/] [rtl/] [verilog/] [aeMB2_idmx.v] - Blame information for rev 81

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

Line No. Rev Author Line
1 81 sybreon
/* $Id: aeMB2_idmx.v,v 1.3 2007-12-13 20:12:11 sybreon Exp $
2 78 sybreon
**
3
** AEMB2 INSTRUCTION DECODE 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_idmx (/*AUTOARG*/
24
   // Outputs
25
   rIMM_OF, rOPC_OF, rRA_OF, rRD_OF, rRD_EX, rRD_MA, rOPD_EX, rOPD_MA,
26
   rALU_OF,
27
   // Inputs
28
   rBRA, rXCE, rINT, rIMM_IF, rALT_IF, rOPC_IF, rRA_IF, rRB_IF,
29 81 sybreon
   rRD_IF, pha_i, clk_i, rst_i, ena_i
30 78 sybreon
   );
31
   parameter TXE = 1;
32
 
33
   parameter MUL = 1;
34
   parameter BSF = 1;
35
   parameter FSL = 1;
36
 
37
   output [15:0] rIMM_OF;
38
   output [5:0]  rOPC_OF;
39
   output [4:0]  rRA_OF,
40
                 rRD_OF;
41
 
42
   output [4:0]  rRD_EX,
43
                 rRD_MA;
44
   output [2:0]  rOPD_EX,
45
                 rOPD_MA;
46
 
47
   output [2:0]  rALU_OF; // addsub, logic, bshift, sext, mul, mov, ldst
48
 
49
 
50
   input [1:0]    rBRA;
51
   input         rXCE,
52 81 sybreon
                 //rMSR_TXE,
53 78 sybreon
                 rINT;
54
 
55
   input [15:0]  rIMM_IF;
56
   input [10:0]  rALT_IF;
57
   input [5:0]    rOPC_IF;
58
   input [4:0]    rRA_IF,
59
                 rRB_IF,
60
                 rRD_IF;
61
 
62
   input         pha_i,
63
                 clk_i,
64
                 rst_i,
65
                 ena_i;
66
 
67
   /*AUTOREG*/
68
   // Beginning of automatic regs (for this module's undeclared outputs)
69
   reg [2:0]             rALU_OF;
70
   reg [15:0]            rIMM_OF;
71
   reg [5:0]             rOPC_OF;
72
   reg [2:0]             rOPD_EX;
73
   reg [2:0]             rOPD_MA;
74
   reg [4:0]             rRA_OF;
75
   reg [4:0]             rRD_EX;
76
   reg [4:0]             rRD_MA;
77
   reg [4:0]             rRD_OF;
78
   // End of automatics
79
 
80 80 sybreon
   //wire [31:0]                wXCEOP = 32'hBA2D0020; // Vector 0x20
81
   wire [31:0]           wINTOP = 32'hB9CE0010; // Vector 0x10   
82 78 sybreon
   wire [31:0]           wNOPOP = 32'h88000000; // branch-no-delay/stall
83
 
84
   /* Partial decoding */
85
   wire [5:0]            rOPC = rOPC_IF;
86
   wire [4:0]            rRA = rRA_IF;
87
   wire [4:0]            rRB = rRB_IF;
88
   wire                 fSFT = (rOPC == 6'o44);
89
   wire                 fLOG = ({rOPC[5:4],rOPC[2]} == 3'o4);
90
   wire                 fMUL = (rOPC == 6'o20) | (rOPC == 6'o30);
91
   wire                 fBSF = (rOPC == 6'o21) | (rOPC == 6'o31);
92
   wire                 fDIV = (rOPC == 6'o22);
93
   wire                 fRTD = (rOPC == 6'o55);
94
   wire                 fBCC = (rOPC == 6'o47) | (rOPC == 6'o57);
95
   wire                 fBRU = (rOPC == 6'o46) | (rOPC == 6'o56);
96
   wire                 fBRA = fBRU & rRA[3];
97
   wire                 fIMM = (rOPC == 6'o54);
98
   wire                 fMOV = (rOPC == 6'o45);
99
   wire                 fLOD = ({rOPC[5:4],rOPC[2]} == 3'o6);
100
   wire                 fSTR = ({rOPC[5:4],rOPC[2]} == 3'o7);
101
   wire                 fLDST = (rOPC[5:4] == 2'o3);
102
   wire                 fPUT = (rOPC == 6'o33) & rRB[4];
103
   wire                 fGET = (rOPC == 6'o33) & !rRB[4];
104
 
105
   /* Hazard detection */
106
 
107
   wire                 fLOAD = (rOPD_EX == 3'o2);
108
   wire                 fMULT = (rOPD_EX == 3'o3);
109
   wire                 fWRE = |rRD_EX;
110
   wire                 fOPBHZD = (rRB_IF == rRD_EX) & (fLOAD | fMULT) & !fMOV & !rOPC_IF[3] & fWRE;
111
   wire                 fOPAHZD = (rRA_IF == rRD_EX) & (fLOAD | fMULT) & !fBRU & fWRE;
112
   wire                 fOPDHZD = (rRD_IF == rRD_EX) & (fLOAD | fMULT) & fSTR & fWRE;
113
   wire                 fHAZARD = fOPBHZD | fOPAHZD | fOPDHZD;
114
 
115
   wire                 fSKIP = (rBRA == 2'o2) | // non-delay branch
116 81 sybreon
                        !(TXE | pha_i) |
117 78 sybreon
                        fOPBHZD | fOPAHZD; // hazards
118
 
119
   /* ALU Selector */
120
 
121
   always @(posedge clk_i)
122
     if (rst_i) begin
123
        /*AUTORESET*/
124
        // Beginning of autoreset for uninitialized flops
125
        rALU_OF <= 3'h0;
126
        // End of automatics
127
     end else if (ena_i) begin
128
        rALU_OF <= #1
129 80 sybreon
                   (fSKIP) ? 3'o1 : // NOP
130 78 sybreon
                   (fBRA | fMOV) ? 3'o3 :
131
                   (fSFT) ? 3'o2 :
132
                   (fLOG) ? 3'o1 :
133
                   (fMUL) ? 3'o4 :
134
                   (fBSF) ? 3'o5 :
135
                   3'o0;
136
     end
137
 
138
   /* WB Selector */
139
 
140
   reg [2:0] rOPD_OF;
141
 
142
   always @(posedge clk_i)
143
     if (rst_i) begin
144
        /*AUTORESET*/
145
        // Beginning of autoreset for uninitialized flops
146
        rOPD_EX <= 3'h0;
147
        rOPD_MA <= 3'h0;
148
        rOPD_OF <= 3'h0;
149
        // End of automatics
150
     end else if (ena_i) begin
151
        rOPD_MA <= #1 rOPD_EX;
152
        rOPD_EX <= #1 rOPD_OF;
153
        rOPD_OF <= #1
154 80 sybreon
                   (fSKIP) ? 3'o7: // NOP
155
                   (fSTR | fRTD | fBCC) ? 3'o7 : // STR/RTD/BCC            
156 78 sybreon
                   (fLOD | fGET) ? 3'o2 : // RAM/FSL
157
                   (fBRU) ? 3'o1 : // PCLNK
158
                   (fMUL) ? 3'o3 : // MUL
159
                   (|rRD_IF) ? 3'o0 : // ALU
160
                   3'o7; // ALU
161 80 sybreon
     end // if (ena_i)
162 78 sybreon
 
163
   /* Passthrough */
164
 
165
   always @(posedge clk_i)
166
     if (rst_i) begin
167
        /*AUTORESET*/
168
        // Beginning of autoreset for uninitialized flops
169
        rIMM_OF <= 16'h0;
170
        rOPC_OF <= 6'h0;
171
        rRA_OF <= 5'h0;
172
        rRD_EX <= 5'h0;
173
        rRD_MA <= 5'h0;
174
        rRD_OF <= 5'h0;
175
        // End of automatics
176 80 sybreon
     end else if (ena_i) begin // if (rst_i)
177 78 sybreon
        rRD_MA <= #1 rRD_EX;
178
        rRD_EX <= #1 rRD_OF;
179
 
180 80 sybreon
        // TODO: Interrrupt
181 78 sybreon
        case (fSKIP)
182
          2'o0: {rOPC_OF, rRD_OF, rRA_OF, rIMM_OF} <= #1 {rOPC_IF, rRD_IF, rRA_IF, rIMM_IF};
183
          2'o1: {rOPC_OF, rRD_OF, rRA_OF, rIMM_OF} <= #1 wNOPOP; // delay/stall
184
          default: {rOPC_OF, rRD_OF, rRA_OF} <= #1 16'hX;
185
        endcase // case (fSKIP)
186
 
187 80 sybreon
     end // if (ena_i)
188 78 sybreon
 
189
endmodule // aeMB2_idmx
190
 
191 80 sybreon
/* $Log: not supported by cvs2svn $
192 81 sybreon
/* Revision 1.2  2007/12/12 19:16:59  sybreon
193
/* Minor optimisations (~10% faster)
194
/*
195 80 sybreon
/* Revision 1.1  2007/12/11 00:43:17  sybreon
196
/* initial import
197
/* */

powered by: WebSVN 2.1.0

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