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 |