Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3 | lvd | 1 | /* |
2 | |||
3 | reset...init...save.start_write.stop_write.restore.start_read(compare).stop_read.loop |
||
4 | |||
5 | error... |
||
6 | |||
7 | |||
8 | |||
9 | */ |
||
10 | module mem_tester( |
||
11 | |||
12 | clk, |
||
13 | |||
14 | rst_n, |
||
15 | |||
16 | |||
17 | led, // LED flashing or not |
||
18 | |||
19 | |||
20 | // SRAM signals |
||
21 | SRAM_DQ, // sram inout databus |
||
22 | |||
23 | SRAM_ADDR, // sram address bus |
||
24 | |||
25 | SRAM_UB_N, |
||
26 | SRAM_LB_N, |
||
27 | SRAM_WE_N, // |
||
28 | SRAM_CE_N, // |
||
29 | SRAM_OE_N // |
||
30 | ); |
||
31 | |||
32 | parameter SRAM_DATA_SIZE = 8; |
||
33 | parameter SRAM_ADDR_SIZE = 19; |
||
34 | |||
35 | inout [SRAM_DATA_SIZE-1:0] SRAM_DQ; |
||
36 | wire [SRAM_DATA_SIZE-1:0] SRAM_DQ; |
||
37 | output [SRAM_ADDR_SIZE-1:0] SRAM_ADDR; |
||
38 | wire [SRAM_ADDR_SIZE-1:0] SRAM_ADDR; |
||
39 | output SRAM_UB_N,SRAM_LB_N,SRAM_WE_N,SRAM_CE_N,SRAM_OE_N; |
||
40 | wire SRAM_UB_N,SRAM_LB_N,SRAM_WE_N,SRAM_CE_N,SRAM_OE_N; |
||
41 | |||
42 | |||
43 | |||
44 | |||
45 | input clk; |
||
46 | |||
47 | input rst_n; |
||
48 | |||
49 | output led; reg led; |
||
50 | |||
51 | |||
52 | reg inc_pass_ctr; // increment passes counter (0000-9999 BCD) |
||
53 | reg inc_err_ctr; // increment errors counter (10 red binary LEDs) |
||
54 | |||
55 | |||
56 | reg check_in_progress; // when 1 - enables errors checking |
||
57 | |||
58 | |||
59 | reg [19:0] ledflash; |
||
60 | |||
61 | |||
62 | |||
63 | |||
64 | always @(posedge clk) |
||
65 | begin |
||
66 | if( inc_pass_ctr ) |
||
67 | ledflash <= 20'd0; |
||
68 | else if( !ledflash[19] ) |
||
69 | ledflash <= ledflash + 20'd1; |
||
70 | end |
||
71 | |||
72 | always @(posedge clk) |
||
73 | begin |
||
74 | led <= ledflash[19] ^ was_error; |
||
75 | end |
||
76 | |||
77 | |||
78 | |||
79 | reg was_error; |
||
80 | always @(posedge clk, negedge rst_n) |
||
81 | begin |
||
82 | if( !rst_n ) |
||
83 | was_error <= 1'b0; |
||
84 | else if( inc_err_ctr ) |
||
85 | was_error <= 1'b1; |
||
86 | end |
||
87 | |||
88 | |||
89 | |||
90 | reg rnd_init,rnd_save,rnd_restore; // rnd_vec_gen control |
||
91 | wire [SRAM_DATA_SIZE-1:0] rnd_out; // rnd_vec_gen output |
||
92 | |||
93 | rnd_vec_gen my_rnd( .clk(clk), .init(rnd_init), .next(sram_ready), .save(rnd_save), .restore(rnd_restore), .out(rnd_out) ); |
||
94 | defparam my_rnd.OUT_SIZE = SRAM_DATA_SIZE; |
||
95 | defparam my_rnd.LFSR_LENGTH = 41; |
||
96 | defparam my_rnd.LFSR_FEEDBACK = 3; |
||
97 | |||
98 | |||
99 | |||
100 | |||
101 | reg sram_start,sram_rnw; |
||
102 | wire sram_stop,sram_ready; |
||
103 | wire [SRAM_DATA_SIZE-1:0] sram_rdat; |
||
104 | |||
105 | sram_control my_sram( .clk(clk), .clk2(clk), .start(sram_start), .rnw(sram_rnw), .stop(sram_stop), .ready(sram_ready), |
||
106 | .rdat(sram_rdat), .wdat(rnd_out), |
||
107 | .SRAM_DQ(SRAM_DQ), .SRAM_ADDR(SRAM_ADDR), |
||
108 | .SRAM_CE_N(SRAM_CE_N), .SRAM_OE_N(SRAM_OE_N), .SRAM_WE_N(SRAM_WE_N) ); |
||
109 | defparam my_sram.SRAM_DATA_SIZE = SRAM_DATA_SIZE; |
||
110 | defparam my_sram.SRAM_ADDR_SIZE = SRAM_ADDR_SIZE; |
||
111 | |||
112 | |||
113 | |||
114 | |||
115 | |||
116 | |||
117 | |||
118 | // FSM states and registers |
||
119 | reg [3:0] curr_state,next_state; |
||
120 | |||
121 | parameter RESET = 4'h0; |
||
122 | |||
123 | parameter INIT1 = 4'h1; |
||
124 | parameter INIT2 = 4'h2; |
||
125 | |||
126 | parameter BEGIN_WRITE1 = 4'h3; |
||
127 | parameter BEGIN_WRITE2 = 4'h4; |
||
128 | parameter BEGIN_WRITE3 = 4'h5; |
||
129 | parameter BEGIN_WRITE4 = 4'h6; |
||
130 | |||
131 | parameter WRITE = 4'h7; |
||
132 | |||
133 | parameter BEGIN_READ1 = 4'h8; |
||
134 | parameter BEGIN_READ2 = 4'h9; |
||
135 | parameter BEGIN_READ3 = 4'hA; |
||
136 | parameter BEGIN_READ4 = 4'hB; |
||
137 | |||
138 | parameter READ = 4'hC; |
||
139 | |||
140 | parameter END_READ = 4'hD; |
||
141 | |||
142 | parameter INC_PASSES1 = 4'hE; |
||
143 | parameter INC_PASSES2 = 4'hF; |
||
144 | |||
145 | |||
146 | // FSM dispatcher |
||
147 | |||
148 | always @* |
||
149 | begin |
||
150 | case( curr_state ) |
||
151 | |||
152 | RESET: |
||
153 | next_state <= INIT1; |
||
154 | |||
155 | INIT1: |
||
156 | if( sram_stop ) |
||
157 | next_state <= INIT2; |
||
158 | else |
||
159 | next_state <= INIT1; |
||
160 | |||
161 | INIT2: |
||
162 | next_state <= BEGIN_WRITE1; |
||
163 | |||
164 | BEGIN_WRITE1: |
||
165 | next_state <= BEGIN_WRITE2; |
||
166 | |||
167 | BEGIN_WRITE2: |
||
168 | next_state <= BEGIN_WRITE3; |
||
169 | |||
170 | BEGIN_WRITE3: |
||
171 | next_state <= BEGIN_WRITE4; |
||
172 | |||
173 | BEGIN_WRITE4: |
||
174 | next_state <= WRITE; |
||
175 | |||
176 | WRITE: |
||
177 | if( sram_stop ) |
||
178 | next_state <= BEGIN_READ1; |
||
179 | else |
||
180 | next_state <= WRITE; |
||
181 | |||
182 | BEGIN_READ1: |
||
183 | next_state <= BEGIN_READ2; |
||
184 | |||
185 | BEGIN_READ2: |
||
186 | next_state <= BEGIN_READ3; |
||
187 | |||
188 | BEGIN_READ3: |
||
189 | next_state <= BEGIN_READ4; |
||
190 | |||
191 | BEGIN_READ4: |
||
192 | next_state <= READ; |
||
193 | |||
194 | READ: |
||
195 | if( sram_stop ) |
||
196 | next_state <= END_READ; |
||
197 | else |
||
198 | next_state <= READ; |
||
199 | |||
200 | END_READ: |
||
201 | next_state <= INC_PASSES1; |
||
202 | |||
203 | INC_PASSES1: |
||
204 | next_state <= INC_PASSES2; |
||
205 | |||
206 | INC_PASSES2: |
||
207 | next_state <= BEGIN_WRITE1; |
||
208 | |||
209 | |||
210 | |||
211 | |||
212 | default: |
||
213 | next_state <= RESET; |
||
214 | |||
215 | |||
216 | endcase |
||
217 | end |
||
218 | |||
219 | |||
220 | // FSM sequencer |
||
221 | |||
222 | always @(posedge clk,negedge rst_n) |
||
223 | begin |
||
224 | if( !rst_n ) |
||
225 | curr_state <= RESET; |
||
226 | else |
||
227 | curr_state <= next_state; |
||
228 | end |
||
229 | |||
230 | |||
231 | // FSM controller |
||
232 | |||
233 | always @(posedge clk) |
||
234 | begin |
||
235 | case( curr_state ) |
||
236 | |||
237 | ////////////////////////////////////////////////// |
||
238 | RESET: |
||
239 | begin |
||
240 | // various initializings begin |
||
241 | |||
242 | inc_pass_ctr <= 1'b0; |
||
243 | |||
244 | check_in_progress <= 1'b0; |
||
245 | |||
246 | rnd_init <= 1'b1; //begin RND init |
||
247 | |||
248 | rnd_save <= 1'b0; |
||
249 | rnd_restore <= 1'b0; |
||
250 | |||
251 | sram_start <= 1'b1; |
||
252 | sram_rnw <= 1'b1; // start condition for sram controller, in read mode |
||
253 | end |
||
254 | |||
255 | INIT1: |
||
256 | begin |
||
257 | sram_start <= 1'b0; // end sram start |
||
258 | end |
||
259 | |||
260 | INIT2: |
||
261 | begin |
||
262 | rnd_init <= 1'b0; // end rnd init |
||
263 | end |
||
264 | |||
265 | |||
266 | |||
267 | ////////////////////////////////////////////////// |
||
268 | BEGIN_WRITE1: |
||
269 | begin |
||
270 | rnd_save <= 1'b1; |
||
271 | sram_rnw <= 1'b0; |
||
272 | end |
||
273 | |||
274 | BEGIN_WRITE2: |
||
275 | begin |
||
276 | rnd_save <= 1'b0; |
||
277 | sram_start <= 1'b1; |
||
278 | end |
||
279 | |||
280 | BEGIN_WRITE3: |
||
281 | begin |
||
282 | sram_start <= 1'b0; |
||
283 | end |
||
284 | |||
285 | /* BEGIN_WRITE4: |
||
286 | begin |
||
287 | rnd_save <= 1'b0; |
||
288 | sram_start <= 1'b1; |
||
289 | end |
||
290 | |||
291 | WRITE: |
||
292 | begin |
||
293 | sram_start <= 1'b0; |
||
294 | end |
||
295 | */ |
||
296 | |||
297 | |||
298 | |||
299 | ////////////////////////////////////////////////// |
||
300 | BEGIN_READ1: |
||
301 | begin |
||
302 | rnd_restore <= 1'b1; |
||
303 | sram_rnw <= 1'b1; |
||
304 | end |
||
305 | |||
306 | BEGIN_READ2: |
||
307 | begin |
||
308 | rnd_restore <= 1'b0; |
||
309 | sram_start <= 1'b1; |
||
310 | end |
||
311 | |||
312 | BEGIN_READ3: |
||
313 | begin |
||
314 | sram_start <= 1'b0; |
||
315 | check_in_progress <= 1'b1; |
||
316 | end |
||
317 | |||
318 | /* BEGIN_READ4: |
||
319 | begin |
||
320 | rnd_restore <= 1'b0; |
||
321 | sram_start <= 1'b1; |
||
322 | end |
||
323 | |||
324 | READ: |
||
325 | begin |
||
326 | sram_start <= 1'b0; |
||
327 | check_in_progress <= 1'b1; |
||
328 | end |
||
329 | */ |
||
330 | END_READ: |
||
331 | begin |
||
332 | check_in_progress <= 1'b0; |
||
333 | end |
||
334 | |||
335 | INC_PASSES1: |
||
336 | begin |
||
337 | inc_pass_ctr <= 1'b1; |
||
338 | end |
||
339 | |||
340 | INC_PASSES2: |
||
341 | begin |
||
342 | inc_pass_ctr <= 1'b0; |
||
343 | end |
||
344 | |||
345 | |||
346 | |||
347 | |||
348 | endcase |
||
349 | end |
||
350 | |||
351 | |||
352 | |||
353 | // errors counter |
||
354 | |||
355 | always @(posedge clk) |
||
356 | inc_err_ctr <= check_in_progress & sram_ready & ((sram_rdat==rnd_out)?0:1); |
||
357 | |||
358 | |||
359 | |||
360 | endmodule |
||
361 | |||
362 |