Statistics
| Branch: | Tag: | Revision:

root / usrp2 / extramfifo / ext_fifo_tb.v @ f18bf439

History | View | Annotate | Download (9.05 KB)

1
`timescale 1ns / 1ps
2
`define INT_WIDTH 36
3
`define EXT_WIDTH 18
4
`define RAM_DEPTH 19
5
`define FIFO_DEPTH 8
6
`define DUMP_VCD_FULL
7

    
8
module ext_fifo_tb();
9

    
10
   
11
   reg int_clk;
12
   reg ext_clk;
13
   reg rst;
14
   
15

    
16

    
17
   wire [`EXT_WIDTH-1:0] RAM_D_pi;
18
   wire [`EXT_WIDTH-1:0] RAM_D_po;
19
   wire [`EXT_WIDTH-1:0] RAM_D;
20
   wire 		RAM_D_poe;
21
   wire [`RAM_DEPTH-1:0] 	RAM_A;
22
   wire 		RAM_WEn;
23
   wire 		RAM_CENn;
24
   wire 		RAM_LDn;
25
   wire 		RAM_OEn;
26
   wire 		RAM_CE1n;
27
   reg [`INT_WIDTH-1:0] datain;
28
   reg 			src_rdy_i;                // WRITE
29
   wire 		dst_rdy_o;               // not FULL
30
   wire [`INT_WIDTH-1:0] dataout;
31
   reg [`INT_WIDTH-1:0]  ref_dataout;
32
   wire 		src_rdy_o;               // not EMPTY
33
   reg 			dst_rdy_i;
34
   integer 		ether_frame;
35
   
36

    
37
   // Clocks
38
   // Int clock is 100MHz
39
   // Ext clock is 125MHz
40
   initial 
41
     begin
42
	int_clk <= 0;
43
	ext_clk <= 0;
44
	ref_dataout <= 1;
45
	src_rdy_i <= 0;
46
	dst_rdy_i <= 0;
47
     end
48

    
49
   always
50
     #5 int_clk <= ~int_clk;
51

    
52
   always
53
     #4 ext_clk <= ~ext_clk;
54

    
55
   initial
56
     begin
57
	datain <= 0;
58
	ether_frame <= 0;
59
	
60
	rst <= 1;
61
	repeat (5) @(negedge int_clk);
62
	rst <= 0;
63
	@(negedge int_clk);
64
	while (datain < 10000)
65
	  begin
66
	     @(negedge int_clk);
67
	     datain <= datain + dst_rdy_o;
68
	     src_rdy_i <= dst_rdy_o;
69
	     // Simulate inter-frame time	     
70
	     if (ether_frame == 1500)
71
	       begin
72
		  ether_frame <= 0;
73
		  repeat(1600)
74
		    begin
75
		       @(negedge int_clk);
76
		       src_rdy_i <= 0;
77
		    end
78
	       end
79
	     else
80
	       ether_frame <= ether_frame + dst_rdy_o;
81
	  end
82
     end // initial begin
83

    
84
   
85
   initial
86
     begin
87
	repeat (5) @(negedge int_clk);
88
	dst_rdy_i <= 1;
89

    
90
	while (src_rdy_o !== 1)
91
	  @(negedge int_clk);
92
	  
93
	// Fall through fifo, first output already valid
94
	if (dataout !== ref_dataout)
95
	  $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
96
	ref_dataout <= ref_dataout + src_rdy_o ;
97
	
98
	// Decimate by 16 rate
99
	while (ref_dataout < 2000)
100
	  begin
101
	     @(negedge int_clk);
102
	     ref_dataout <= ref_dataout + src_rdy_o ;
103
	     dst_rdy_i <= src_rdy_o;
104
	     if ((dataout !== ref_dataout) && src_rdy_o)
105
	       $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
106
	     @(negedge int_clk);
107
	     dst_rdy_i <= 0;
108
	     repeat(14) @(negedge int_clk);
109
	  end // while (ref_dataout < 10000)
110
	// Decimate by 8 rate
111
	while (ref_dataout < 4000)
112
	  begin
113
	     @(negedge int_clk);
114
	     ref_dataout <= ref_dataout + src_rdy_o ;
115
	     dst_rdy_i <= src_rdy_o;
116
	     if ((dataout !== ref_dataout) && src_rdy_o)
117
	       $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
118
	     @(negedge int_clk);
119
	     dst_rdy_i <= 0;
120
	     repeat(6) @(negedge int_clk);
121
	  end // while (ref_dataout < 10000)
122
	// Decimate by 4 rate
123
	while (ref_dataout < 6000)
124
	  begin
125
	     @(negedge int_clk);
126
	     ref_dataout <= ref_dataout + src_rdy_o ;
127
	     dst_rdy_i <= src_rdy_o;
128
	     if ((dataout !== ref_dataout) && src_rdy_o)
129
	       $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
130
	     @(negedge int_clk);
131
	     dst_rdy_i <= 0;
132
	     repeat(2) @(negedge int_clk);
133
	  end // while (ref_dataout < 10000)
134
	// Max rate
135
	while (ref_dataout < 10000)
136
	  begin
137
	     @(negedge int_clk);
138
	     ref_dataout <= ref_dataout + src_rdy_o ;
139
	     dst_rdy_i <= src_rdy_o;
140
	     if ((dataout !== ref_dataout) && src_rdy_o)
141
	       $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
142
	     
143
	  end // while (ref_dataout < 10000)
144
	
145
	 @(negedge int_clk);
146
	$finish;
147
	
148
     end
149
   
150

    
151
/* -----\/----- EXCLUDED -----\/-----
152
 
153
   initial
154
     begin
155
	rst <= 1;
156
	repeat (5) @(negedge int_clk);
157
	rst <= 0;
158
	@(negedge int_clk);
159
	repeat (4000)
160
	  begin
161
	     @(negedge int_clk);
162
	     datain <= datain + dst_rdy_o;
163
	     src_rdy_i <= dst_rdy_o;
164
//	     @(negedge int_clk);
165
//	     src_rdy_i <= 0;
166
//	     @(negedge int_clk);
167
//	     dst_rdy_i <= src_rdy_o;
168
//	     @(negedge int_clk);
169
//	     dst_rdy_i <= 0;
170
//	     repeat (2) @(negedge int_clk);
171
	  end // repeat (1000)
172
	// Fall through fifo, first output already valid
173
	if (dataout !== ref_dataout)
174
	  $display("Error: Expected %x, got %x",ref_dataout, dataout);
175
	repeat (1000)
176
	  begin
177
	     @(negedge int_clk);
178
	     datain <= datain + dst_rdy_o ;
179
	     src_rdy_i <= dst_rdy_o;
180
	     @(negedge int_clk);
181
	     src_rdy_i <= 0;
182
	     @(negedge int_clk);
183
	     ref_dataout <= ref_dataout + src_rdy_o ;
184
	     dst_rdy_i <= src_rdy_o;
185
	     if ((dataout !== ref_dataout) && src_rdy_o)
186
	       $display("Error: Expected %x, got %x",ref_dataout, dataout);
187
	     @(negedge int_clk);
188
	     dst_rdy_i <= 0;
189
//	     repeat (2) @(negedge int_clk);
190
	  end // repeat (1000)
191
	repeat (1000)
192
	  begin
193
//	     @(negedge int_clk);
194
//	     datain <= datain + 1;
195
//	     src_rdy_i <= 1;
196
//	     @(negedge int_clk);
197
//	     src_rdy_i <= 0;
198
	     @(negedge int_clk);
199
	     ref_dataout <= ref_dataout + src_rdy_o;
200
	     dst_rdy_i <= src_rdy_o;
201
	     if ((dataout !== ref_dataout) && src_rdy_o)
202
	       $display("Error: Expected %x, got %x",ref_dataout, dataout);
203
	     @(negedge int_clk);
204
	     dst_rdy_i <= 0;
205
//	     repeat (2) @(negedge int_clk);
206
	  end // repeat (1000)
207
	
208
	$finish;
209
	
210
     end // initial begin
211

    
212

    
213
 -----/\----- EXCLUDED -----/\----- */
214
   ///////////////////////////////////////////////////////////////////////////////////
215
   // Simulation control                                                            //
216
   ///////////////////////////////////////////////////////////////////////////////////
217
   `ifdef DUMP_LX2_TOP
218
   // Set up output files
219
   initial begin
220
      $dumpfile("ext_fifo_tb.lx2");
221
      $dumpvars(1,ext_fifo_tb);
222
   end
223
   `endif
224

    
225
   `ifdef DUMP_LX2_FULL
226
   // Set up output files
227
   initial begin
228
      $dumpfile("ext_fifo_tb.lx2");
229
      $dumpvars(0,ext_fifo_tb);
230
   end
231
   `endif
232

    
233
   `ifdef DUMP_VCD_TOP
234
   // Set up output files
235
   initial begin
236
      $dumpfile("ext_fifo_tb.vcd");
237
      $dumpvars(1,ext_fifo_tb);
238
   end
239
   `endif
240

    
241
   `ifdef DUMP_VCD_TOP_PLUS_NEXT
242
   // Set up output files
243
   initial begin
244
      $dumpfile("ext_fifo_tb.vcd");
245
      $dumpvars(2,ext_fifo_tb);
246
   end
247
   `endif
248

    
249
   
250
   `ifdef DUMP_VCD_FULL
251
   // Set up output files
252
   initial begin
253
      $dumpfile("ext_fifo_tb.vcd");
254
      $dumpvars(0,ext_fifo_tb);
255
   end
256
   `endif
257

    
258
   // Update display every 10 us
259
   always #10000 $monitor("Time in uS ",$time/1000);
260

    
261
   wire [`EXT_WIDTH-1:0] RAM_D_pi_ext;
262
   wire [`EXT_WIDTH-1:0] RAM_D_po_ext;
263
   wire [`EXT_WIDTH-1:0] RAM_D_ext;
264
   wire 		 RAM_D_poe_ext;
265
   
266
   genvar      i;
267

    
268
   //
269
   // Instantiate IO for Bidirectional bus to SRAM
270
   //
271
   
272
   generate  
273
      for (i=0;i<18;i=i+1)
274
        begin : gen_RAM_D_IO
275

    
276
	   IOBUF #(
277
		   .DRIVE(12),
278
		   .IOSTANDARD("LVCMOS25"),
279
		   .SLEW("FAST")
280
		   )
281
	     RAM_D_i (
282
		      .O(RAM_D_pi_ext[i]),
283
		      .I(RAM_D_po_ext[i]),
284
		      .IO(RAM_D[i]),
285
		      .T(RAM_D_poe_ext)
286
		      );
287
	end // block: gen_RAM_D_IO
288
      
289
   endgenerate
290

    
291
   wire [`RAM_DEPTH-1:0] 	RAM_A_ext;
292
   wire 		RAM_WEn_ext,RAM_LDn_ext,RAM_CE1n_ext,RAM_OEn_ext,RAM_CENn_ext;
293

    
294
   assign 		#1 RAM_D_pi = RAM_D_pi_ext;
295
   
296
   assign 		#1 RAM_D_po_ext = RAM_D_po;
297

    
298
   assign 		#1 RAM_D_poe_ext = RAM_D_poe;
299
   
300
   assign 		#2 RAM_WEn_ext = RAM_WEn;
301
   
302
   assign 		#2 RAM_LDn_ext = RAM_LDn;
303
   
304
   assign 		#2 RAM_CE1n_ext = RAM_CE1n;
305
   
306
   assign 		#2 RAM_OEn_ext = RAM_OEn;
307
   
308
   assign 		#2 RAM_CENn_ext = RAM_CENn;
309

    
310
   assign 		#2 RAM_A_ext = RAM_A;
311
   
312
 
313
   
314
   idt71v65603s150  idt71v65603s150_i1
315
     (
316
      .A(RAM_A_ext[17:0]),
317
      .adv_ld_(RAM_LDn_ext),                  // advance (high) / load (low)
318
      .bw1_(1'b0), 
319
      .bw2_(1'b0), 
320
      .bw3_(1'b1), 
321
      .bw4_(1'b1),   // byte write enables (low)
322
      .ce1_(RAM_CE1n_ext), 
323
      .ce2(1'b1), 
324
      .ce2_(1'b0),          // chip enables
325
      .cen_(RAM_CENn_ext),                     // clock enable (low)
326
      .clk(ext_clk),                      // clock
327
      .IO({RAM_D[16:9],RAM_D[7:0]}), 
328
      .IOP({RAM_D[17],RAM_D[8]}),                  // data bus
329
      .lbo_(1'b0),                     // linear burst order (low)
330
      .oe_(RAM_OEn_ext),                      // output enable (low)
331
      .r_w_(RAM_WEn_ext)
332
      );                    // read (high) / write (low)
333
 
334
/* -----\/----- EXCLUDED -----\/-----
335

    
336
	 
337
   cy1356 cy1356_i1
338
     ( .d(RAM_D),
339
       .clk(ext_clk), 
340
       .a(RAM_A_ext), 
341
       .bws(2'b00), 
342
       .we_b(RAM_WEn_ext), 
343
       .adv_lb(RAM_LDn_ext), 
344
       .ce1b(RAM_CE1n_ext), 
345
       .ce2(1'b1), 
346
       .ce3b(1'b0), 
347
       .oeb(RAM_OEn_ext), 
348
       .cenb(RAM_CENn_ext),
349
       .mode(1'b0)
350
       );
351
 -----/\----- EXCLUDED -----/\----- */
352

    
353
   
354
   ext_fifo
355
     #(.INT_WIDTH(`INT_WIDTH),.EXT_WIDTH(`EXT_WIDTH),.RAM_DEPTH(`RAM_DEPTH),.FIFO_DEPTH(`FIFO_DEPTH))
356
       ext_fifo_i1
357
	 (
358
	  .int_clk(int_clk),
359
	  .ext_clk(ext_clk),
360
	  .rst(rst),
361
	  .RAM_D_pi(RAM_D_pi),
362
	  .RAM_D_po(RAM_D_po),
363
	  .RAM_D_poe(RAM_D_poe),
364
	  .RAM_A(RAM_A),
365
	  .RAM_WEn(RAM_WEn),
366
	  .RAM_CENn(RAM_CENn),
367
	  .RAM_LDn(RAM_LDn),
368
	  .RAM_OEn(RAM_OEn),
369
	  .RAM_CE1n(RAM_CE1n),
370
	  .datain(datain),
371
	  .src_rdy_i(src_rdy_i),                // WRITE
372
	  .dst_rdy_o(dst_rdy_o),               // not FULL
373
	  .dataout(dataout),
374
	  .src_rdy_o(src_rdy_o),               // not EMPTY
375
	  .dst_rdy_i(dst_rdy_i)
376
	  );
377

    
378
endmodule // ext_fifo_tb