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

Subversion Repositories mem_ctrl

[/] [mem_ctrl/] [trunk/] [bench/] [verilog/] [sram_models/] [IDT71T67802/] [idt_512Kx18_PBSRAM_test.v] - Blame information for rev 28

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 rudi
///////////////////////////////////////////////////////////
2
//
3
//    Test fixture for IDT 9Meg Synchronous Burst SRAMs
4
//              (for 512K x 18 configurations)
5
//
6
//////////////////////////////////////////////////////////
7
 
8
`timescale 1ns / 10ps
9
 
10
`define Max 16
11
`define Max1 8
12
`define Max2 16
13
 
14
module main;
15
 
16
parameter addr_msb = 18;
17
 
18
 
19
/////// Remove comments for specific device under test ////
20
 
21
 
22
//////////////////////////////////////////////
23
//
24
//Pipelined sync burst SRAMs
25
//
26
/////////////////////////////////////////////
27
 
28
/////// 2.5v I/O ////////////
29
parameter pipe = 1, Tcyc = 7.5, Tsu = 1.5, Tdh = 0.5, Tcd = 4.2, Toe = 4.2;
30
          `define device idt71t67802s133
31
//parameter pipe = 1, Tcyc = 6.7, Tsu = 1.5, Tdh = 0.5, Tcd = 3.8, Toe = 3.8; 
32
//          `define device idt71t67802s150
33
//parameter pipe = 1, Tcyc = 6.0, Tsu = 1.5, Tdh = 0.5, Tcd = 3.5, Toe = 3.5; 
34
//          `define device idt71t67802s166
35
 
36
//////////////////////////////////////////////
37
//
38
//Flow-through sync burst SRAMs
39
//
40
//////////////////////////////////////////////
41
 
42
/////// 2.5v I/O ////////////
43
//parameter pipe = 0, Tcyc = 11.5, Tsu = 2.0, Tdh = 0.5, Tcd = 8.5, Toe = 3.5; 
44
//          `define device idt71t67902s85
45
//parameter pipe = 0, Tcyc = 10.0, Tsu = 2.0, Tdh = 0.5, Tcd = 8.0, Toe = 3.5; 
46
//          `define device idt71t67902s80
47
//parameter pipe = 0, Tcyc = 8.5,  Tsu = 1.5, Tdh = 0.5, Tcd = 7.5, Toe = 3.5; 
48
//          `define device idt71t67902s75
49
 
50
reg   [addr_msb:0] A;
51
reg          CLK;
52
reg          ADSP_;
53
reg          ADV_;
54
reg          LBO_;
55
reg          ADSC_;
56
reg    [2:1] BW_;
57
reg          BWE_;
58
reg          GW_;
59
reg          CE_;
60
reg          CS0;
61
reg          CS1_;
62
reg          OE_;
63
 
64
reg   [17:0] DataOut;
65
reg   [17:0] TempReg;
66
 
67
reg   [17:0] DQ;
68
wire  [15:0] DQbus = {DQ[16:9], DQ[7:0]};
69
wire  [2:1]  DQPbus = {DQ[17], DQ[8]};
70
reg   [17:0] Dstore[0:`Max-1];              //temp data store
71
reg   [17:0] data;
72
reg   [addr_msb:0] lastaddr;
73
reg          tempcs1_;
74
reg          tempcs0;
75
reg          tempce_;
76
 
77
reg   [17:0] RandomData[0:`Max-1];
78
reg   [17:0] BurstData[0:`Max-1];
79
 
80
reg  [8*4:1] status;                       //data read pass/fail
81
 
82
//internal
83
 
84
reg check_data_m1, qual_ads;
85
reg check_data;
86
 
87
integer   i,j,addrb,counter,
88
          result;
89
 
90
// Output files
91
initial begin
92
  $recordfile ("idt_sram_67802.trn");
93
  $recordvars;
94
 
95
//  $dumpfile ("idt_sram_67802.vcd");
96
//  $dumpvars;
97
 
98
  result = $fopen("idt_sram.res"); if (result == 0) $finish;
99
end
100
 
101
always begin
102
  @(posedge CLK)
103
    $fdisplay(result,
104
      "%b",  ADSC_,
105
      "%b",  ADSP_,
106
      "%b",  BWE_,
107
      "%b",  CE_,
108
      "%b",  CS0,
109
      "%b",  CS1_,
110
      "%b",  LBO_,
111
      "%b",  OE_,
112
      "%b",  BW_,  // 2 bits
113
      "%b",  ADV_,
114
      "%b ", GW_,
115
      "%h ", {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]},
116
      "%h ", A,
117
      "%d", $stime
118
      );
119
end
120
 
121
initial begin
122
  ADSC_ = 1;
123
  ADSP_ = 1;
124
  BWE_  = 1;
125
  CE_   = 0;
126
  CS0   = 1;
127
  CS1_  = 0;
128
  LBO_  = 0;
129
  OE_   = 1;
130
  CLK   = 0;
131
  BW_   = 2'hf;
132
  ADV_  = 1;
133
  GW_   = 1;
134
  counter = 0;
135
 
136
  for (i=0;i<`Max;i=i+1) begin           // Generate random data for testing
137
    RandomData[i] = $random;
138
  end
139
 
140
//****************
141
//disable_ce;
142
//disable_cs0;
143
 
144
//####
145
init;
146
$display($time,"(1)  write        adsp_ = 0");
147
for(i=0; i<`Max1; i=i+1) begin
148
write(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
149
end
150
$display($time,"     read         adsp_ = 0");
151
for(i=0; i<`Max1; i=i+1) begin
152
read(i,0,1,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
153
end
154
dummy_cyc(1);
155
$display($time,"                  status = %s",status);
156
 
157
//####
158
init;
159
$display($time,"(2)  write        adsc_ = 0");
160
for(i=0; i<`Max1; i=i+1) begin
161
write(i,i,1,0,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
162
end
163
$display($time,"     read         adsc_ = 0");
164
for(i=0; i<`Max1; i=i+1) begin
165
read(i,1,0,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
166
end
167
$display($time,"                  status = %s",status);
168
 
169
//####
170
init;
171
$display($time,"(3)  write        adsp_ = 0");
172
for(i=0; i<`Max1; i=i+1) begin
173
write(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
174
end
175
$display($time,"     read         adsp_ = 0 cs1_ = 1 - every other cyc");
176
for(i=0; i<`Max1; i=i+2) begin
177
read(i,0,1,0,1,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
178
read(i+1,0,1,0,0,1);                     //addr,adsp_,adsc_,ce_,cs1_,cs0
179
end
180
$display($time,"                  status = %s",status);
181
 
182
//####
183
init;
184
$display($time,"(4)  write/read   adsp_ = 0");
185
for(i=0; i<`Max1; i=i+1) begin
186
write(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
187
read(i,0,1,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
188
end
189
$display($time,"                  status = %s",status);
190
 
191
//####
192
init;
193
$display($time,"(5)  write/read   adsc_ = 0");
194
for(i=0; i<`Max1; i=i+1) begin
195
write(i,i,1,0,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
196
read(i,1,0,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
197
dummy_cyc(1);
198
end
199
$display($time,"                  status = %s",status);
200
 
201
//####
202
init;
203
$display($time,"(6)  burst_write  adsp_ = 0");
204
for(i=0; i<`Max2; i=i+4) begin
205
burst_write(i,i,0,1,0,0,0,1,4);          //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,nburst
206
end
207
$display($time,"     burst_read   adsp_ = 0");
208
for(i=0; i<`Max2; i=i+4) begin
209
burst_read(i,0,1,0,0,1,4);               //addr,adsp_,adsc_,ce_,cs1_,cs0,nburst
210
end
211
dummy_cyc(1);
212
$display($time,"                  status = %s",status);
213
 
214
//####
215
init;
216
$display($time,"(7)  burst_write  adsc_ = 0");
217
for(i=0; i<`Max2; i=i+4) begin
218
burst_write(i,i,1,0,0,0,0,1,4);          //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,nburst
219
end
220
$display($time,"     burst_read   adsc_ = 0");
221
for(i=0; i<`Max2; i=i+4) begin
222
burst_read(i,1,0,0,0,1,4);               //addr,adsp_,adsc_,ce_,cs1_,cs0,nburst
223
end
224
$display($time,"                  status = %s",status);
225
 
226
//####
227
init;
228
$display($time,"(8)  write        adsp_ = 0 cs1_ = 1 - every other cyc");
229
for(i=0; i<`Max1; i=i+2) begin
230
write(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
231
write(i+1,9,0,1,0,0,1,1);                //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
232
end
233
$display($time,"     read         adsp_ = 0");
234
for(i=0; i<`Max1; i=i+2) begin
235
read(i,0,1,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
236
end
237
$display($time,"                  status = %s",status);
238
 
239
//####
240
init;
241
$display($time,"(9)  write        adsp_ = 0 cs0  = 0 - every other cyc");
242
for(i=0; i<`Max1; i=i+2) begin
243
write(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
244
write(i+1,9,0,1,0,0,0,0);                //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
245
end
246
$display($time,"     read         adsc_ = 0");
247
for(i=0; i<`Max1; i=i+2) begin
248
read(i,1,0,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
249
end
250
$display($time,"                  status = %s",status);
251
 
252
//####
253
init;
254
$display($time,"(10) write        adsp_ = 0 ce_  = 1 - every other cyc");
255
for(i=0; i<`Max1; i=i+2) begin
256
write(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
257
write(i+1,i,0,1,0,1,0,1);                //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
258
end
259
write(i,i,0,1,0,0,0,1);                  //this will write last address to Dstore
260
$display($time,"     read         adsp_ = 0");
261
for(i=0; i<`Max1; i=i+2) begin
262
read(i,0,1,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
263
end
264
$display($time,"                  status = %s",status);
265
 
266
//####
267
init;
268
$display($time,"(11) write        adsc_ = 0 ce_  = 1 - every other cyc");
269
for(i=0; i<`Max1; i=i+2) begin
270
write(i,i,1,0,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
271
write(i+1,i+1,1,0,0,1,0,1);              //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
272
end
273
write(i,i,1,0,0,0,0,1);                  //this will write last address to Dstore
274
$display($time,"     read         adsc_ = 0");
275
for(i=0; i<`Max1; i=i+2) begin
276
read(i,1,0,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0
277
end
278
$display($time,"                  status = %s",status);
279
 
280
//####
281
init;
282
$display($time,"(12) burst_write_adv  adsc_ = 0 adv_ = 1 - 2nd cyc");
283
for(i=0; i<`Max2; i=i+4) begin
284
burst_write_adv(i,i,1,0,0,0,0,1,1,0);     //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,adv_,tempcounter
285
burst_write_adv(i,i,1,0,0,0,0,1,1,1);
286
burst_write_adv(i+1,i+1,1,0,0,0,0,1,0,2);
287
burst_write_adv(i+2,i+2,1,0,0,0,0,1,0,3);
288
burst_write_adv(i+3,i+3,1,0,0,0,0,1,0,4);
289
end
290
$display($time,"     burst_read   adsc_ = 0");
291
for(i=0; i<`Max2; i=i+4) begin
292
burst_read(i,1,0,0,0,1,4);               //addr,adsp_,adsc_,ce_,cs1_,cs0,nburst
293
end
294
$display($time,"                  status = %s",status);
295
 
296
//####
297
init;
298
$display($time,"(13) burst_write_adv  adsp_ = 0 adv_ = 1 - 2nd cyc");
299
for(i=0; i<`Max2; i=i+4) begin
300
burst_write_adv(i,i,0,1,0,0,0,1,1,0);     //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,adv_,tempcounter
301
burst_write_adv(i,i,0,0,0,1,0,1,1,1);
302
burst_write_adv(i+1,i+1,0,1,0,0,0,1,0,2);
303
burst_write_adv(i+2,i+2,0,1,0,0,0,1,0,3);
304
burst_write_adv(i+3,i+3,0,1,0,0,0,1,0,4);
305
end
306
$display($time,"     burst_read   adsc_ = 0");
307
for(i=0; i<`Max2; i=i+4) begin
308
burst_read(i,1,0,0,0,1,4);               //addr,adsp_,adsc_,ce_,cs1_,cs0,nburst
309
end
310
$display($time,"                  status = %s",status);
311
 
312
//####
313
init;
314
$display($time,"(14) burst_write  adsp_ = 0");
315
for(i=0; i<`Max2; i=i+4) begin
316
burst_write(i,i,0,1,0,0,0,1,4);          //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,nburst
317
end
318
$display($time,"     burst_read_adv   adsp_ = 0 adv_ = 1 - 3rd cyc");
319
for(i=0; i<`Max2; i=i+4) begin
320
burst_read_adv(i,  0,1,0,0,1,1,0);       //addr,adsp_,adsc_,ce_,cs1_,cs0,adv_,tempcounter
321
burst_read_adv(i+1,1,1,0,0,1,0,1);
322
burst_read_adv(i+2,1,1,0,0,1,1,2);
323
burst_read_adv(i+3,1,1,0,0,1,0,3);
324
end
325
$display($time,"                  status = %s",status);
326
 
327
//####
328
init;
329
$display($time,"(15) burst_write  adsp_ = 0");
330
for(i=0; i<`Max2; i=i+4) begin
331
burst_write(i,i,0,1,0,0,0,1,4);          //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,nburst
332
end
333
$display($time,"     burst_read_adv   adsp_=1/ce_=0 - 2/3 cyc, adsp = 0/ce_=1 - 4/5 cyc");
334
for(i=0; i<`Max2; i=i+4) begin
335
burst_read_adv(i,  0,1,0,0,1,1,0);       //addr,adsp_,adsc_,ce_,cs1_,cs0,adv_,tempcounter
336
burst_read_adv(i+1,1,1,0,0,1,0,1);
337
burst_read_adv(i+2,1,1,0,0,1,0,2);
338
burst_read_adv(i+3,0,1,1,0,1,0,3);
339
burst_read_adv(i,  0,1,1,0,1,0,4);
340
end
341
$display($time,"                  status = %s",status);
342
//####
343
 
344
 
345
@( negedge CLK );
346
@( negedge CLK );
347
@( negedge CLK );
348
 
349
//*****************
350
CE_ = 0;
351
CS0 = 1;
352
CS1_ = 0;
353
 
354
  $display($time,,"Simple read/write test");
355
  for (i=0;i<`Max;i=i+1) begin      // Test straight write/read
356
    write_random(i, RandomData[i]);
357
  $display($time,,"Simple read test");
358
    read_random(i, DataOut, RandomData[i]);
359
  end
360
 
361
 $display($time,,"CE_ disable - random data");
362
 read_random(3, DataOut, RandomData[3]);
363
 disable_ce;
364
 read_random(7, DataOut, RandomData[7]);
365
 disable_cs0;
366
 read_random(2, DataOut, RandomData[2]);
367
  for (i=0;i<`Max;i=i+1) begin      // Fill RAM with zero's
368
    write_random(i, 0);
369
  end
370
 
371
  $display($time,,"Byte mode read/write test - random data");
372
//  GW_ = 1;                        // Disable global write
373
//  BWE_  = 0;                      // Enable byte write
374
  for (i=0;i<`Max;i=i+1) begin    // Test byte write/read
375
    BW_ = $random;
376
    TempReg = RandomData[i];
377
    byte_write_random(i, TempReg);
378
    if ( BW_[1] == 1 ) TempReg[8:0] = 0;
379
    if ( BW_[2] == 1 ) TempReg[17:9] = 0;
380
    read_random(i, DataOut, TempReg);
381
  end
382
  BWE_  = 1;                      // Disable byte write
383
 
384
 
385
  // Test burst mode write/read
386
  $display($time,,"Burst mode read/write test - random data");
387
  for (i=0;i<`Max;i=i+1) begin      // Test byte write/read
388
      BurstData[i] = RandomData[i];
389
  end
390
 
391
  GW_ = 0;                       // Enable global write
392
  for (i=0;i<`Max;i=i+4) begin   // Write data from BurstData buffer
393
    burst_write_random(i,4);
394
  end
395
  GW_ = 1;                       // Disable global write
396
 
397
  for (i=0;j<`Max;i=i+1) begin   // Clear data buffer
398
      BurstData[i] = 0;
399
  end
400
 
401
  for (i=0;i<`Max;i=i+4) begin
402
    burst_read_random(i,4);
403
//    for (j=i;j<i+4;j=j+1) begin      // verify read data
404
//      if ( BurstData[j] != RandomData[j] )
405
//          $display("%d  Burst error: Addr %h Exp %h Act %h", $stime, j, RandomData[j], BurstData[j]);
406
//    end
407
  end
408
  burst_wrap_random(0);
409
  disable_ce;
410
  burst_rd_pipe_random(0,4);
411
 
412
  $finish;
413
end
414
/////////////////////////////////////////////////////////////////
415
 
416
always @(posedge CLK) begin
417
   if ((~ADSC_ | ~ADSP_) & ~CE_ & CS0 & ~CS1_) qual_ads <= #1 1;
418
   else qual_ads <= #1 0;
419
   check_data_m1 <= #1 ~ADV_;
420
 
421
   if (pipe == 0) check_data = #1 (qual_ads | ~ADV_);
422
   else check_data = #1 (qual_ads | check_data_m1);
423
end
424
 
425
always #(Tcyc/2) CLK = ~CLK;
426
 
427
`device  dut (
428
    .A        (A),
429
    .D        (DQbus),
430
    .DP       (DQPbus),
431
    .oe_      (OE_),
432
    .ce_      (CE_),
433
    .cs0      (CS0),
434
    .cs1_     (CS1_),
435
    .lbo_     (LBO_),
436
    .gw_      (GW_),
437
    .bwe_     (BWE_),
438
    .bw2_     (BW_[2]),
439
    .bw1_     (BW_[1]),
440
    .adsp_    (ADSP_),
441
    .adsc_    (ADSC_),
442
    .adv_     (ADV_),
443
    .clk      (CLK)
444
    );
445
 
446
//================ test bench tasks
447
 
448
task disable_ce;
449
begin
450
    OE_ = 0;
451
    if (CLK)
452
        @( negedge CLK );
453
    ADSC_ = 0;
454
    CE_   = 1;
455
    @( posedge CLK );
456
    @( negedge CLK );
457
    ADSC_ = 1;
458
    CE_   = 0;
459
end
460
endtask
461
 
462
task disable_cs0;
463
begin
464
    OE_ = 0;
465
    if (CLK)
466
        @( negedge CLK );
467
    ADSP_ = 0;
468
    CS0   = 0;
469
    @( posedge CLK );
470
    @( negedge CLK );
471
    ADSP_ = 1;
472
    CS0   = 1;
473
end
474
endtask
475
 
476
task dummy_cyc;
477
input oe;
478
begin
479
@(posedge CLK);
480
  @(negedge CLK);
481
   #Tcd;
482
   OE_ = oe;
483
end
484
endtask
485
 
486
task init;
487
begin
488
  for(i=0; i<`Max2; i=i+1) begin         // fill memory with 0 data
489
    write(i,0,0,1,0,0,0,1);              // addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0
490
    Dstore[i] = 18'hx;                   // fill temp memory with xx data
491
  end
492
end
493
endtask
494
 
495
task read;                   // ADSP|ADSC controlled PL - adsp_/adsc_ 2cycle read
496
input  [addr_msb:0] addr;    // ADSP|ADSC controlled FT - adsp_/adsc_ 1cycle read
497
input  adsp_;
498
input  adsc_;
499
input  ce_;
500
input  cs1_;
501
input  cs0;
502
begin
503
   @( negedge CLK );
504
    #(Tcyc/2 - Tsu);
505
    A     = addr;
506
    ADV_  = 1;
507
    GW_   = 1;
508
    BWE_  = 1;
509
    ADSP_ = adsp_;
510
    ADSC_ = adsc_;
511
    CE_   = ce_;
512
    CS1_  = cs1_;
513
    CS0   = cs0;
514
      assign data = {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]};
515
   @( posedge CLK );           // SRAM latches Address and begins internal read
516
     tempcs0  <= cs0; tempcs1_  <= cs1_; tempce_  <= ce_;
517
     lastaddr <= addr;
518
     A <= #Tdh 19'hz;
519
     ADSP_ <= #Tdh 1;
520
     ADSC_ <= #Tdh 1;
521
     CE_ <= #Tdh 1;
522
     CS1_<= #Tdh 1;
523
     CS0 <= #Tdh 0;
524
     if(pipe == 1)
525
       OE_ <= #(Tcyc+Tcd-Toe) 0;
526
     else if(pipe == 0)
527
       OE_ <= #(Tcd-Toe) 0;
528
     if(counter != 0)
529
       if ( data !== Dstore[lastaddr] ) begin
530
         if (tempcs0 & ~tempce_ & ~tempcs1_) begin
531
         status = "FAIL";
532
            $display("%d Read error: Addr %h Exp %h Act %h", $stime, lastaddr,
533
                      Dstore[lastaddr], data);
534
         end
535
         end
536
       else if (tempcs0 & ~tempce_ & ~tempcs1_)
537
               status = "PASS";
538
    DQ = 18'hz;
539
    if(pipe == 1)
540
      #(Tcyc/2);
541
    counter = counter+1;
542
end
543
endtask
544
 
545
task burst_read;             // ADSP|ADSC controlled - adsp/adsc 3-1-1-1 PL read
546
input  [addr_msb:0] addr;    //                        adsp/adsc 2-1-1-1 FT read
547
input  adsp_;
548
input  adsc_;
549
input  ce_;
550
input  cs1_;
551
input  cs0;
552
input  [3:0] nburst;
553
integer tempaddr,tempcounter;
554
begin
555
tempcounter = 0;
556
 for (tempaddr=addr; tempaddr<addr+nburst; tempaddr=tempaddr+1) begin
557
   @( negedge CLK );
558
   if (tempaddr == addr) begin           // 1st address
559
      #(Tcyc/2 - Tsu);
560
      A     = addr;
561
      GW_   = 1;
562
      BWE_  = 1;
563
      ADSP_ = adsp_;
564
      ADSC_ = adsc_;
565
      ADV_  = 1;
566
      CE_   = ce_;
567
      CS1_  = cs1_;
568
      CS0   = cs0;
569
   end
570
   else begin
571
      #(Tcyc/2 - Tsu);                  // after 2nd address
572
      A     = 19'hz;
573
      ADV_ = 0;
574
   end
575
    assign data = {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]};
576
   @( posedge CLK );      // SRAM latches Address and begins internal read
577
   lastaddr <= #(Tcyc) tempaddr;
578
   if (tempaddr == addr) begin           // 1st address
579
      A <= #Tdh 19'hz;
580
      ADSP_ <= #Tdh 1;
581
      ADSC_ <= #Tdh 1;
582
      CE_   <= #Tdh ~ce_;
583
      CS1_  <= #Tdh ~cs1_;
584
      CS0   <= #Tdh ~cs0;
585
      if(pipe == 1)
586
        OE_ <= #(Tcyc+Tcd-Toe) 0;
587
      if(pipe == 0)
588
        OE_ <= #(Tcd-Toe) 0;
589
   end
590
   else begin                            // after 2nd address
591
      ADV_  <= #Tdh 1;
592
   end
593
      if(pipe == 1)
594
        if(tempcounter > 1 )
595
          if ( data !== Dstore[lastaddr] ) begin
596
               status = "FAIL";
597
               $display("%d Read error: Addr %h Exp %h Act %h", $stime, lastaddr,
598
                         Dstore[lastaddr], data);
599
          end
600
          else status = "PASS";
601
      else if(pipe == 0)
602
        if(tempcounter > 0 )
603
          if ( data !== Dstore[lastaddr] ) begin
604
               status = "FAIL";
605
               $display("%d Read error: Addr %h Exp %h Act %h", $stime, lastaddr,
606
                         Dstore[lastaddr], data);
607
          end
608
          else status = "PASS";
609
    DQ = 18'hz;
610
    #Tdh;
611
    tempcounter = tempcounter+1;
612
 end
613
end
614
endtask
615
 
616
task burst_read_adv;       // ADSP|ADSC controlled - adsp/adsc 3-1-1-1 PL read
617
input  [addr_msb:0] addr;        //                        adsp/adsc 2-1-1-1 FT read
618
input  adsp_;
619
input  adsc_;
620
input  ce_;
621
input  cs1_;
622
input  cs0;
623
input  adv_;
624
input  [3:0] tempcounter;
625
begin
626
   @( negedge CLK );
627
   if (tempcounter == 0) begin            // 1st address
628
      #(Tcyc/2 - Tsu);
629
      A     = addr;
630
      GW_   = 1;
631
      BWE_  = 1;
632
      ADSP_ = adsp_;
633
      ADSC_ = adsc_;
634
      ADV_  = adv_;
635
      CE_   = ce_;
636
      CS1_  = cs1_;
637
      CS0   = cs0;
638
   end
639
   else begin
640
      #(Tcyc/2 - Tsu);                  // after 2nd address
641
      A     = 19'hz;
642
      ADSP_ = adsp_;
643
      ADSC_ = adsc_;
644
      CE_   = ce_;
645
      ADV_ = adv_;
646
   end
647
    assign data = {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]};
648
   @( posedge CLK );      // SRAM latches Address and begins internal read
649
   lastaddr <= #(Tcyc) addr;
650
   if (tempcounter == 0) begin           // 1st address
651
      A <= #Tdh 19'hz;
652
      ADSP_ <= #Tdh ~adsp_;
653
      ADSC_ <= #Tdh ~adsc_;
654
      CE_   <= #Tdh ~ce_;
655
      CS1_  <= #Tdh ~cs1_;
656
      CS0   <= #Tdh ~cs0;
657
      if(pipe == 1)
658
        OE_ <= #(Tcyc+Tcd-Toe) 0;
659
      if(pipe == 0)
660
        OE_ <= #(Tcd-Toe) 0;
661
   end
662
   else begin                            // after 2nd address
663
      ADSP_ <= #Tdh ~adsp_;
664
      ADSC_ <= #Tdh ~adsc_;
665
      CE_   <= #Tdh ~ce_;
666
      ADV_  <= #Tdh ~adv_;
667
   end
668
      if(pipe == 1)
669
        if(tempcounter > 1 )
670
          if ( data !== Dstore[lastaddr] ) begin
671
               status = "FAIL";
672
               $display("%d Read error: Addr %h Exp %h Act %h", $stime, lastaddr,
673
                         Dstore[lastaddr], data);
674
          end
675
          else status = "PASS";
676
      else if(pipe == 0)
677
        if(tempcounter > 0 )
678
          if ( data !== Dstore[lastaddr] ) begin
679
               status = "FAIL";
680
               $display("%d Read error: Addr %h Exp %h Act %h", $stime, lastaddr,
681
                         Dstore[lastaddr], data);
682
          end
683
          else status = "PASS";
684
    DQ = 18'hz;
685
end
686
endtask
687
 
688
task read_random;
689
input  [addr_msb:0] addr;
690
output [17:0] data;
691
input  [17:0] exp;
692
begin
693
    if (CLK )
694
        @( negedge CLK );
695
//    DQ = 18'hz;
696
    ADV_  = 1;
697
    A = addr;
698
    ADSP_ = 0;
699
    @( posedge CLK );      // SRAM latches Address and begins internal read
700
    @( negedge CLK );
701
    ADSP_ = 1;
702
    OE_   = 0;
703
    if (pipe == 1) @( posedge CLK );      // SRAM begins placing data onto bus
704
    @( posedge CLK );      // Data sampled by reading device
705
                           // Hopefully the SRAM has an output hold time
706
    data = {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]};
707
    if ( data !== exp )
708
        $display("%d Read_random error: Addr %h Exp %h Act %h", $stime, addr, exp, data);
709
    @( negedge CLK );
710
    OE_   = 1;
711
 
712
end
713
endtask
714
 
715
task burst_read_random;
716
input  [addr_msb:0] addr;
717
input  [17:0] n;
718
integer       i;
719
begin
720
    DQ = 18'hz;
721
    if ( CLK )
722
        @( negedge CLK );
723
    #1 A = addr;
724
       ADSP_ = 0;
725
    @( posedge CLK );           // Address latched by SRAM, begins internal read
726
    #(Tcyc/2) ADSP_ = 1;       // SRAM starts driving bus (flow-through)
727
    #1 OE_   = 0;
728
       ADV_  = 0;
729
    if (pipe == 1) @(posedge CLK); //SRAM starts driving bus (pipelined)
730
 
731
    for (i=addr;i<addr+n;i=i) begin
732
       @( posedge CLK ) begin
733
          if (check_data == 1)
734
BurstData[i] = {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]};
735
          if ( BurstData[i] !== RandomData[i] && check_data == 1 )
736
             $display("%d task burst_read_random read error: Addr %h Exp %h Act %h", $stime, i, RandomData[i], BurstData[i]);
737
       end
738
       @( negedge CLK );
739
       if (check_data) i=i+1;
740
       if ( ($random & 3) === 2'b11 ) // suspend burst 25% of the time
741
           ADV_ = 1;
742
       else begin
743
           ADV_ = 0;
744
       end
745
    end
746
 
747
    OE_   = 1;
748
    ADV_  = 1;
749
end
750
endtask
751
 
752
task burst_wrap_random; //checks burst counter wrap-around
753
input  [addr_msb:0] addr;
754
integer i,j;
755
begin
756
    DQ = 18'hz;
757
    if ( CLK )
758
       @( negedge CLK );
759
    #1 A = addr;
760
       ADSP_ = 0;
761
    @(posedge CLK);           // Address latched by SRAM, begins internal read
762
    #(Tcyc/2) ADSP_ = 1;
763
    #1 OE_   = 0;
764
       ADV_  = 0;
765
    if (pipe == 1) @(posedge CLK);
766
 
767
   for (i=0;i<2;i=i+1) begin
768
      for (j=0;j<4;j=j+1) begin
769
         @( posedge CLK ) begin
770
            if (check_data == 1)
771
BurstData[j] = {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]};
772
            if ( BurstData[j] !== RandomData[j] && check_data == 1 )
773
               $display("%d task burst_wrap_random read error: Addr %h Exp %h Act %h", $stime, i, RandomData[i], BurstData[i]);
774
         end
775
      end
776
   end
777
   #1 OE_   = 1;
778
      ADV_  = 1;
779
end
780
endtask
781
 
782
task burst_rd_pipe_random;
783
input  [addr_msb:0] addr1;
784
input  [addr_msb:0] addr2;
785
 
786
integer       i;
787
 
788
begin
789
   DQ = 18'hz;
790
   for (i=0;i<12;i=i+1) begin
791
      @(posedge CLK);
792
 
793
      if (i == 0 | i == 4) begin
794
         #(Tcyc/2) ADSP_ <= 0;
795
         if (i == 0) A = addr1;
796
         if (i == 4) A = addr2;
797
      end
798
      else #(Tcyc/2) ADSP_ <= 1;
799
 
800
      if (i >= 1 && i <=10) OE_ = 0;
801
      else OE_ = 1;
802
 
803
      if (i >= 1 && i <= 3 || i >= 5 && i<= 7) ADV_ <= 0;
804
      else ADV_ <= 1;
805
   end
806
end
807
endtask
808
 
809
task write;        //ADSP|ADSC controlled PL|FT - adsp 2cycle/adsc 1cycle write   
810
input  [addr_msb:0] addr;
811
input  [17:0] data;
812
input  adsp_;
813
input  adsc_;
814
input  gw_;
815
input  ce_;
816
input  cs1_;
817
input  cs0;
818
begin
819
   @( negedge CLK );
820
    A <= #(Tcyc/2-Tsu) addr;
821
    ADSP_ <= #(Tcyc/2-Tsu) adsp_;
822
    ADSC_ <= #(Tcyc/2-Tsu) adsc_;
823
    DQ = 18'hz;
824
    ADV_  = 1;
825
    CE_   <= #(Tcyc/2-Tsu) ce_;
826
    CS1_  <= #(Tcyc/2-Tsu) cs1_;
827
    CS0   <= #(Tcyc/2-Tsu) cs0;
828
    OE_   <= #(Tcyc/2-Tsu) 1;
829
    if (adsp_ == 0)                               // if adsp_ controlled
830
      GW_ = ~gw_;
831
    else if (adsp_ == 1 & adsc_ == 0) begin       // if adsc_ controlled
832
      #(Tcyc/2-Tsu)
833
      GW_ = gw_;
834
      DQ  = data;
835
        if (cs1_ == 0 & cs0 == 1 & ce_ == 0)
836
          Dstore[addr] = data;
837
    end
838
    else
839
      DQ  = 18'hz;
840
   @( posedge CLK );
841
    counter = 0;
842
    A <= #Tdh 19'hz;
843
    ADSP_ <= #Tdh 1;
844
    ADSC_ <= #Tdh 1;
845
//    OE_   <= #Tdh 1;
846
    CE_   <= #Tdh 1;
847
    CS1_  <= #Tdh 1;
848
    CS0   <= #Tdh 0;
849
    if (adsp_ == 0) begin                         // if adsp controlled
850
      #(Tcyc - Tsu);
851
      GW_ = gw_;
852
      DQ = data;
853
//$display($time, "DQ    %h data  %d  addr %d", DQ, data, addr);
854
      GW_ <= #(Tsu + Tdh) ~gw_;
855
      DQ  <= #(Tsu + Tdh) 18'hz;
856
        if (cs1_ == 0 & cs0 == 1 & ce_ == 0)
857
          Dstore[addr] = data;
858
    end
859
    else if (adsp_ == 1 & adsc_ == 0) begin       // if adsc_ controlled
860
      GW_ <= #Tdh ~gw_;
861
      DQ  <= #Tdh 18'hz;
862
    end
863
    else
864
      DQ  = 18'hz;
865
end
866
endtask
867
 
868
task burst_write;     //ADSP&ADSC controlled PL|FT - adsp_ 2-1-1-1/adsc_ 1-1-1-1 write   
869
input  [addr_msb:0] addr;
870
input  [17:0] data;
871
input  adsp_;
872
input  adsc_;
873
input  gw_;
874
input  ce_;
875
input  cs1_;
876
input  cs0;
877
input  [3:0] nburst;
878
integer tempaddr,tempcounter;
879
begin
880
tempcounter = 0;
881
 for (tempaddr=addr; tempaddr<addr+nburst; tempaddr=tempaddr+1) begin
882
   @( negedge CLK );
883
    DQ = 18'hz;
884
    if (tempaddr == addr) begin
885
        A <= #(Tcyc/2-Tsu) addr;
886
        ADSP_ <= #(Tcyc/2-Tsu) adsp_;
887
        ADSC_ <= #(Tcyc/2-Tsu) adsc_;
888
        ADV_   = 1;
889
        CE_   <= #(Tcyc/2-Tsu) ce_;
890
        CS1_  <= #(Tcyc/2-Tsu) cs1_;
891
        CS0   <= #(Tcyc/2-Tsu) cs0;
892
         if (adsp_ == 0) begin                        // if adsp_ controlled
893
           ADV_ = 1;
894
           GW_ = ~gw_;
895
         end
896
         else if (adsp_ == 1 & adsc_ == 0) begin       // if adsc_ controlled
897
           #(Tcyc/2-Tsu);
898
           GW_ = gw_;
899
           DQ  = data;
900
           if (cs1_ == 0 & cs0 == 1 & ce_ == 0)
901
             Dstore[tempaddr] = data;
902
         end
903
         else
904
           DQ  = 18'hz;
905
    end
906
    else begin                                       // burst after 2nd cycle
907
        ADSP_ = 1;
908
        ADSC_ = 1;
909
        #(Tcyc/2-Tsu);
910
        GW_ = gw_;
911
        data = data+1;
912
        DQ  = data;
913
        if (cs1_ == 0 & cs0 == 1 & ce_ == 0)
914
          Dstore[tempaddr] = data;
915
       if (tempcounter == 0) ADV_ = 1;
916
       else ADV_ = 0;
917
    end
918
   @( posedge CLK );
919
    counter = 0;
920
    if (tempaddr == addr) begin
921
        A <= #Tdh 19'hz;
922
        ADSP_ <= #Tdh 1;
923
        ADSC_ <= #Tdh 1;
924
        OE_   <= #Tdh 1;
925
        CE_   <= #Tdh ~ce_;
926
        CS1_  <= #Tdh ~cs1_;
927
        CS0   <= #Tdh ~cs0;
928
         if (adsp_ == 0) begin                       // if adsp_ controlled
929
           #(Tcyc - Tsu);
930
           GW_ = gw_;
931
           DQ = data;
932
           ADV_ <= #(Tsu + Tdh) 1;
933
           GW_  <= #(Tsu + Tdh) ~gw_;
934
           DQ   <= #(Tsu + Tdh) 18'hz;
935
           if (cs1_ == 0 & cs0 == 1 & ce_ == 0)
936
             Dstore[tempaddr] = data;
937
          if (tempcounter == 0) ADV_ = 1;
938
          else ADV_ = 0;
939
        end
940
        else if (adsp_ == 1 & adsc_ == 0) begin       // if adsc_ controlled
941
           ADV_ <= #Tdh 1;
942
           GW_  <= #Tdh ~gw_;
943
           DQ   <= #Tdh 18'hz;
944
        end
945
        else
946
           DQ  = 18'hz;
947
    end
948
    else begin                                        // burst after 2nd cycle
949
        ADV_ <= #Tdh 1;
950
        GW_  <= #Tdh ~gw_;
951
        DQ   <= #Tdh 18'hz;
952
    end
953
        tempcounter = tempcounter+1;
954
 end
955
end
956
endtask
957
 
958
task burst_write_adv;   //ADSP|ADSC controlled PL|FT - adsp_ 2-1-1-1/adsc_ 1-1-1-1 write
959
input  [addr_msb:0] addr;
960
input  [17:0] data;
961
input  adsp_;
962
input  adsc_;
963
input  gw_;
964
input  ce_;
965
input  cs1_;
966
input  cs0;
967
input  adv_;
968
input  [3:0] tempcounter;
969
begin
970
   @( negedge CLK );
971
    DQ = 18'hz;
972
    if (tempcounter == 0) begin
973
        A <= #(Tcyc/2-Tsu) addr;
974
        ADSP_ <= #(Tcyc/2-Tsu) adsp_;
975
        ADSC_ <= #(Tcyc/2-Tsu) adsc_;
976
        ADV_   = adv_;
977
        CE_   <= #(Tcyc/2-Tsu) ce_;
978
        CS1_  <= #(Tcyc/2-Tsu) cs1_;
979
        CS0   <= #(Tcyc/2-Tsu) cs0;
980
         if (adsp_ == 0) begin                        // if adsp_ controlled
981
           ADV_ = adv_;
982
           GW_ = ~gw_;
983
         end
984
         else if (adsp_ == 1 & adsc_ == 0) begin       // if adsc_ controlled
985
           #(Tcyc/2-Tsu);
986
           GW_ = gw_;
987
           DQ  = data;
988
           if (cs1_ == 0 & cs0 == 1 & ce_ == 0)
989
             Dstore[addr] = data;
990
         end
991
         else
992
           DQ  = 18'hz;
993
    end
994
    else begin                                       // burst after 2nd cycle
995
        ADSP_ = 1;
996
        ADSC_ = 1;
997
        #(Tcyc/2-Tsu);
998
        GW_ = gw_;
999
        ADV_ = adv_;
1000
        DQ  = data;
1001
        if (cs1_ == 0 & cs0 == 1 & ce_ == 0)
1002
          Dstore[addr] = data;
1003
    end
1004
   @( posedge CLK );
1005
    counter = 0;
1006
    if (tempcounter == 0) begin
1007
        A <= #Tdh 19'hz;
1008
        ADSP_ <= #Tdh 1;
1009
        ADSC_ <= #Tdh 1;
1010
        OE_   <= #Tdh 1;
1011
        CE_   <= #Tdh ~ce_;
1012
        CS1_  <= #Tdh ~cs1_;
1013
        CS0   <= #Tdh ~cs0;
1014
         if (adsp_ == 0) begin                       // if adsp_ controlled
1015
           #(Tcyc - Tsu);
1016
           GW_ = gw_;
1017
           DQ = data;
1018
           ADV_ <= #(Tsu + Tdh) ~adv_;
1019
           GW_  <= #(Tsu + Tdh) ~gw_;
1020
           DQ   <= #(Tsu + Tdh) 18'hz;
1021
           if (cs1_ == 0 & cs0 == 1 & ce_ == 0)
1022
             Dstore[addr] = data;
1023
           ADV_ = adv_;
1024
        end
1025
        else if (adsp_ == 1 & adsc_ == 0) begin       // if adsc_ controlled
1026
           ADV_ <= #Tdh 1;
1027
           GW_  <= #Tdh ~gw_;
1028
           DQ   <= #Tdh 18'hz;
1029
        end
1030
        else
1031
           DQ  = 18'hz;
1032
    end
1033
    else begin                                        // burst after 2nd cycle
1034
        ADV_ <= #Tdh 1;
1035
        GW_  <= #Tdh ~gw_;
1036
        DQ   <= #Tdh 18'hz;
1037
    end
1038
end
1039
endtask
1040
 
1041
task write_random;
1042
input  [addr_msb:0] addr;
1043
input  [17:0] data;
1044
begin
1045
    if ( CLK )
1046
        @( negedge CLK );
1047
    OE_ = 1;
1048
    ADV_  = 1;
1049
    A = addr;
1050
    ADSP_ = 0;
1051
    @( negedge CLK );
1052
    ADSP_ = 1;
1053
    GW_ = 0;
1054
    #(Tcyc/2-Tsu) DQ = data;
1055
    @( posedge CLK );
1056
    #Tdh
1057
    DQ = 18'hz;
1058
    @( negedge CLK );
1059
    GW_ = 1;
1060
end
1061
endtask
1062
 
1063
task burst_write_random;
1064
input  [addr_msb:0] addr;
1065
input  [17:0] n;
1066
integer       i;
1067
begin
1068
    if ( CLK )
1069
        @( negedge CLK );
1070
    #1 A = addr;
1071
       ADSP_ = 0;
1072
    for (i=addr;i<addr+n;i=i+1) begin
1073
        @( negedge CLK );
1074
        ADSP_ = 1;
1075
        if (addr!=i) ADV_  = 0;
1076
        #(Tcyc/2-Tsu) DQ = BurstData[i];
1077
        @( posedge CLK );
1078
    end
1079
    @( negedge CLK );
1080
    ADV_  = 1;
1081
end
1082
endtask
1083
 
1084
task byte_write_random;
1085
input  [addr_msb:0] addr;
1086
input  [17:0] data;
1087
begin
1088
    if ( CLK )
1089
        @( negedge CLK );
1090
    ADV_  = 1;
1091
    A = addr;
1092
    ADSP_ = 0;
1093
    @( negedge CLK );
1094
    ADSP_ = 1;
1095
    BWE_ = 0;
1096
    #(Tcyc/2-Tsu) DQ = data;
1097
    @( posedge CLK );
1098
    #Tdh
1099
    DQ = 18'hz;
1100
    @( negedge CLK );
1101
    BWE_ = 1;
1102
end
1103
endtask
1104
 
1105
endmodule
1106
 

powered by: WebSVN 2.1.0

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