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

Subversion Repositories ahb_slave

[/] [ahb_slave/] [trunk/] [src/] [base/] [ahb_slave_ram.v] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 eyalhoc
<##//////////////////////////////////////////////////////////////////
2 7 eyalhoc
////                                                             ////
3
////  Author: Eyal Hochberg                                      ////
4
////          eyal@provartec.com                                 ////
5
////                                                             ////
6
////  Downloaded from: http://www.opencores.org                  ////
7
/////////////////////////////////////////////////////////////////////
8
////                                                             ////
9
//// Copyright (C) 2010 Provartec LTD                            ////
10
//// www.provartec.com                                           ////
11
//// info@provartec.com                                          ////
12
////                                                             ////
13
//// This source file may be used and distributed without        ////
14
//// restriction provided that this copyright statement is not   ////
15
//// removed from the file and that any derivative work contains ////
16
//// the original copyright notice and the associated disclaimer.////
17
////                                                             ////
18
//// This source file is free software; you can redistribute it  ////
19
//// and/or modify it under the terms of the GNU Lesser General  ////
20
//// Public License as published by the Free Software Foundation.////
21
////                                                             ////
22
//// This source is distributed in the hope that it will be      ////
23
//// useful, but WITHOUT ANY WARRANTY; without even the implied  ////
24
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     ////
25
//// PURPOSE.  See the GNU Lesser General Public License for more////
26
//// details. http://www.gnu.org/licenses/lgpl.html              ////
27
////                                                             ////
28 11 eyalhoc
//////////////////////////////////////////////////////////////////##>
29 2 eyalhoc
 
30
OUTFILE PREFIX_ram.v
31
 
32
INCLUDE def_ahb_slave.txt
33
 
34
CHECK CONST(#FFD)
35
CHECK CONST(PREFIX)
36
CHECK CONST(ADDR_BITS)
37
CHECK CONST(DATA_BITS)
38
 
39
module PREFIX_ram(PORTS);
40
 
41
   input                      clk;
42
   input                      reset;
43
 
44
   revport                    GROUP_STUB_AHB;
45
 
46
   port                       GROUP_STUB_MEM;
47
 
48
 
49 4 eyalhoc
CREATE prgen_rand.v DEFCMD(DEFINE NOT_IN_LIST)
50 2 eyalhoc
`include "prgen_rand.v"
51
 
52
 
53
   //---------------- config parameters ------------------------
54
   reg                        stall_enable  = 1;  //enable stall on HREADY
55
   integer                    burst_chance  = 1;  //chance for burst on HREADY stall
56
   integer                    burst_len     = 10; //length of stall burst in cycles
57
   integer                    burst_val     = 90; //chance for stall during burst
58
   integer                    stall_chance  = 10; //chance for stall
59
 
60
   reg [ADDR_BITS-1:0]         HRESP_addr = {ADDR_BITS{1'b1}};   //address for response error
61
   reg [ADDR_BITS-1:0]         TIMEOUT_addr = {ADDR_BITS{1'b1}}; //address for timeout response (no HREADY)
62
   //-----------------------------------------------------------
63
 
64
 
65
   integer                    burst_stall;
66
   integer                    stall_chance_valid;
67
 
68
   reg                        HRESP;
69
   reg                        timeout_stall;
70
 
71
   reg [1:0]                   HSIZE_d;
72
   wire                       WR_pre;
73 3 eyalhoc
   reg                        WR_pre_d;
74
   wire                       WR;
75 2 eyalhoc
   wire [ADDR_BITS-1:0]       ADDR_WR_pre;
76
   reg [ADDR_BITS-1:0]         ADDR_WR;
77
   reg                        data_phase;
78
 
79
   wire [7:0]                  BSEL_wide;
80
 
81
   reg                        STALL_pre;
82
   reg                        STALL;
83
 
84
 
85
   parameter                  TRANS_IDLE   = 2'b00;
86
   parameter                  TRANS_STALL   = 2'b01;
87
   parameter                  TRANS_NONSEQ = 2'b10;
88
   parameter                  TRANS_SEQ    = 2'b11;
89
 
90
 
91
   task set_stall;
92
      begin
93
         stall_chance_valid = stall_chance;
94
      end
95
   endtask
96
 
97
   initial
98
     begin
99
        #FFD;
100
        set_stall;
101
 
102
        if (burst_chance > 0)
103
          forever
104
            begin
105
               burst_stall = rand_chance(burst_chance);
106
 
107
               if (burst_stall)
108
                 begin
109
                    #FFD;
110
                    stall_chance_valid = burst_val;
111
                    repeat (burst_len) @(posedge clk);
112
                    set_stall;
113
                 end
114
               else
115
                 begin
116
                    @(posedge clk);
117
                 end
118
            end
119
     end
120
 
121
 
122
   always @(posedge clk)
123
       begin
124
          #FFD;
125
          STALL_pre = rand_chance(stall_chance_valid);
126
       end
127
 
128
 
129
   always @(posedge clk or posedge reset)
130
     if (reset)
131
       STALL <= #FFD 1'b0;
132
     else if (stall_enable)
133
       STALL <= #FFD STALL_pre;
134
     else
135
       STALL <= #FFD 1'b0;
136
 
137
   always @(posedge clk or posedge reset)
138
     if (reset)
139
       timeout_stall <= #FFD 1'b0;
140
     else if ((|HTRANS) & (TIMEOUT_addr == HADDR))
141
       timeout_stall <= #FFD 1'b1;
142
     else if (TIMEOUT_addr == 0)
143
       timeout_stall <= #FFD 1'b0;
144
 
145
   always @(posedge clk or posedge reset)
146
     if (reset)
147
       HRESP <= #FFD 1'b0;
148
     else if ((|HTRANS) & (HRESP_addr == HADDR))
149
       HRESP <= #FFD 1'b1;
150
     else if (HREADY)
151
       HRESP <= #FFD 1'b0;
152
 
153
   always @(posedge clk or posedge reset)
154
     if (reset)
155
       data_phase <= #FFD 1'b0;
156
     else if (RD)
157
       data_phase <= #FFD 1'b1;
158
     else if (HREADY)
159
       data_phase <= #FFD 1'b0;
160
 
161
   assign                     HRDATA = HREADY & data_phase ? DOUT : 'd0;
162
   assign                     HREADY = HTRANS == TRANS_STALL ? 1'b0 : (~timeout_stall) & (~STALL);
163
 
164
 
165
   assign                     WR_pre      = HWRITE & ((HTRANS == TRANS_NONSEQ) | (HTRANS == TRANS_SEQ));
166 3 eyalhoc
   assign                     WR          = WR_pre_d & HREADY;
167 2 eyalhoc
   assign                     RD          = (~HWRITE) & ((HTRANS == TRANS_NONSEQ) | (HTRANS == TRANS_SEQ)) & HREADY;
168
   assign                     ADDR_WR_pre = {ADDR_BITS{WR_pre}} & HADDR;
169
   assign                     ADDR_RD     = {ADDR_BITS{RD}} & HADDR;
170
   assign                     DIN         = HWDATA;
171
 
172
   IFDEF TRUE(DATA_BITS==32)
173
   assign                     BSEL        = ADDR_WR[2] ? BSEL_wide[7:4] : BSEL_wide[3:0];
174
   ELSE TRUE(DATA_BITS==32)
175
   assign                     BSEL        = BSEL_wide;
176
   ENDIF TRUE(DATA_BITS==32)
177
 
178
   assign                     BSEL_wide    =
179
                              (HSIZE_d == 2'b00) & (ADDR_WR[2:0] == 3'd0) ? 8'b0000_0001 :
180
                              (HSIZE_d == 2'b00) & (ADDR_WR[2:0] == 3'd1) ? 8'b0000_0010 :
181
                              (HSIZE_d == 2'b00) & (ADDR_WR[2:0] == 3'd2) ? 8'b0000_0100 :
182
                              (HSIZE_d == 2'b00) & (ADDR_WR[2:0] == 3'd3) ? 8'b0000_1000 :
183
                              (HSIZE_d == 2'b00) & (ADDR_WR[2:0] == 3'd4) ? 8'b0001_0000 :
184
                              (HSIZE_d == 2'b00) & (ADDR_WR[2:0] == 3'd5) ? 8'b0010_0000 :
185
                              (HSIZE_d == 2'b00) & (ADDR_WR[2:0] == 3'd6) ? 8'b0100_0000 :
186
                              (HSIZE_d == 2'b00) & (ADDR_WR[2:0] == 3'd7) ? 8'b1000_0000 :
187
 
188
                              (HSIZE_d == 2'b01) & (ADDR_WR[2:1] == 2'd0) ? 8'b0000_0011 :
189
                              (HSIZE_d == 2'b01) & (ADDR_WR[2:1] == 2'd1) ? 8'b0000_1100 :
190
                              (HSIZE_d == 2'b01) & (ADDR_WR[2:1] == 2'd2) ? 8'b0011_0000 :
191
                              (HSIZE_d == 2'b01) & (ADDR_WR[2:1] == 2'd3) ? 8'b1100_0000 :
192
 
193
                              (HSIZE_d == 2'b10) & (ADDR_WR[2] == 1'd0)   ? 8'b0000_1111 :
194
                              (HSIZE_d == 2'b10) & (ADDR_WR[2] == 1'd1)   ? 8'b1111_0000 :
195
 
196
                              8'b1111_1111;
197
 
198
 
199
   always @(posedge clk or posedge reset)
200
     if (reset)
201
       begin
202 3 eyalhoc
          WR_pre_d <= #FFD 1'b0;
203 2 eyalhoc
          ADDR_WR <= #FFD {ADDR_BITS{1'b0}};
204
          HSIZE_d <= #FFD 2'b0;
205
       end
206
     else if (HREADY)
207
       begin
208 3 eyalhoc
          WR_pre_d <= #FFD WR_pre;
209 2 eyalhoc
          ADDR_WR <= #FFD ADDR_WR_pre;
210
          HSIZE_d <= #FFD HSIZE;
211
       end
212
 
213
 
214
endmodule
215
 
216
 
217
 
218
 

powered by: WebSVN 2.1.0

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