// sub4.v Verilog 4 bit adder made from fadd modules // run verilog -q -l sub4_v.out sub4.v `timescale 1ns/1ns module fadd(a, b, cin, sum, cout); // from truth table input a; // a input input b; // b input input cin; // carry-in output sum; // sum output output cout; // carry-out assign sum = (~a&~b&cin)|(~a&b&~cin)|(a&~b&~cin)|(a&b&cin); assign cout = (a&b)|(a&cin)|(b&cin); // last term redundant endmodule // fadd module add4(a, b, cin, sum, cout); // use 4 fadd input [3:0] a; input [3:0] b; input cin; output [3:0] sum; output cout; wire [3:0] c; // intermediate couts // instantiate modules fadd bit0(a[0], b[0], cin, sum[0], c[0]); fadd bit1(a[1], b[1], c[0], sum[1], c[1]); fadd bit2(a[2], b[2], c[1], sum[2], c[2]); fadd bit3(a[3], b[3], c[2], sum[3], cout); endmodule // add4 module mux4(in0, in1, ctl, result); parameter n=3; input [n:0] in0; // 0 input input [n:0] in1; // 1 input input ctl; // control output [n:0] result; // output assign result = (ctl==0) ? in0 : in1; endmodule // mux4 module sub4; // test bench // signals used in test bench (the interconnections) reg [3:0] a; reg cin; wire [3:0] sum; wire cout; reg subtract; reg [3:0]in0; reg [3:0]in1; reg ctl; wire [3:0]b; // instantiate modules with signal names to be used mux4 pass(in0, in1, ctl, b); add4 bits(a, b, cin, sum, cout); always begin $display("sub4.v running"); a = 4'b1011; in0 = 4'b1000; cin = 1; subtract = 0; in1 = ~in0; ctl = subtract; $display("add"); #5 $display("a=%b, b=%b, cin=%b, sum=%b, cout=%b", a, b, cin, sum, cout); $display("in0=%b, in1=%b, ctl=%b, b=%b", in0, in1, ctl, b); subtract = 1; ctl = subtract; $display("subtract"); #5 $display("a=%b, b=%b, cin=%b, sum=%b, cout=%b", a, b, cin, sum, cout); $display("in0=%b, in1=%b, ctl=%b, b=%b", in0, in1, ctl, b); a = 4'b0000; in0 = 4'b0000; cin = 0; subtract = 0; in1 = ~in0; ctl = subtract; $display("add"); #5 $display("a=%b, b=%b, cin=%b, sum=%b, cout=%b", a, b, cin, sum, cout); $display("in0=%b, in1=%b, ctl=%b, b=%b", in0, in1, ctl, b); subtract = 1; ctl = subtract; $display("subtract"); #5 $display("a=%b, b=%b, cin=%b, sum=%b, cout=%b", a, b, cin, sum, cout); $display("in0=%b, in1=%b, ctl=%b, b=%b", in0, in1, ctl, b); a = 4'b1111; in0 = 4'b1111; cin = 1; subtract = 0; in1 = ~in0; ctl = subtract; $display("add"); #5 $display("a=%b, b=%b, cin=%b, sum=%b, cout=%b", a, b, cin, sum, cout); $display("in0=%b, in1=%b, ctl=%b, b=%b", in0, in1, ctl, b); subtract = 1; ctl = subtract; $display("subtract"); #5 $display("a=%b, b=%b, cin=%b, sum=%b, cout=%b", a, b, cin, sum, cout); $display("in0=%b, in1=%b, ctl=%b, b=%b", in0, in1, ctl, b); $finish; end endmodule // sub4