mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Systemverilog
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Systemverilog
		
	
	
	
	
	
module testbench();
 | 
						|
  logic        clk, reset;
 | 
						|
  logic        a, b, c, s, cout, sexpected, coutexpected;
 | 
						|
  logic [31:0] vectornum, errors;
 | 
						|
  logic [4:0]  testvectors[10000:0];
 | 
						|
 | 
						|
  // instantiate device under test
 | 
						|
  fulladder dut(a, b, c, s, cout);
 | 
						|
 | 
						|
  // generate clock
 | 
						|
  always 
 | 
						|
    begin
 | 
						|
      clk = 1; #5; clk = 0; #5;
 | 
						|
    end
 | 
						|
 | 
						|
  // at start of test, load vectors and pulse reset
 | 
						|
  initial
 | 
						|
    begin
 | 
						|
      $readmemb("fulladder.tv", testvectors);
 | 
						|
      vectornum = 0; errors = 0;
 | 
						|
      reset = 1; #22; reset = 0;
 | 
						|
    end
 | 
						|
 | 
						|
  // apply test vectors on rising edge of clk
 | 
						|
  always @(posedge clk)
 | 
						|
    begin
 | 
						|
      #1; {a, b, c, coutexpected, sexpected} = testvectors[vectornum];
 | 
						|
    end
 | 
						|
 | 
						|
  // check results on falling edge of clk
 | 
						|
  always @(negedge clk)
 | 
						|
    if (~reset) begin // skip during reset
 | 
						|
      if (s !== sexpected | cout !== coutexpected) begin  // check result
 | 
						|
        $display("Error: inputs = %b", {a, b, c});
 | 
						|
        $display("  outputs cout s = %b%b (%b%b expected)",cout, s, coutexpected, sexpected);
 | 
						|
        errors = errors + 1;
 | 
						|
      end
 | 
						|
      vectornum = vectornum + 1;
 | 
						|
      if (testvectors[vectornum] === 5'bx) begin 
 | 
						|
        $display("%d tests completed with %d errors", 
 | 
						|
	           vectornum, errors);
 | 
						|
        $stop;
 | 
						|
      end
 | 
						|
    end
 | 
						|
endmodule
 | 
						|
 | 
						|
module fulladder(input  logic a, b, c,
 | 
						|
                 output logic s, cout);
 | 
						|
 | 
						|
  assign s = a ^ b ^ c;
 | 
						|
  assign cout = (a & b) | (a & c) | (b & c); 
 | 
						|
endmodule
 |