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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 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
   initial
57
     $display("%m: Wishbone bus IF is %s",BUS_IF_TYPE);
58
 
59
   generate
60
      /* verilator lint_off WIDTH */
61
      if (BUS_IF_TYPE=="B3_READ_BURSTING") begin : b3_read_bursting
62
         /* verilator lint_on WIDTH */
63
 
64
         // Burst until the incoming address is not what it should be
65
         wire                         finish_burst;
66
         reg                          finish_burst_r;
67
         reg                          bursting;
68
         reg [31:2]                   burst_address;
69
         reg [BADDR_WITH-1:0]          burst_wrap_start;
70
         wire [BADDR_WITH-1:0]         burst_wrap_finish;
71
         wire                         address_differs;
72
 
73
         always @(posedge clk `OR_ASYNC_RST)
74
           if (rst)
75
             bursting <= 0;
76
           else if (wbm_err_i)
77
             bursting <= 0;
78
           else if (bursting & finish_burst & wbm_ack_i)
79
             bursting <= 0;
80
           else if (cpu_req_i & !bursting & !cpu_we_i)
81
             bursting <= 1;
82
 
83
         always @(posedge clk `OR_ASYNC_RST)
84
           if (rst)
85
             begin
86
                burst_address <= 0;
87
                burst_wrap_start <= 0;
88
             end
89
           else if (cpu_req_i & !bursting)
90
             begin
91
                burst_address <= cpu_adr_i[31:2];
92
                burst_wrap_start <= cpu_adr_i[BADDR_WITH+2-1:2];
93
             end
94
           else if (wbm_ack_i)
95
             burst_address[BADDR_WITH+2-1:2] <= burst_address[BADDR_WITH+2-1:2]
96
                  + 1;
97
 
98
 
99
         assign address_differs = (burst_address!=cpu_adr_i[31:2]);
100
         assign burst_wrap_finish = burst_wrap_start - 1;
101
         assign finish_burst = (bursting & (
102
                      (BURST_LENGTH!=0 &&
103
                       burst_address[BADDR_WITH+2-1:2]==(burst_wrap_finish))
104
                                            | address_differs
105
                                            | !cpu_req_i
106
                                            )
107
                                )
108
           ;
109
         always @(posedge clk `OR_ASYNC_RST)
110
           if (rst)
111
             finish_burst_r <= 0;
112
           else if (wbm_ack_i)
113
             finish_burst_r <= finish_burst;
114
           else
115
             finish_burst_r <= 0;
116
 
117
         assign wbm_adr_o = bursting ? {burst_address,2'b00} : cpu_adr_i;
118
         assign wbm_stb_o = bursting & !finish_burst_r;
119
         assign wbm_cyc_o = bursting & !finish_burst_r;
120
         assign wbm_sel_o = cpu_bsel_i;
121
         assign wbm_we_o = cpu_we_i;
122
         assign wbm_cti_o = bursting ? (finish_burst ? 3'b111 : 3'b010) :
123
                            3'b000;
124
         assign wbm_bte_o = BURST_LENGTH==4  ? 2'b01 :
125
                            BURST_LENGTH==8  ? 2'b10 :
126
                            BURST_LENGTH==16 ? 2'b11 :
127
                            2'b00; // Linear burst
128
 
129
         assign wbm_dat_o = cpu_dat_i;
130
 
131
         assign cpu_err_o = wbm_err_i;
132
         assign cpu_ack_o = (wbm_ack_i) &
133
                            !(bursting & address_differs) & cpu_req_i;
134
         assign cpu_dat_o = wbm_err_i ? 0 :  wbm_dat_i;
135
 
136
      /* verilator lint_off WIDTH */
137
      end else if (BUS_IF_TYPE=="B3_REGISTERED_FEEDBACK") begin : b3_registered_feedback
138
         /* verilator lint_on WIDTH */
139
 
140
         assign wbm_adr_o = cpu_adr_i;
141
         assign wbm_stb_o = cpu_req_i;
142
         assign wbm_cyc_o = cpu_req_i;
143
         assign wbm_sel_o = cpu_bsel_i;
144
         assign wbm_we_o = cpu_we_i;
145
         assign wbm_cti_o = cpu_burst_i ? 3'b010 : 3'b111;
146
         assign wbm_bte_o = BURST_LENGTH==4  ? 2'b01 :
147
                            BURST_LENGTH==8  ? 2'b10 :
148
                            BURST_LENGTH==16 ? 2'b11 :
149
                            2'b00; // Linear burst
150
 
151
         assign wbm_dat_o = cpu_dat_i;
152
         assign cpu_err_o = wbm_err_i;
153
         assign cpu_ack_o = wbm_ack_i;
154
         assign cpu_dat_o = wbm_dat_i;
155
 
156
      end else begin : classic // CLASSIC only
157
 
158
         // Only classic, single cycle accesses
159
 
160
         // A register to force de-assertion of access request signals after
161
         // each ack
162
         reg                                  cycle_end;
163
 
164
         always @(posedge clk `OR_ASYNC_RST)
165
           if (rst)
166
             cycle_end <= 1;
167
           else
168
             cycle_end <= wbm_ack_i | wbm_err_i;
169
 
170
         assign cpu_err_o = wbm_err_i;
171
         assign cpu_ack_o = wbm_ack_i;
172
         assign cpu_dat_o = wbm_dat_i;
173
 
174
         assign wbm_adr_o = cpu_adr_i;
175
         assign wbm_stb_o = cpu_req_i & !cycle_end;
176
         assign wbm_cyc_o = cpu_req_i;
177
         assign wbm_sel_o = cpu_bsel_i;
178
         assign wbm_we_o = cpu_we_i;
179
         assign wbm_cti_o = 0;
180
         assign wbm_bte_o = 0;
181
         assign wbm_dat_o = cpu_dat_i;
182
 
183
      end // else: !if(BUS_IF_TYPE=="READ_B3_BURSTING")
184
   endgenerate
185
 
186
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.