Mirror of my github hw-experiments repository

fifo_tb.v 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. `timescale 100ps/1ps
  2. module fifo_tb;
  3. reg reset_n;
  4. reg [15:0] data_in;
  5. wire [15:0] data_out;
  6. wire full, empty;
  7. reg fifo_push, fifo_pop, clk;
  8. simple_fifo dut (
  9. .clk(clk),
  10. .reset_n(reset_n),
  11. .push(fifo_push),
  12. .pop(fifo_pop),
  13. .data_in(data_in),
  14. .data_out(data_out),
  15. .full(full),
  16. .empty(empty)
  17. );
  18. initial begin
  19. clk = 1'b0;
  20. reset_n = 1'b0;
  21. repeat(4) #10 clk = ~clk;
  22. reset_n = 1'b1;
  23. forever #10 clk = ~clk; // generate a clock
  24. end
  25. reg [15:0] tmp;
  26. initial begin
  27. data_in = 16'h0; // initial value
  28. fifo_push = 1'b0;
  29. fifo_pop = 1'b0;
  30. @(posedge reset_n); // wait for reset
  31. data_in = 16'hffff;
  32. repeat (8) begin
  33. @(posedge clk);
  34. fifo_push = 1'b1;
  35. @(negedge clk);
  36. fifo_push = 1'b0;
  37. data_in = ~data_in;
  38. end
  39. if (full != 1 && empty != 0) begin
  40. $display("Test failed!");
  41. end
  42. tmp = 16'hffff;
  43. repeat (8) begin
  44. @(posedge clk);
  45. fifo_pop = 1'b1;
  46. @(negedge clk);
  47. fifo_pop = 1'b0;
  48. if (data_out !== tmp) begin
  49. $display("Test failed!");
  50. end
  51. tmp = ~tmp;
  52. end
  53. if (full != 0 && empty != 1) begin
  54. $display("Test failed!");
  55. end
  56. repeat(5) @(posedge clk); //if this delay is odd it fails wtf?
  57. data_in = 16'h1234;
  58. repeat (8) begin
  59. @(posedge clk);
  60. fifo_push = 1'b1;
  61. @(negedge clk);
  62. fifo_push = 1'b0;
  63. data_in = ~data_in;
  64. end
  65. if (full != 1 && empty != 0) begin
  66. $display("Test failed!");
  67. end
  68. tmp = 16'h1234;
  69. repeat (8) begin
  70. @(posedge clk);
  71. fifo_pop = 1'b1;
  72. @(negedge clk);
  73. fifo_pop = 1'b0;
  74. if (data_out !== tmp) begin
  75. $display("Test failed!");
  76. end
  77. tmp = ~tmp;
  78. end
  79. if (full != 0 && empty != 1) begin
  80. $display("Test failed!");
  81. end
  82. $finish;
  83. end
  84. initial begin
  85. if ($test$plusargs("waves=1") != 0) begin
  86. $dumpfile("out/waves.vcd");
  87. $dumpvars(0, fifo_tb);
  88. if ($test$plusargs("dump_fifo=1") != 0) begin
  89. $dumpvars(0, dut.data[0]);
  90. $dumpvars(0, dut.data[1]);
  91. $dumpvars(0, dut.data[2]);
  92. $dumpvars(0, dut.data[3]);
  93. $dumpvars(0, dut.data[4]);
  94. $dumpvars(0, dut.data[5]);
  95. $dumpvars(0, dut.data[6]);
  96. $dumpvars(0, dut.data[7]);
  97. end
  98. end
  99. end
  100. endmodule