cvw/examples/verilog/fulladder/fulladder.sv
2022-01-06 18:22:30 +00:00

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