first commit
This commit is contained in:
45
full_adder/full_adder.v
Normal file
45
full_adder/full_adder.v
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
Full Adder Declaration
|
||||
|
||||
A B Cin | Sum Cout
|
||||
0 0 0 | 0 0
|
||||
0 0 1 | 1 0
|
||||
0 1 0 | 1 0
|
||||
0 1 1 | 0 1
|
||||
1 0 0 | 1 0
|
||||
1 0 1 | 0 1
|
||||
1 1 0 | 0 1
|
||||
1 1 1 | 1 1
|
||||
*/
|
||||
`include "./half_adder/half_adder.v"
|
||||
|
||||
module full_adder_structural (carry_in, a, b, sum, carry_out);
|
||||
input carry_in, a, b;
|
||||
output sum, carry_out;
|
||||
|
||||
wire add1_sum, add1_carry;
|
||||
wire add2_carry;
|
||||
|
||||
half_adder add1(a, b, add1_sum, add1_carry);
|
||||
half_adder add2(add1_sum, carry_in, sum, add2_carry);
|
||||
|
||||
or final_or(carry_out, add1_carry, add2_carry);
|
||||
endmodule
|
||||
|
||||
module full_adder_dataflow (carry_in, a, b, sum, carry_out);
|
||||
input carry_in, a, b;
|
||||
output sum, carry_out;
|
||||
|
||||
assign sum = a ^ b ^ carry_in;
|
||||
assign carry_out = (a & b) | (carry_in & (a ^ b));
|
||||
endmodule
|
||||
|
||||
module full_adder_behavioral (carry_in, a, b, sum, carry_out);
|
||||
input carry_in, a, b;
|
||||
output reg sum, carry_out;
|
||||
|
||||
always @(*) begin
|
||||
sum = a ^ b ^ carry_in;
|
||||
carry_out = (a & b) | (carry_in & (a ^ b));
|
||||
end
|
||||
endmodule
|
||||
69
full_adder/full_adder.vcd
Normal file
69
full_adder/full_adder.vcd
Normal file
@@ -0,0 +1,69 @@
|
||||
$date
|
||||
Sat Feb 28 20:25:22 2026
|
||||
$end
|
||||
$version
|
||||
Icarus Verilog
|
||||
$end
|
||||
$timescale
|
||||
1s
|
||||
$end
|
||||
$scope module full_adder_tb $end
|
||||
$var wire 1 ! carry_out $end
|
||||
$var wire 1 " sum $end
|
||||
$var reg 1 # a $end
|
||||
$var reg 1 $ b $end
|
||||
$var reg 1 % carry_in $end
|
||||
$scope module full_adder $end
|
||||
$var wire 1 & a $end
|
||||
$var wire 1 ' b $end
|
||||
$var wire 1 ( carry_in $end
|
||||
$var reg 1 ) carry_out $end
|
||||
$var reg 1 * sum $end
|
||||
$upscope $end
|
||||
$upscope $end
|
||||
$enddefinitions $end
|
||||
#0
|
||||
$dumpvars
|
||||
0*
|
||||
0)
|
||||
0(
|
||||
0'
|
||||
0&
|
||||
0%
|
||||
0$
|
||||
0#
|
||||
0"
|
||||
0!
|
||||
$end
|
||||
#1
|
||||
1*
|
||||
1"
|
||||
1%
|
||||
1(
|
||||
#2
|
||||
0*
|
||||
0"
|
||||
0%
|
||||
0(
|
||||
#3
|
||||
1*
|
||||
1"
|
||||
1#
|
||||
1&
|
||||
#4
|
||||
1)
|
||||
1!
|
||||
0*
|
||||
0"
|
||||
1%
|
||||
1(
|
||||
#5
|
||||
0%
|
||||
0(
|
||||
1$
|
||||
1'
|
||||
#6
|
||||
1*
|
||||
1"
|
||||
1%
|
||||
1(
|
||||
154
full_adder/full_adder.vvp
Normal file
154
full_adder/full_adder.vvp
Normal file
@@ -0,0 +1,154 @@
|
||||
#! /c/iverilog/bin/vvp
|
||||
:ivl_version "0.9.7 " "(v0_9_7)";
|
||||
:vpi_time_precision + 0;
|
||||
:vpi_module "system";
|
||||
:vpi_module "v2005_math";
|
||||
:vpi_module "va_math";
|
||||
S_01022BC0 .scope module, "full_adder_dataflow" "full_adder_dataflow" 2 29;
|
||||
.timescale 0 0;
|
||||
L_000ED8B8 .functor XOR 1, C4<z>, C4<z>, C4<0>, C4<0>;
|
||||
L_000ED8F0 .functor XOR 1, L_000ED8B8, C4<z>, C4<0>, C4<0>;
|
||||
L_0105BC40 .functor AND 1, C4<z>, C4<z>, C4<1>, C4<1>;
|
||||
L_0105BE00 .functor XOR 1, C4<z>, C4<z>, C4<0>, C4<0>;
|
||||
L_0105BFC0 .functor AND 1, C4<z>, L_0105BE00, C4<1>, C4<1>;
|
||||
L_0105BC78 .functor OR 1, L_0105BC40, L_0105BFC0, C4<0>, C4<0>;
|
||||
v000ED828_0 .net *"_s0", 0 0, L_000ED8B8; 1 drivers
|
||||
v01030E00_0 .net *"_s4", 0 0, L_0105BC40; 1 drivers
|
||||
v01031278_0 .net *"_s6", 0 0, L_0105BE00; 1 drivers
|
||||
v01030FB8_0 .net *"_s8", 0 0, L_0105BFC0; 1 drivers
|
||||
v01030F60_0 .net "a", 0 0, C4<z>; 0 drivers
|
||||
v01030CF8_0 .net "b", 0 0, C4<z>; 0 drivers
|
||||
v01030E58_0 .net "carry_in", 0 0, C4<z>; 0 drivers
|
||||
v010311C8_0 .net "carry_out", 0 0, L_0105BC78; 1 drivers
|
||||
v01030D50_0 .net "sum", 0 0, L_000ED8F0; 1 drivers
|
||||
S_01023220 .scope module, "full_adder_structural" "full_adder_structural" 2 16;
|
||||
.timescale 0 0;
|
||||
L_0105C2F0 .functor OR 1, L_0105BD90, L_0105C750, C4<0>, C4<0>;
|
||||
v01031068_0 .net "a", 0 0, C4<z>; 0 drivers
|
||||
v01031430_0 .net "add1_carry", 0 0, L_0105BD90; 1 drivers
|
||||
v01031118_0 .net "add1_sum", 0 0, L_0105BCB0; 1 drivers
|
||||
v01031170_0 .net "add2_carry", 0 0, L_0105C750; 1 drivers
|
||||
v01030DA8_0 .net "b", 0 0, C4<z>; 0 drivers
|
||||
v01030F08_0 .net "carry_in", 0 0, C4<z>; 0 drivers
|
||||
v0105B3D0_0 .net "carry_out", 0 0, L_0105C2F0; 1 drivers
|
||||
v0105B270_0 .net "sum", 0 0, L_0105BF88; 1 drivers
|
||||
S_01022AB0 .scope module, "add1" "half_adder" 2 23, 3 5, S_01023220;
|
||||
.timescale 0 0;
|
||||
L_0105BCB0 .functor XOR 1, C4<z>, C4<z>, C4<0>, C4<0>;
|
||||
L_0105BD90 .functor AND 1, C4<z>, C4<z>, C4<1>, C4<1>;
|
||||
v010312D0_0 .alias "a", 0 0, v01031068_0;
|
||||
v01030EB0_0 .alias "b", 0 0, v01030DA8_0;
|
||||
v01031328_0 .alias "carry", 0 0, v01031430_0;
|
||||
v01031380_0 .alias "sum", 0 0, v01031118_0;
|
||||
S_01023660 .scope module, "add2" "half_adder" 2 24, 3 5, S_01023220;
|
||||
.timescale 0 0;
|
||||
L_0105BF88 .functor XOR 1, L_0105BCB0, C4<z>, C4<0>, C4<0>;
|
||||
L_0105C750 .functor AND 1, L_0105BCB0, C4<z>, C4<1>, C4<1>;
|
||||
v01031010_0 .alias "a", 0 0, v01031118_0;
|
||||
v010313D8_0 .alias "b", 0 0, v01030F08_0;
|
||||
v01031220_0 .alias "carry", 0 0, v01031170_0;
|
||||
v010310C0_0 .alias "sum", 0 0, v0105B270_0;
|
||||
S_010234C8 .scope module, "full_adder_tb" "full_adder_tb" 4 6;
|
||||
.timescale 0 0;
|
||||
v0105B588_0 .var "a", 0 0;
|
||||
v0105B2C8_0 .var "b", 0 0;
|
||||
v0105B320_0 .var "carry_in", 0 0;
|
||||
v0105B1C0_0 .net "carry_out", 0 0, v0105B110_0; 1 drivers
|
||||
v0105B638_0 .net "sum", 0 0, v0105ADA0_0; 1 drivers
|
||||
S_010229A0 .scope module, "full_adder" "full_adder_behavioral" 4 10, 2 37, S_010234C8;
|
||||
.timescale 0 0;
|
||||
v0105B218_0 .net "a", 0 0, v0105B588_0; 1 drivers
|
||||
v0105B5E0_0 .net "b", 0 0, v0105B2C8_0; 1 drivers
|
||||
v0105B008_0 .net "carry_in", 0 0, v0105B320_0; 1 drivers
|
||||
v0105B110_0 .var "carry_out", 0 0;
|
||||
v0105ADA0_0 .var "sum", 0 0;
|
||||
E_01023A48 .event edge, v0105B218_0, v0105B5E0_0, v0105B008_0;
|
||||
S_01022EF0 .scope module, "half_adder_behavioral" "half_adder_behavioral" 3 21;
|
||||
.timescale 0 0;
|
||||
v0105AC98_0 .net "a", 0 0, C4<z>; 0 drivers
|
||||
v0105B060_0 .net "b", 0 0, C4<z>; 0 drivers
|
||||
v0105ACF0_0 .var "carry", 0 0;
|
||||
v0105B428_0 .var "sum", 0 0;
|
||||
E_01023B28 .event edge, v0105B060_0, v0105AC98_0;
|
||||
S_010232A8 .scope module, "half_adder_dataflow" "half_adder_dataflow" 3 13;
|
||||
.timescale 0 0;
|
||||
L_0105C1A0 .functor XOR 1, C4<z>, C4<z>, C4<0>, C4<0>;
|
||||
L_0105C1D8 .functor AND 1, C4<z>, C4<z>, C4<1>, C4<1>;
|
||||
v0105B530_0 .net "a", 0 0, C4<z>; 0 drivers
|
||||
v0105B378_0 .net "b", 0 0, C4<z>; 0 drivers
|
||||
v0105AC40_0 .net "carry", 0 0, L_0105C1D8; 1 drivers
|
||||
v0105ADF8_0 .net "sum", 0 0, L_0105C1A0; 1 drivers
|
||||
.scope S_010229A0;
|
||||
T_0 ;
|
||||
%wait E_01023A48;
|
||||
%load/v 8, v0105B218_0, 1;
|
||||
%load/v 9, v0105B5E0_0, 1;
|
||||
%xor 8, 9, 1;
|
||||
%load/v 9, v0105B008_0, 1;
|
||||
%xor 8, 9, 1;
|
||||
%set/v v0105ADA0_0, 8, 1;
|
||||
%load/v 8, v0105B218_0, 1;
|
||||
%load/v 9, v0105B5E0_0, 1;
|
||||
%and 8, 9, 1;
|
||||
%load/v 9, v0105B008_0, 1;
|
||||
%load/v 10, v0105B218_0, 1;
|
||||
%load/v 11, v0105B5E0_0, 1;
|
||||
%xor 10, 11, 1;
|
||||
%and 9, 10, 1;
|
||||
%or 8, 9, 1;
|
||||
%set/v v0105B110_0, 8, 1;
|
||||
%jmp T_0;
|
||||
.thread T_0, $push;
|
||||
.scope S_010234C8;
|
||||
T_1 ;
|
||||
%vpi_call 4 19 "$dumpfile", "./full_adder/full_adder.vcd";
|
||||
%vpi_call 4 20 "$dumpvars", 1'sb0, S_010234C8;
|
||||
%set/v v0105B588_0, 0, 1;
|
||||
%set/v v0105B2C8_0, 0, 1;
|
||||
%set/v v0105B320_0, 0, 1;
|
||||
%delay 1, 0;
|
||||
%set/v v0105B588_0, 0, 1;
|
||||
%set/v v0105B2C8_0, 0, 1;
|
||||
%set/v v0105B320_0, 1, 1;
|
||||
%delay 1, 0;
|
||||
%set/v v0105B588_0, 0, 1;
|
||||
%set/v v0105B2C8_0, 0, 1;
|
||||
%set/v v0105B320_0, 0, 1;
|
||||
%delay 1, 0;
|
||||
%set/v v0105B588_0, 1, 1;
|
||||
%set/v v0105B2C8_0, 0, 1;
|
||||
%set/v v0105B320_0, 0, 1;
|
||||
%delay 1, 0;
|
||||
%set/v v0105B588_0, 1, 1;
|
||||
%set/v v0105B2C8_0, 0, 1;
|
||||
%set/v v0105B320_0, 1, 1;
|
||||
%delay 1, 0;
|
||||
%set/v v0105B588_0, 1, 1;
|
||||
%set/v v0105B2C8_0, 1, 1;
|
||||
%set/v v0105B320_0, 0, 1;
|
||||
%delay 1, 0;
|
||||
%set/v v0105B588_0, 1, 1;
|
||||
%set/v v0105B2C8_0, 1, 1;
|
||||
%set/v v0105B320_0, 1, 1;
|
||||
%end;
|
||||
.thread T_1;
|
||||
.scope S_01022EF0;
|
||||
T_2 ;
|
||||
%wait E_01023B28;
|
||||
%load/v 8, v0105AC98_0, 1;
|
||||
%load/v 9, v0105B060_0, 1;
|
||||
%xor 8, 9, 1;
|
||||
%set/v v0105B428_0, 8, 1;
|
||||
%load/v 8, v0105AC98_0, 1;
|
||||
%load/v 9, v0105B060_0, 1;
|
||||
%and 8, 9, 1;
|
||||
%set/v v0105ACF0_0, 8, 1;
|
||||
%jmp T_2;
|
||||
.thread T_2, $push;
|
||||
# The file index is used to find the file name in the following table.
|
||||
:file_names 5;
|
||||
"N/A";
|
||||
"<interactive>";
|
||||
"././full_adder/full_adder.v";
|
||||
"././half_adder/half_adder.v";
|
||||
".\full_adder\full_adder_tb.v";
|
||||
36
full_adder/full_adder_tb.v
Normal file
36
full_adder/full_adder_tb.v
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
Full Adder testbench
|
||||
*/
|
||||
`include "./full_adder/full_adder.v"
|
||||
|
||||
module full_adder_tb;
|
||||
reg a, b, carry_in;
|
||||
wire sum, carry_out;
|
||||
|
||||
full_adder_behavioral full_adder(
|
||||
.carry_in(carry_in),
|
||||
.a(a),
|
||||
.b(b),
|
||||
.sum(sum),
|
||||
.carry_out(carry_out)
|
||||
);
|
||||
|
||||
initial begin
|
||||
$dumpfile("./full_adder/full_adder.vcd");
|
||||
$dumpvars(0, full_adder_tb);
|
||||
|
||||
a = 0; b = 0; carry_in = 0;
|
||||
#1
|
||||
a = 0; b = 0; carry_in = 1;
|
||||
#1
|
||||
a = 0; b = 0; carry_in = 0;
|
||||
#1
|
||||
a = 1; b = 0; carry_in = 0;
|
||||
#1
|
||||
a = 1; b = 0; carry_in = 1;
|
||||
#1
|
||||
a = 1; b = 1; carry_in = 0;
|
||||
#1
|
||||
a = 1; b = 1; carry_in = 1;
|
||||
end
|
||||
endmodule
|
||||
Reference in New Issue
Block a user