Skip to content

Instantly share code, notes, and snippets.

@jeongukjae
Created May 30, 2018 02:22
Show Gist options
  • Save jeongukjae/eaf464ca0b11aab07d42d19bd283abc2 to your computer and use it in GitHub Desktop.
Save jeongukjae/eaf464ca0b11aab07d42d19bd283abc2 to your computer and use it in GitHub Desktop.
4 bit Ripple Carry Adder using Verilog
module full_adder(in0, in1, cin, out, cout);
input in0, in1, cin;
output out, cout;
assign out = in0 ^ in1 ^ cin;
assign cout = ((in0 ^ in1) & cin) | (in0 & in1);
endmodule
module ripple_carry_adder(in0, in1, out, cout);
input [3:0] in0;
input [3:0] in1;
output [3:0] out;
output cout;
wire c1, c2, c3;
full_adder fa0(in0[0], in1[0], 0, out[0], c1);
full_adder fa1(in0[1], in1[1], c1, out[1], c2);
full_adder fa2(in0[2], in1[2], c2, out[2], c3);
full_adder fa3(in0[3], in1[3], c3, out[3], cout);
endmodule
module ripple_carry_adder_tb;
reg [3:0] in0;
reg [3:0] in1;
wire [3:0] out;
wire cout;
ripple_carry_adder rca(.in0(in0), .in1(in1), .out(out), .cout(cout));
initial begin
in0 = 4'b0000; in1 = 4'b0000; #10
in0 = 4'b0000; in1 = 4'b0001; #10
in0 = 4'b0000; in1 = 4'b0010; #10
in0 = 4'b0000; in1 = 4'b0011; #10
in0 = 4'b0000; in1 = 4'b0100; #10
in0 = 4'b0000; in1 = 4'b0101; #10
in0 = 4'b0000; in1 = 4'b0110; #10
in0 = 4'b0000; in1 = 4'b0111; #10
in0 = 4'b0000; in1 = 4'b1000; #10
in0 = 4'b0000; in1 = 4'b1001; #10
in0 = 4'b0000; in1 = 4'b1010; #10
in0 = 4'b0000; in1 = 4'b1011; #10
in0 = 4'b0000; in1 = 4'b1100; #10
in0 = 4'b0000; in1 = 4'b1101; #10
in0 = 4'b0000; in1 = 4'b1110; #10
in0 = 4'b0000; in1 = 4'b1111; #10
in0 = 4'b0001; in1 = 4'b0000; #10
in0 = 4'b0001; in1 = 4'b0001; #10
in0 = 4'b0001; in1 = 4'b0010; #10
in0 = 4'b0001; in1 = 4'b0011; #10
in0 = 4'b0001; in1 = 4'b0100; #10
in0 = 4'b0001; in1 = 4'b0101; #10
in0 = 4'b0001; in1 = 4'b0110; #10
in0 = 4'b0001; in1 = 4'b0111; #10
in0 = 4'b0001; in1 = 4'b1000; #10
in0 = 4'b0001; in1 = 4'b1001; #10
in0 = 4'b0001; in1 = 4'b1010; #10
in0 = 4'b0001; in1 = 4'b1011; #10
in0 = 4'b0001; in1 = 4'b1100; #10
in0 = 4'b0001; in1 = 4'b1101; #10
in0 = 4'b0001; in1 = 4'b1110; #10
in0 = 4'b0001; in1 = 4'b1111; #10
in0 = 4'b0010; in1 = 4'b0000; #10
in0 = 4'b0010; in1 = 4'b0001; #10
in0 = 4'b0010; in1 = 4'b0010; #10
in0 = 4'b0010; in1 = 4'b0011; #10
in0 = 4'b0010; in1 = 4'b0100; #10
in0 = 4'b0010; in1 = 4'b0101; #10
in0 = 4'b0010; in1 = 4'b0110; #10
in0 = 4'b0010; in1 = 4'b0111; #10
in0 = 4'b0010; in1 = 4'b1000; #10
in0 = 4'b0010; in1 = 4'b1001; #10
in0 = 4'b0010; in1 = 4'b1010; #10
in0 = 4'b0010; in1 = 4'b1011; #10
in0 = 4'b0010; in1 = 4'b1100; #10
in0 = 4'b0010; in1 = 4'b1101; #10
in0 = 4'b0010; in1 = 4'b1110; #10
in0 = 4'b0010; in1 = 4'b1111; #10
in0 = 4'b0011; in1 = 4'b0000; #10
in0 = 4'b0011; in1 = 4'b0001; #10
in0 = 4'b0011; in1 = 4'b0010; #10
in0 = 4'b0011; in1 = 4'b0011; #10
in0 = 4'b0011; in1 = 4'b0100; #10
in0 = 4'b0011; in1 = 4'b0101; #10
in0 = 4'b0011; in1 = 4'b0110; #10
in0 = 4'b0011; in1 = 4'b0111; #10
in0 = 4'b0011; in1 = 4'b1000; #10
in0 = 4'b0011; in1 = 4'b1001; #10
in0 = 4'b0011; in1 = 4'b1010; #10
in0 = 4'b0011; in1 = 4'b1011; #10
in0 = 4'b0011; in1 = 4'b1100; #10
in0 = 4'b0011; in1 = 4'b1101; #10
in0 = 4'b0011; in1 = 4'b1110; #10
in0 = 4'b0011; in1 = 4'b1111; #10
in0 = 4'b0100; in1 = 4'b0000; #10
in0 = 4'b0100; in1 = 4'b0001; #10
in0 = 4'b0100; in1 = 4'b0010; #10
in0 = 4'b0100; in1 = 4'b0011; #10
in0 = 4'b0100; in1 = 4'b0100; #10
in0 = 4'b0100; in1 = 4'b0101; #10
in0 = 4'b0100; in1 = 4'b0110; #10
in0 = 4'b0100; in1 = 4'b0111; #10
in0 = 4'b0100; in1 = 4'b1000; #10
in0 = 4'b0100; in1 = 4'b1001; #10
in0 = 4'b0100; in1 = 4'b1010; #10
in0 = 4'b0100; in1 = 4'b1011; #10
in0 = 4'b0100; in1 = 4'b1100; #10
in0 = 4'b0100; in1 = 4'b1101; #10
in0 = 4'b0100; in1 = 4'b1110; #10
in0 = 4'b0100; in1 = 4'b1111; #10
in0 = 4'b0101; in1 = 4'b0000; #10
in0 = 4'b0101; in1 = 4'b0001; #10
in0 = 4'b0101; in1 = 4'b0010; #10
in0 = 4'b0101; in1 = 4'b0011; #10
in0 = 4'b0101; in1 = 4'b0100; #10
in0 = 4'b0101; in1 = 4'b0101; #10
in0 = 4'b0101; in1 = 4'b0110; #10
in0 = 4'b0101; in1 = 4'b0111; #10
in0 = 4'b0101; in1 = 4'b1000; #10
in0 = 4'b0101; in1 = 4'b1001; #10
in0 = 4'b0101; in1 = 4'b1010; #10
in0 = 4'b0101; in1 = 4'b1011; #10
in0 = 4'b0101; in1 = 4'b1100; #10
in0 = 4'b0101; in1 = 4'b1101; #10
in0 = 4'b0101; in1 = 4'b1110; #10
in0 = 4'b0101; in1 = 4'b1111; #10
in0 = 4'b0110; in1 = 4'b0000; #10
in0 = 4'b0110; in1 = 4'b0001; #10
in0 = 4'b0110; in1 = 4'b0010; #10
in0 = 4'b0110; in1 = 4'b0011; #10
in0 = 4'b0110; in1 = 4'b0100; #10
in0 = 4'b0110; in1 = 4'b0101; #10
in0 = 4'b0110; in1 = 4'b0110; #10
in0 = 4'b0110; in1 = 4'b0111; #10
in0 = 4'b0110; in1 = 4'b1000; #10
in0 = 4'b0110; in1 = 4'b1001; #10
in0 = 4'b0110; in1 = 4'b1010; #10
in0 = 4'b0110; in1 = 4'b1011; #10
in0 = 4'b0110; in1 = 4'b1100; #10
in0 = 4'b0110; in1 = 4'b1101; #10
in0 = 4'b0110; in1 = 4'b1110; #10
in0 = 4'b0110; in1 = 4'b1111; #10
in0 = 4'b0111; in1 = 4'b0000; #10
in0 = 4'b0111; in1 = 4'b0001; #10
in0 = 4'b0111; in1 = 4'b0010; #10
in0 = 4'b0111; in1 = 4'b0011; #10
in0 = 4'b0111; in1 = 4'b0100; #10
in0 = 4'b0111; in1 = 4'b0101; #10
in0 = 4'b0111; in1 = 4'b0110; #10
in0 = 4'b0111; in1 = 4'b0111; #10
in0 = 4'b0111; in1 = 4'b1000; #10
in0 = 4'b0111; in1 = 4'b1001; #10
in0 = 4'b0111; in1 = 4'b1010; #10
in0 = 4'b0111; in1 = 4'b1011; #10
in0 = 4'b0111; in1 = 4'b1100; #10
in0 = 4'b0111; in1 = 4'b1101; #10
in0 = 4'b0111; in1 = 4'b1110; #10
in0 = 4'b0111; in1 = 4'b1111; #10
in0 = 4'b1000; in1 = 4'b0000; #10
in0 = 4'b1000; in1 = 4'b0001; #10
in0 = 4'b1000; in1 = 4'b0010; #10
in0 = 4'b1000; in1 = 4'b0011; #10
in0 = 4'b1000; in1 = 4'b0100; #10
in0 = 4'b1000; in1 = 4'b0101; #10
in0 = 4'b1000; in1 = 4'b0110; #10
in0 = 4'b1000; in1 = 4'b0111; #10
in0 = 4'b1000; in1 = 4'b1000; #10
in0 = 4'b1000; in1 = 4'b1001; #10
in0 = 4'b1000; in1 = 4'b1010; #10
in0 = 4'b1000; in1 = 4'b1011; #10
in0 = 4'b1000; in1 = 4'b1100; #10
in0 = 4'b1000; in1 = 4'b1101; #10
in0 = 4'b1000; in1 = 4'b1110; #10
in0 = 4'b1000; in1 = 4'b1111; #10
in0 = 4'b1001; in1 = 4'b0000; #10
in0 = 4'b1001; in1 = 4'b0001; #10
in0 = 4'b1001; in1 = 4'b0010; #10
in0 = 4'b1001; in1 = 4'b0011; #10
in0 = 4'b1001; in1 = 4'b0100; #10
in0 = 4'b1001; in1 = 4'b0101; #10
in0 = 4'b1001; in1 = 4'b0110; #10
in0 = 4'b1001; in1 = 4'b0111; #10
in0 = 4'b1001; in1 = 4'b1000; #10
in0 = 4'b1001; in1 = 4'b1001; #10
in0 = 4'b1001; in1 = 4'b1010; #10
in0 = 4'b1001; in1 = 4'b1011; #10
in0 = 4'b1001; in1 = 4'b1100; #10
in0 = 4'b1001; in1 = 4'b1101; #10
in0 = 4'b1001; in1 = 4'b1110; #10
in0 = 4'b1001; in1 = 4'b1111; #10
in0 = 4'b1010; in1 = 4'b0000; #10
in0 = 4'b1010; in1 = 4'b0001; #10
in0 = 4'b1010; in1 = 4'b0010; #10
in0 = 4'b1010; in1 = 4'b0011; #10
in0 = 4'b1010; in1 = 4'b0100; #10
in0 = 4'b1010; in1 = 4'b0101; #10
in0 = 4'b1010; in1 = 4'b0110; #10
in0 = 4'b1010; in1 = 4'b0111; #10
in0 = 4'b1010; in1 = 4'b1000; #10
in0 = 4'b1010; in1 = 4'b1001; #10
in0 = 4'b1010; in1 = 4'b1010; #10
in0 = 4'b1010; in1 = 4'b1011; #10
in0 = 4'b1010; in1 = 4'b1100; #10
in0 = 4'b1010; in1 = 4'b1101; #10
in0 = 4'b1010; in1 = 4'b1110; #10
in0 = 4'b1010; in1 = 4'b1111; #10
in0 = 4'b1011; in1 = 4'b0000; #10
in0 = 4'b1011; in1 = 4'b0001; #10
in0 = 4'b1011; in1 = 4'b0010; #10
in0 = 4'b1011; in1 = 4'b0011; #10
in0 = 4'b1011; in1 = 4'b0100; #10
in0 = 4'b1011; in1 = 4'b0101; #10
in0 = 4'b1011; in1 = 4'b0110; #10
in0 = 4'b1011; in1 = 4'b0111; #10
in0 = 4'b1011; in1 = 4'b1000; #10
in0 = 4'b1011; in1 = 4'b1001; #10
in0 = 4'b1011; in1 = 4'b1010; #10
in0 = 4'b1011; in1 = 4'b1011; #10
in0 = 4'b1011; in1 = 4'b1100; #10
in0 = 4'b1011; in1 = 4'b1101; #10
in0 = 4'b1011; in1 = 4'b1110; #10
in0 = 4'b1011; in1 = 4'b1111; #10
in0 = 4'b1100; in1 = 4'b0000; #10
in0 = 4'b1100; in1 = 4'b0001; #10
in0 = 4'b1100; in1 = 4'b0010; #10
in0 = 4'b1100; in1 = 4'b0011; #10
in0 = 4'b1100; in1 = 4'b0100; #10
in0 = 4'b1100; in1 = 4'b0101; #10
in0 = 4'b1100; in1 = 4'b0110; #10
in0 = 4'b1100; in1 = 4'b0111; #10
in0 = 4'b1100; in1 = 4'b1000; #10
in0 = 4'b1100; in1 = 4'b1001; #10
in0 = 4'b1100; in1 = 4'b1010; #10
in0 = 4'b1100; in1 = 4'b1011; #10
in0 = 4'b1100; in1 = 4'b1100; #10
in0 = 4'b1100; in1 = 4'b1101; #10
in0 = 4'b1100; in1 = 4'b1110; #10
in0 = 4'b1100; in1 = 4'b1111; #10
in0 = 4'b1101; in1 = 4'b0000; #10
in0 = 4'b1101; in1 = 4'b0001; #10
in0 = 4'b1101; in1 = 4'b0010; #10
in0 = 4'b1101; in1 = 4'b0011; #10
in0 = 4'b1101; in1 = 4'b0100; #10
in0 = 4'b1101; in1 = 4'b0101; #10
in0 = 4'b1101; in1 = 4'b0110; #10
in0 = 4'b1101; in1 = 4'b0111; #10
in0 = 4'b1101; in1 = 4'b1000; #10
in0 = 4'b1101; in1 = 4'b1001; #10
in0 = 4'b1101; in1 = 4'b1010; #10
in0 = 4'b1101; in1 = 4'b1011; #10
in0 = 4'b1101; in1 = 4'b1100; #10
in0 = 4'b1101; in1 = 4'b1101; #10
in0 = 4'b1101; in1 = 4'b1110; #10
in0 = 4'b1101; in1 = 4'b1111; #10
in0 = 4'b1110; in1 = 4'b0000; #10
in0 = 4'b1110; in1 = 4'b0001; #10
in0 = 4'b1110; in1 = 4'b0010; #10
in0 = 4'b1110; in1 = 4'b0011; #10
in0 = 4'b1110; in1 = 4'b0100; #10
in0 = 4'b1110; in1 = 4'b0101; #10
in0 = 4'b1110; in1 = 4'b0110; #10
in0 = 4'b1110; in1 = 4'b0111; #10
in0 = 4'b1110; in1 = 4'b1000; #10
in0 = 4'b1110; in1 = 4'b1001; #10
in0 = 4'b1110; in1 = 4'b1010; #10
in0 = 4'b1110; in1 = 4'b1011; #10
in0 = 4'b1110; in1 = 4'b1100; #10
in0 = 4'b1110; in1 = 4'b1101; #10
in0 = 4'b1110; in1 = 4'b1110; #10
in0 = 4'b1110; in1 = 4'b1111; #10
in0 = 4'b1111; in1 = 4'b0000; #10
in0 = 4'b1111; in1 = 4'b0001; #10
in0 = 4'b1111; in1 = 4'b0010; #10
in0 = 4'b1111; in1 = 4'b0011; #10
in0 = 4'b1111; in1 = 4'b0100; #10
in0 = 4'b1111; in1 = 4'b0101; #10
in0 = 4'b1111; in1 = 4'b0110; #10
in0 = 4'b1111; in1 = 4'b0111; #10
in0 = 4'b1111; in1 = 4'b1000; #10
in0 = 4'b1111; in1 = 4'b1001; #10
in0 = 4'b1111; in1 = 4'b1010; #10
in0 = 4'b1111; in1 = 4'b1011; #10
in0 = 4'b1111; in1 = 4'b1100; #10
in0 = 4'b1111; in1 = 4'b1101; #10
in0 = 4'b1111; in1 = 4'b1110; #10
in0 = 4'b1111; in1 = 4'b1111;
end
initial begin
$dumpfile("ripple-carry-adder.vcd");
$dumpvars(0, ripple_carry_adder_tb);
$monitor($time, ": %b + %b = %b, %b", in0, in1, out, cout);
end
endmodule
@alirezaopmc
Copy link

Cool
There is another method to implement more parametric RCA look at my implementation:

module RippleCarryAdder(a, b, cin, s, cout, N);
    parameter N;

    input [N-1:0] a;
    input [N-1:0] b;
    input cin;

    output [N-1:0] s;
    output cout;

    wire [N-1:0] carry;

    genvar i;
    generate
    for (i = 0; i < N; i = i + 1) begin
        if (i == 0)
            FullAdder f(a[0], b[0], cin, s[0], carry[0]);
        else
            FullAdder f(a[i], b[i], carry[i-1], s[i], carry[i]);
    end

    assign cout = carry[N-1];
    endgenerate
endmodule

@Nafis-Mustakim-Taskin
Copy link

Nafis-Mustakim-Taskin commented May 9, 2021

Cool
There is another method to implement more parametric RCA look at my implementation:

module RippleCarryAdder(a, b, cin, s, cout, N);
    parameter N;

    input [N-1:0] a;
    input [N-1:0] b;
    input cin;

    output [N-1:0] s;
    output cout;

    wire [N-1:0] carry;

    genvar i;
    generate
    for (i = 0; i < N; i = i + 1) begin
        if (i == 0)
            FullAdder f(a[0], b[0], cin, s[0], carry[0]);
        else
            FullAdder f(a[i], b[i], carry[i-1], s[i], carry[i]);
    end

    assign cout = carry[N-1];
    endgenerate
endmodule

This one got some bug I think! The carry out is 1 for a=1, b=3, cin=0 [for 4 bit RCA] and this error took place in lots of other test cases

@ArminRmt
Copy link

You can use for loop instead of writing all conditions

	initial begin

		A = 4'b0000;
		B = 4'b0000;
		count = 0;

		for (count = 0; count < 256; count = count + 1) begin
			#5 {A, B} = count;
		end
	end

	initial #1285 $finish;

@sandrolort
Copy link

Would be nice to change up the testbench in a more compact way. Nice example nevertheless.

module ripple_carry_adder_tb ();

reg [3:0] in0 = 4'b0, in1 = 4'b0;
wire [3:0] out;
wire cout;

ripple_carry_adder rca(.in0(in0), .in1(in1), .out(out), .cout(cout));

initial repeat(255) #10 {in0,in1} = {in0,in1} + 8'b1;

initial begin
    $dumpfile("ripple-carry-adder.vcd");
    $dumpvars(0, ripple_carry_adder_tb);
    $monitor($time, ": %b + %b = %b, %b", in0, in1, out, cout);
end

endmodule

Apologies for replying 5 years after the code was released, but an uni teacher of mine used this code as an example of a solution and I couldn't help but want to correct it.

Thanks for sharing your code by the way, its always helpful for beginners to see examples like this!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment