| `timescale 1ns / 1ps |
| |
| module testbench; |
| |
| parameter SIZEIN = 16, SIZEOUT = 40; |
| reg clk, ce, rst; |
| reg signed [SIZEIN-1:0] a, b; |
| output signed [SIZEOUT-1:0] REF_accum_out, accum_out; |
| output REF_overflow, overflow; |
| |
| integer errcount = 0; |
| |
| reg ERROR_FLAG = 0; |
| |
| task clkcycle; |
| begin |
| #5; |
| clk = ~clk; |
| #10; |
| clk = ~clk; |
| #2; |
| ERROR_FLAG = 0; |
| if (REF_accum_out !== accum_out) begin |
| $display("ERROR at %1t: REF_accum_out=%b UUT_accum_out=%b DIFF=%b", $time, REF_accum_out, accum_out, REF_accum_out ^ accum_out); |
| errcount = errcount + 1; |
| ERROR_FLAG = 1; |
| end |
| if (REF_overflow !== overflow) begin |
| $display("ERROR at %1t: REF_overflow=%b UUT_overflow=%b DIFF=%b", $time, REF_overflow, overflow, REF_overflow ^ overflow); |
| errcount = errcount + 1; |
| ERROR_FLAG = 1; |
| end |
| #3; |
| end |
| endtask |
| |
| initial begin |
| //$dumpfile("test_macc.vcd"); |
| //$dumpvars(0, testbench); |
| |
| #2; |
| clk = 1'b0; |
| ce = 1'b0; |
| a = 0; |
| b = 0; |
| |
| rst = 1'b1; |
| repeat (10) begin |
| #10; |
| clk = 1'b1; |
| #10; |
| clk = 1'b0; |
| #10; |
| clk = 1'b1; |
| #10; |
| clk = 1'b0; |
| end |
| rst = 1'b0; |
| |
| repeat (10000) begin |
| clkcycle; |
| ce = 1; //$urandom & $urandom; |
| //rst = $urandom & $urandom & $urandom & $urandom & $urandom & $urandom; |
| a = $urandom & ~(1 << (SIZEIN-1)); |
| b = $urandom & ~(1 << (SIZEIN-1)); |
| end |
| |
| if (errcount == 0) begin |
| $display("All tests passed."); |
| $finish; |
| end else begin |
| $display("Caught %1d errors.", errcount); |
| $stop; |
| end |
| end |
| |
| macc2 ref ( |
| .clk(clk), |
| .ce(ce), |
| .rst(rst), |
| .a(a), |
| .b(b), |
| .accum_out(REF_accum_out), |
| .overflow(REF_overflow) |
| ); |
| |
| macc2_uut uut ( |
| .clk(clk), |
| .ce(ce), |
| .rst(rst), |
| .a(a), |
| .b(b), |
| .accum_out(accum_out), |
| .overflow(overflow) |
| ); |
| endmodule |