OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_processor/] [aeMB/] [verilog/] [src/] [aeMB2_dwbif.v] - Blame information for rev 16

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 16 alirezamon
/* $Id: aeMB2_dwbif.v,v 1.7 2008-04-27 16:41:55 sybreon Exp $
2
**
3
** AEMB2 EDK 6.2 COMPATIBLE CORE
4
** Copyright (C) 2004-2008 Shawn Tan <shawn.tan@aeste.net>
5
**
6
** This file is part of AEMB.
7
**
8
** AEMB is free software: you can redistribute it and/or modify it
9
** under the terms of the GNU Lesser General Public License as
10
** published by the Free Software Foundation, either version 3 of the
11
** License, or (at your option) any later version.
12
**
13
** AEMB is distributed in the hope that it will be useful, but WITHOUT
14
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
** or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
16
** Public License for more details.
17
**
18
** You should have received a copy of the GNU Lesser General Public
19
** License along with AEMB. If not, see <http:**www.gnu.org/licenses/>.
20
*/
21
/**
22
 * Data Wishbone Interface
23
 * @file aeMB2_dwbif.v
24
 
25
 * This sets up the Wishbone control signals for the DATA bus
26
   interfaces. Bus transactions are independent of the pipeline.
27
 
28
 */
29
`timescale  1ns/1ps
30
module aeMB2_dwbif (/*AUTOARG*/
31
   // Outputs
32
   dwb_adr_o, dwb_sel_o, dwb_stb_o, dwb_cyc_o, dwb_tag_o, dwb_wre_o,
33
   dwb_dat_o, dwb_fb, sel_mx, dwb_mx, exc_dwb,
34
   // Inputs
35
   dwb_dat_i, dwb_ack_i, imm_of, opd_of, opc_of, opa_of, opb_of,
36
   msr_ex, mem_ex, sfr_mx, gclk, grst, dena, gpha
37
   );
38
   parameter AEMB_DWB = 32; ///< data bus address width   
39
 
40
   // DWB control signals
41
   output [AEMB_DWB-1:2] dwb_adr_o;
42
   output [3:0]   dwb_sel_o;
43
   output                dwb_stb_o,
44
                         dwb_cyc_o,
45
                         dwb_tag_o, // cache enable
46
                         dwb_wre_o;
47
   output [31:0]          dwb_dat_o;
48
   input [31:0]   dwb_dat_i;
49
   input                 dwb_ack_i;
50
   //input               dwb_err_i; // for bus error exception
51
 
52
   // INTERNAL
53
   output                dwb_fb;
54
   output [3:0]   sel_mx;
55
   output [31:0]          dwb_mx;
56
   input [15:0]   imm_of;
57
   input [31:0]   opd_of;
58
   input [5:0]            opc_of;
59
   input [1:0]            opa_of;
60
   input [1:0]            opb_of;
61
   input [7:0]            msr_ex;
62
   input [AEMB_DWB-1:2]  mem_ex;
63
   input [7:5]           sfr_mx;
64
 
65
   // EXC signals
66
   output [1:0]   exc_dwb; // 1: unaligned; 0: bus error
67
 
68
   // SYS signals
69
   input                 gclk,
70
                         grst,
71
                         dena,
72
                         gpha;
73
 
74
   /*AUTOREG*/
75
   // Beginning of automatic regs (for this module's undeclared outputs)
76
   reg                  dwb_cyc_o;
77
   reg [31:0]            dwb_dat_o;
78
   reg [31:0]            dwb_mx;
79
   reg [3:0]             dwb_sel_o;
80
   reg                  dwb_stb_o;
81
   reg                  dwb_wre_o;
82
   reg [3:0]             sel_mx;
83
   // End of automatics
84
   reg                  dwb_exc;
85
 
86
   wire [1:0]            wOFF = (opa_of[1:0] + opb_of[1:0]); // small adder   
87
   wire [3:0]            wSEL = {opc_of[1:0], wOFF}; // byte selector info
88
 
89
   assign               dwb_fb = (dwb_stb_o ~^ dwb_ack_i); // feedback
90
   assign               dwb_adr_o = mem_ex; // data-bus passthru
91
 
92
   // TODO: enable dwb_err_i exception pass-thru
93
   assign               exc_dwb = {dwb_exc, 1'b0};
94
 
95
   // STORE SIZER
96
   // TODO: Move the right words to the right place
97
   // TODO: Make this work with dwb_mx to for partial word loads.
98
 
99
   reg [31:0]            dwb_lat;
100
   reg [31:0]            opd_ex;
101
 
102
   always @(posedge gclk)
103
     if (grst) begin
104
        /*AUTORESET*/
105
        // Beginning of autoreset for uninitialized flops
106
        dwb_dat_o <= 32'h0;
107
        // End of automatics
108
     end else if (dena) begin
109
        //opd_ex <= #1 opd_of;  
110
        case (opc_of[1:0])
111
          2'o0: dwb_dat_o <= #1 {(4){opd_of[7:0]}};
112
          2'o1: dwb_dat_o <= #1 {(2){opd_of[15:0]}};
113
          2'o2: dwb_dat_o <= #1 opd_of;
114
          default: dwb_dat_o <= #1 32'hX;
115
        endcase // case (opc_of[1:0])
116
     end
117
 
118
   // WISHBONE PIPELINE
119
   always @(posedge gclk)
120
     if (grst) begin
121
        /*AUTORESET*/
122
        // Beginning of autoreset for uninitialized flops
123
        dwb_exc <= 1'h0;
124
        dwb_mx <= 32'h0;
125
        dwb_sel_o <= 4'h0;
126
        dwb_wre_o <= 1'h0;
127
        sel_mx <= 4'h0;
128
        // End of automatics
129
     end else if (dena) begin
130
        sel_mx <= #1 dwb_sel_o; // FIXME: do away with this! Combine
131
                                // dwb_dat_o & dwb_mx. dwb_dat_o can
132
                                // hold the existing RD value and have
133
                                // dwb_mx latch the correct bytes
134
                                // depending on dwb_sel_o.
135
 
136
        dwb_wre_o <= #1 opc_of[2]; // SXX
137
 
138
        dwb_mx <= #1
139
                  (dwb_ack_i) ?
140
                  dwb_dat_i : // stalled from RAM
141
                  dwb_lat; // latch earlier data
142
 
143
        case (wSEL) // Latch output
144
          // 32'bit
145
          4'h8: dwb_sel_o <= #1 4'hF;
146
          // 16'bit
147
          4'h4: dwb_sel_o <= #1 4'hC;
148
          4'h6: dwb_sel_o <= #1 4'h3;
149
          // 8'bit
150
          4'h0: dwb_sel_o <= #1 4'h8;
151
          4'h1: dwb_sel_o <= #1 4'h4;
152
          4'h2: dwb_sel_o <= #1 4'h2;
153
          4'h3: dwb_sel_o <= #1 4'h1;
154
          // XSL bus
155
          4'hC, 4'hD, 4'hE, 4'hF:
156
            dwb_sel_o <= #1 4'h0;
157
          // TODO: ILLEGAL
158
          default: dwb_sel_o <= #1 4'hX;
159
        endcase // case (wSEL)
160
 
161
        // exception checking
162
        dwb_exc <= #1 &opc_of[5:4] & // only for LD/ST commands
163
                   ((opc_of[0] & wOFF[0]) | // misaligned 16-bit
164
                    (opc_of[1] & |wOFF[1:0]) // misaligned 32-bit
165
                    );
166
        /*
167
        case (opc_of[1:0])
168
          2'o2: dwb_exc <= #1 |wOFF[1:0] & &opc_of[5:4];
169
          2'o1: dwb_exc <= #1 wOFF[0] & &opc_of[5:4];
170
          default: dwb_exc <= #1 1'b0;
171
        endcase // case (opc_of[1:0])
172
        */
173
 
174
 
175
     end // if (dena)
176
 
177
   // Independent of pipeline
178
 
179
   always @(posedge gclk)
180
     if (grst) begin
181
        /*AUTORESET*/
182
        // Beginning of autoreset for uninitialized flops
183
        dwb_lat <= 32'h0;
184
        // End of automatics
185
     end else if (dwb_ack_i) begin // if (grst)
186
        // LATCH READS
187
        dwb_lat <= #1 dwb_dat_i;
188
     end
189
 
190
   always @(posedge gclk)
191
     if (grst) begin
192
        /*AUTORESET*/
193
        // Beginning of autoreset for uninitialized flops
194
        dwb_cyc_o <= 1'h0;
195
        dwb_stb_o <= 1'h0;
196
        // End of automatics
197
     //end else if (dwb_fb) begin
198
     end else if (dwb_fb) begin // if (grst)
199
        dwb_stb_o <= #1
200
                     (dena) ? &opc_of[5:4] : // LXX/SSS
201
                     (dwb_stb_o & !dwb_ack_i); // LXX/SSS
202
        dwb_cyc_o <= #1
203
                     (dena) ? &opc_of[5:4] | msr_ex[0] :
204
                     (dwb_stb_o & !dwb_ack_i) | msr_ex[0];
205
     end
206
 
207
   assign dwb_tag_o = msr_ex[7]; // MSR_DCE     
208
 
209
endmodule // unmatched end(function|task|module|primitive|interface|package|class|clocking)

powered by: WebSVN 2.1.0

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