mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
`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
 |