`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