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/] [mor1kx-5.0/] [rtl/] [verilog/] [mor1kx_bus_if_wb32.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/* ****************************************************************************
2
  This Source Code Form is subject to the terms of the
3
  Open Hardware Description License, v. 1.0. If a copy
4
  of the OHDL was not distributed with this file, You
5
  can obtain one at http://juliusbaxter.net/ohdl/ohdl.txt
6
 
7
  Description: mor1kx processor Wishbone bus bridge
8
 
9
  For now, very simple, not registering,  assumes 32-bit data, addressing
10
 
11
  Copyright (C) 2012 Authors
12
 
13
  Author(s): Julius Baxter <juliusbaxter@gmail.com>
14
 
15
***************************************************************************** */
16
 
17
`include "mor1kx-defines.v"
18
 
19
module mor1kx_bus_if_wb32
20
  #(
21
    parameter BUS_IF_TYPE = "CLASSIC",
22
    parameter BURST_LENGTH = 8
23
    )
24
   (
25
    input         clk,
26
    input         rst,
27
 
28
    output        cpu_err_o,
29
    output        cpu_ack_o,
30
    output [31:0] cpu_dat_o,
31
    input [31:0]  cpu_adr_i,
32
    input [31:0]  cpu_dat_i,
33
    input         cpu_req_i,
34
    input [3:0]   cpu_bsel_i,
35
    input         cpu_we_i,
36
    input         cpu_burst_i,
37
 
38
    output [31:0] wbm_adr_o,
39
    output        wbm_stb_o,
40
    output        wbm_cyc_o,
41
    output [3:0]  wbm_sel_o,
42
    output        wbm_we_o,
43
    output [2:0]  wbm_cti_o,
44
    output [1:0]  wbm_bte_o,
45
    output [31:0] wbm_dat_o,
46
    input         wbm_err_i,
47
    input         wbm_ack_i,
48
    input [31:0]  wbm_dat_i,
49
    input         wbm_rty_i
50
    );
51
 
52
   localparam  BADDR_WITH = (BURST_LENGTH==4) ? 2 :
53
                            (BURST_LENGTH==8) ? 3 :
54
                            (BURST_LENGTH==16)? 4 : 30;
55
 
56
   generate
57
      /* verilator lint_off WIDTH */
58
      if (BUS_IF_TYPE=="B3_READ_BURSTING") begin : b3_read_bursting
59
         /* verilator lint_on WIDTH */
60
 
61
         // Burst until the incoming address is not what it should be
62
         wire                         finish_burst;
63
         reg                          finish_burst_r;
64
         reg                          bursting;
65
         reg [31:2]                   burst_address;
66
         reg [BADDR_WITH-1:0]          burst_wrap_start;
67
         wire [BADDR_WITH-1:0]         burst_wrap_finish;
68
         wire                         address_differs;
69
 
70
         always @(posedge clk `OR_ASYNC_RST)
71
           if (rst)
72
             bursting <= 0;
73
           else if (wbm_err_i)
74
             bursting <= 0;
75
           else if (bursting & finish_burst & wbm_ack_i)
76
             bursting <= 0;
77
           else if (cpu_req_i & !bursting & !cpu_we_i)
78
             bursting <= 1;
79
 
80
         always @(posedge clk `OR_ASYNC_RST)
81
           if (rst)
82
             begin
83
                burst_address <= 0;
84
                burst_wrap_start <= 0;
85
             end
86
           else if (cpu_req_i & !bursting)
87
             begin
88
                burst_address <= cpu_adr_i[31:2];
89
                burst_wrap_start <= cpu_adr_i[BADDR_WITH+2-1:2];
90
             end
91
           else if (wbm_ack_i)
92
             burst_address[BADDR_WITH+2-1:2] <= burst_address[BADDR_WITH+2-1:2]
93
                  + 1;
94
 
95
 
96
         assign address_differs = (burst_address!=cpu_adr_i[31:2]);
97
         assign burst_wrap_finish = burst_wrap_start - 1;
98
         assign finish_burst = (bursting & (
99
                      (BURST_LENGTH!=0 &&
100
                       burst_address[BADDR_WITH+2-1:2]==(burst_wrap_finish))
101
                                            | address_differs
102
                                            | !cpu_req_i
103
                                            )
104
                                )
105
           ;
106
         always @(posedge clk `OR_ASYNC_RST)
107
           if (rst)
108
             finish_burst_r <= 0;
109
           else if (wbm_ack_i)
110
             finish_burst_r <= finish_burst;
111
           else
112
             finish_burst_r <= 0;
113
 
114
         assign wbm_adr_o = bursting ? {burst_address,2'b00} : cpu_adr_i;
115
         assign wbm_stb_o = bursting & !finish_burst_r;
116
         assign wbm_cyc_o = bursting & !finish_burst_r;
117
         assign wbm_sel_o = cpu_bsel_i;
118
         assign wbm_we_o = cpu_we_i;
119
         assign wbm_cti_o = bursting ? (finish_burst ? 3'b111 : 3'b010) :
120
                            3'b000;
121
         assign wbm_bte_o = BURST_LENGTH==4  ? 2'b01 :
122
                            BURST_LENGTH==8  ? 2'b10 :
123
                            BURST_LENGTH==16 ? 2'b11 :
124
                            2'b00; // Linear burst
125
 
126
         assign wbm_dat_o = cpu_dat_i;
127
 
128
         assign cpu_err_o = wbm_err_i;
129
         assign cpu_ack_o = (wbm_ack_i) &
130
                            !(bursting & address_differs) & cpu_req_i;
131
         assign cpu_dat_o = wbm_err_i ? 0 :  wbm_dat_i;
132
 
133
      /* verilator lint_off WIDTH */
134
      end else if (BUS_IF_TYPE=="B3_REGISTERED_FEEDBACK") begin : b3_registered_feedback
135
         /* verilator lint_on WIDTH */
136
 
137
         assign wbm_adr_o = cpu_adr_i;
138
         assign wbm_stb_o = cpu_req_i;
139
         assign wbm_cyc_o = cpu_req_i;
140
         assign wbm_sel_o = cpu_bsel_i;
141
         assign wbm_we_o = cpu_we_i;
142
         assign wbm_cti_o = cpu_burst_i ? 3'b010 : 3'b111;
143
         assign wbm_bte_o = BURST_LENGTH==4  ? 2'b01 :
144
                            BURST_LENGTH==8  ? 2'b10 :
145
                            BURST_LENGTH==16 ? 2'b11 :
146
                            2'b00; // Linear burst
147
 
148
         assign wbm_dat_o = cpu_dat_i;
149
         assign cpu_err_o = wbm_err_i;
150
         assign cpu_ack_o = wbm_ack_i;
151
         assign cpu_dat_o = wbm_dat_i;
152
 
153
      end else begin : classic // CLASSIC only
154
 
155
         // Only classic, single cycle accesses
156
 
157
         // A register to force de-assertion of access request signals after
158
         // each ack
159
         reg                                  cycle_end;
160
 
161
         always @(posedge clk `OR_ASYNC_RST)
162
           if (rst)
163
             cycle_end <= 1;
164
           else
165
             cycle_end <= wbm_ack_i | wbm_err_i;
166
 
167
         assign cpu_err_o = wbm_err_i;
168
         assign cpu_ack_o = wbm_ack_i;
169
         assign cpu_dat_o = wbm_dat_i;
170
 
171
         assign wbm_adr_o = cpu_adr_i;
172
         assign wbm_stb_o = cpu_req_i & !cycle_end;
173
         assign wbm_cyc_o = cpu_req_i;
174
         assign wbm_sel_o = cpu_bsel_i;
175
         assign wbm_we_o = cpu_we_i;
176
         assign wbm_cti_o = 0;
177
         assign wbm_bte_o = 0;
178
         assign wbm_dat_o = cpu_dat_i;
179
 
180
      end // else: !if(BUS_IF_TYPE=="READ_B3_BURSTING")
181
   endgenerate
182
 
183
endmodule // mor1kx_bus_if_wb

powered by: WebSVN 2.1.0

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