From 8eaa07ffd6e2a70b0a3921978215fa4b25400268 Mon Sep 17 00:00:00 2001 From: juicyslew Date: Thu, 21 Sep 2017 23:31:00 -0400 Subject: [PATCH] The sweet release of finished homework --- Adder.pdf | Bin 0 -> 4034 bytes Decoder.pdf | Bin 0 -> 4351 bytes Multiplexer.pdf | Bin 0 -> 4592 bytes Output.pdf | Bin 0 -> 27064 bytes TurnInDoc.pdf | Bin 0 -> 34346 bytes adder | 154 ++++++++++++++++++++++++++++++++++ adder.t.v | 31 ++++++- adder.v | 36 ++++++-- adder.vcd | 70 ++++++++++++++++ decoder | 168 +++++++++++++++++++++++++++++++++++++ decoder.t.v | 22 ++--- decoder.v | 22 ++++- decoder.vcd | 83 +++++++++++++++++++ multiplexer | 216 ++++++++++++++++++++++++++++++++++++++++++++++++ multiplexer.t.v | 42 +++++++++- multiplexer.v | 24 +++++- multiplexer.vcd | 87 +++++++++++++++++++ 17 files changed, 927 insertions(+), 28 deletions(-) create mode 100644 Adder.pdf create mode 100644 Decoder.pdf create mode 100644 Multiplexer.pdf create mode 100644 Output.pdf create mode 100644 TurnInDoc.pdf create mode 100755 adder create mode 100644 adder.vcd create mode 100755 decoder create mode 100644 decoder.vcd create mode 100755 multiplexer create mode 100644 multiplexer.vcd diff --git a/Adder.pdf b/Adder.pdf new file mode 100644 index 0000000000000000000000000000000000000000..858b05fe3e72cd831df7e4146e6105e1838e80e6 GIT binary patch literal 4034 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 literal 0 HcmV?d00001 diff --git a/Multiplexer.pdf b/Multiplexer.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a68c151254be02e658e1a99a06c6fa75c38414f2 GIT binary patch literal 4592 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 F{{~v7#vuRz literal 0 HcmV?d00001 diff --git a/Output.pdf b/Output.pdf new file mode 100644 index 0000000000000000000000000000000000000000..76af534ae3c8f6e7c027e789f4f170b391d32238 GIT binary patch literal 27064 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�hyn7DjCk`-sHUte7 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 literal 0 HcmV?d00001 diff --git a/adder b/adder new file mode 100755 index 0000000..a2a1257 --- /dev/null +++ b/adder @@ -0,0 +1,154 @@ +#! /usr/local/bin/vvp +:ivl_version "11.0 (devel)" "(s20150603-477-gc855b89)"; +:ivl_delay_selection "TYPICAL"; +:vpi_time_precision - 12; +:vpi_module "system"; +:vpi_module "vhdl_sys"; +:vpi_module "vhdl_textio"; +:vpi_module "v2005_math"; +:vpi_module "va_math"; +S_0x1c63890 .scope module, "behavioralFullAdder" "behavioralFullAdder" 2 9; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "sum" + .port_info 1 /OUTPUT 1 "carryout" + .port_info 2 /INPUT 1 "a" + .port_info 3 /INPUT 1 "b" + .port_info 4 /INPUT 1 "carryin" +L_0x7f87581bf060 .functor BUFT 1, C4<0>, C4<0>, C4<0>, C4<0>; +v0x1c6e660_0 .net *"_s10", 0 0, L_0x7f87581bf060; 1 drivers +v0x1c97040_0 .net *"_s11", 1 0, L_0x1c98f40; 1 drivers +v0x1c97120_0 .net *"_s13", 1 0, L_0x1c990f0; 1 drivers +L_0x7f87581bf0a8 .functor BUFT 1, C4<0>, C4<0>, C4<0>, C4<0>; +v0x1c97210_0 .net *"_s16", 0 0, L_0x7f87581bf0a8; 1 drivers +v0x1c972f0_0 .net *"_s17", 1 0, L_0x1c99250; 1 drivers +v0x1c97420_0 .net *"_s3", 1 0, L_0x1c98c70; 1 drivers +L_0x7f87581bf018 .functor BUFT 1, C4<0>, C4<0>, C4<0>, C4<0>; +v0x1c97500_0 .net *"_s6", 0 0, L_0x7f87581bf018; 1 drivers +v0x1c975e0_0 .net *"_s7", 1 0, L_0x1c98dc0; 1 drivers +o0x7f8758225198 .functor BUFZ 1, C4; HiZ drive +v0x1c976c0_0 .net "a", 0 0, o0x7f8758225198; 0 drivers +o0x7f87582251c8 .functor BUFZ 1, C4; HiZ drive +v0x1c97810_0 .net "b", 0 0, o0x7f87582251c8; 0 drivers +o0x7f87582251f8 .functor BUFZ 1, C4; HiZ drive +v0x1c978d0_0 .net "carryin", 0 0, o0x7f87582251f8; 0 drivers +v0x1c97990_0 .net "carryout", 0 0, L_0x1c98a50; 1 drivers +v0x1c97a50_0 .net "sum", 0 0, L_0x1c98b50; 1 drivers +L_0x1c98a50 .part L_0x1c99250, 1, 1; +L_0x1c98b50 .part L_0x1c99250, 0, 1; +L_0x1c98c70 .concat [ 1 1 0 0], o0x7f8758225198, L_0x7f87581bf018; +L_0x1c98dc0 .concat [ 1 1 0 0], o0x7f87582251c8, L_0x7f87581bf060; +L_0x1c98f40 .arith/sum 2, L_0x1c98c70, L_0x1c98dc0; +L_0x1c990f0 .concat [ 1 1 0 0], o0x7f87582251f8, L_0x7f87581bf0a8; +L_0x1c99250 .arith/sum 2, L_0x1c98f40, L_0x1c990f0; +S_0x1c63aa0 .scope module, "testFullAdder" "testFullAdder" 3 5; + .timescale -9 -12; +v0x1c98650_0 .var "a", 0 0; +v0x1c98710_0 .var "b", 0 0; +v0x1c987e0_0 .var "carryin", 0 0; +v0x1c988e0_0 .net "carryout", 0 0, L_0x1c996f0; 1 drivers +v0x1c989b0_0 .net "sum", 0 0, L_0x1c99ae0; 1 drivers +S_0x1c97bb0 .scope module, "adder" "structuralFullAdder" 3 10, 2 23 0, S_0x1c63aa0; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "sum" + .port_info 1 /OUTPUT 1 "cout" + .port_info 2 /INPUT 1 "a" + .port_info 3 /INPUT 1 "b" + .port_info 4 /INPUT 1 "cin" +L_0x1c98fe0/d .functor AND 1, v0x1c98650_0, v0x1c98710_0, C4<1>, C4<1>; +L_0x1c98fe0 .delay 1 (50000,50000,50000) L_0x1c98fe0/d; +L_0x1c99480/d .functor OR 1, v0x1c98650_0, v0x1c98710_0, C4<0>, C4<0>; +L_0x1c99480 .delay 1 (50000,50000,50000) L_0x1c99480/d; +L_0x1c995e0/d .functor AND 1, v0x1c987e0_0, L_0x1c99480, C4<1>, C4<1>; +L_0x1c995e0 .delay 1 (50000,50000,50000) L_0x1c995e0/d; +L_0x1c996f0/d .functor OR 1, L_0x1c995e0, L_0x1c98fe0, C4<0>, C4<0>; +L_0x1c996f0 .delay 1 (50000,50000,50000) L_0x1c996f0/d; +L_0x1c998f0/d .functor XOR 1, v0x1c98650_0, v0x1c98710_0, C4<0>, C4<0>; +L_0x1c998f0 .delay 1 (50000,50000,50000) L_0x1c998f0/d; +L_0x1c99ae0/d .functor XOR 1, v0x1c987e0_0, L_0x1c998f0, C4<0>, C4<0>; +L_0x1c99ae0 .delay 1 (50000,50000,50000) L_0x1c99ae0/d; +v0x1c97de0_0 .net "a", 0 0, v0x1c98650_0; 1 drivers +v0x1c97ec0_0 .net "aOb", 0 0, L_0x1c99480; 1 drivers +v0x1c97f80_0 .net "ab", 0 0, L_0x1c98fe0; 1 drivers +v0x1c98050_0 .net "axb", 0 0, L_0x1c998f0; 1 drivers +v0x1c98110_0 .net "b", 0 0, v0x1c98710_0; 1 drivers +v0x1c98220_0 .net "cin", 0 0, v0x1c987e0_0; 1 drivers +v0x1c982e0_0 .net "cin_aOb", 0 0, L_0x1c995e0; 1 drivers +v0x1c983a0_0 .net "cout", 0 0, L_0x1c996f0; alias, 1 drivers +v0x1c98460_0 .net "sum", 0 0, L_0x1c99ae0; alias, 1 drivers + .scope S_0x1c63aa0; +T_0 ; + %vpi_call 3 13 "$dumpfile", "adder.vcd" {0 0 0}; + %vpi_call 3 14 "$dumpvars", 32'sb00000000000000000000000000000000, v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c988e0_0, v0x1c989b0_0 {0 0 0}; + %vpi_call 3 15 "$display", " A B Cin | S Cout " {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c98650_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c98710_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c987e0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 18 "$display", " %b %b %b | %b %b ", v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c989b0_0, v0x1c988e0_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c98650_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c98710_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c987e0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 21 "$display", " %b %b %b | %b %b ", v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c989b0_0, v0x1c988e0_0 {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c98650_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c98710_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c987e0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 24 "$display", " %b %b %b | %b %b ", v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c989b0_0, v0x1c988e0_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c98650_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c98710_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c987e0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 27 "$display", " %b %b %b | %b %b ", v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c989b0_0, v0x1c988e0_0 {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c98650_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c98710_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c987e0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 30 "$display", " %b %b %b | %b %b ", v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c989b0_0, v0x1c988e0_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c98650_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c98710_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c987e0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 33 "$display", " %b %b %b | %b %b ", v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c989b0_0, v0x1c988e0_0 {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1c98650_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c98710_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c987e0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 36 "$display", " %b %b %b | %b %b ", v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c989b0_0, v0x1c988e0_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c98650_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c98710_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1c987e0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 39 "$display", " %b %b %b | %b %b ", v0x1c98650_0, v0x1c98710_0, v0x1c987e0_0, v0x1c989b0_0, v0x1c988e0_0 {0 0 0}; + %end; + .thread T_0; +# The file index is used to find the file name in the following table. +:file_names 4; + "N/A"; + ""; + "./adder.v"; + "adder.t.v"; diff --git a/adder.t.v b/adder.t.v index 76109ed..7f36e1f 100644 --- a/adder.t.v +++ b/adder.t.v @@ -6,9 +6,36 @@ module testFullAdder(); reg a, b, carryin; wire sum, carryout; - behavioralFullAdder adder (sum, carryout, a, b, carryin); + //behavioralFullAdder adder (sum, carryout, a, b, carryin); + structuralFullAdder adder (sum, carryout, a, b, carryin); initial begin - // Your test code here + $dumpfile("adder.vcd"); + $dumpvars(0, a, b, carryin, carryout, sum); + $display(" A B Cin | S Cout "); + a = 0; b = 0; carryin = 0; + #1000 + $display(" %b %b %b | %b %b ", a, b, carryin, sum, carryout); + a = 1; b = 0; carryin = 0; + #1000 + $display(" %b %b %b | %b %b ", a, b, carryin, sum, carryout); + a = 0; b = 1; carryin = 0; + #1000 + $display(" %b %b %b | %b %b ", a, b, carryin, sum, carryout); + a = 1; b = 1; carryin = 0; + #1000 + $display(" %b %b %b | %b %b ", a, b, carryin, sum, carryout); + a = 0; b = 0; carryin = 1; + #1000 + $display(" %b %b %b | %b %b ", a, b, carryin, sum, carryout); + a = 1; b = 0; carryin = 1; + #1000 + $display(" %b %b %b | %b %b ", a, b, carryin, sum, carryout); + a = 0; b = 1; carryin = 1; + #1000 + $display(" %b %b %b | %b %b ", a, b, carryin, sum, carryout); + a = 1; b = 1; carryin = 1; + #1000 + $display(" %b %b %b | %b %b ", a, b, carryin, sum, carryout); end endmodule diff --git a/adder.v b/adder.v index d21f7e4..0728f9c 100644 --- a/adder.v +++ b/adder.v @@ -1,24 +1,42 @@ // Adder circuit +`define AND and #50 +`define OR or #50 +`define NOT not #50 +`define NAND nand #50 +`define NOR nor #50 +`define XOR xor #50 module behavioralFullAdder ( - output sum, + output sum, output carryout, - input a, - input b, + input a, + input b, input carryin ); // Uses concatenation operator and built-in '+' assign {carryout, sum}=a+b+carryin; endmodule + + module structuralFullAdder ( - output sum, - output carryout, - input a, - input b, - input carryin + output sum, + output cout, + input a, + input b, + input cin ); - // Your adder code here + + wire axb, ab, aorb, cin_aOb; + //cin + `AND cand0(ab, a, b); + `OR cor0(aOb, a, b); + `AND cand1(cin_aOb, cin, aOb); + `OR cor1(cout, cin_aOb, ab); + + //s + `XOR sxor0(axb, a, b); + `XOR sxor1(sum, cin, axb); endmodule diff --git a/adder.vcd b/adder.vcd new file mode 100644 index 0000000..bd0d83e --- /dev/null +++ b/adder.vcd @@ -0,0 +1,70 @@ +$date + Thu Sep 21 23:09:26 2017 +$end +$version + Icarus Verilog +$end +$timescale + 1ps +$end +$scope module testFullAdder $end +$var reg 1 ! a $end +$upscope $end +$scope module testFullAdder $end +$var reg 1 " b $end +$upscope $end +$scope module testFullAdder $end +$var reg 1 # carryin $end +$upscope $end +$scope module testFullAdder $end +$var wire 1 $ carryout $end +$upscope $end +$scope module testFullAdder $end +$var wire 1 % sum $end +$upscope $end +$enddefinitions $end +#0 +$dumpvars +x% +x$ +0# +0" +0! +$end +#100000 +0% +0$ +#1000000 +1! +#1100000 +1% +#2000000 +1" +0! +#3000000 +1! +#3100000 +1$ +0% +#4000000 +1# +0" +0! +#4050000 +1% +#4150000 +0$ +#5000000 +1! +#5100000 +0% +#5150000 +1$ +#6000000 +1" +0! +#7000000 +1! +#7100000 +1% +#8000000 diff --git a/decoder b/decoder new file mode 100755 index 0000000..e30ef59 --- /dev/null +++ b/decoder @@ -0,0 +1,168 @@ +#! /usr/local/bin/vvp +:ivl_version "11.0 (devel)" "(s20150603-477-gc855b89)"; +:ivl_delay_selection "TYPICAL"; +:vpi_time_precision - 12; +:vpi_module "system"; +:vpi_module "vhdl_sys"; +:vpi_module "vhdl_textio"; +:vpi_module "v2005_math"; +:vpi_module "va_math"; +S_0xacbe60 .scope module, "behavioralDecoder" "behavioralDecoder" 2 8; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "out0" + .port_info 1 /OUTPUT 1 "out1" + .port_info 2 /OUTPUT 1 "out2" + .port_info 3 /OUTPUT 1 "out3" + .port_info 4 /INPUT 1 "address0" + .port_info 5 /INPUT 1 "address1" + .port_info 6 /INPUT 1 "enable" +v0xacfbf0_0 .net *"_s11", 3 0, L_0xb05c80; 1 drivers +v0xb03870_0 .net *"_s5", 3 0, L_0xb05a70; 1 drivers +L_0x7f73a8d15018 .functor BUFT 1, C4<000>, C4<0>, C4<0>, C4<0>; +v0xb03950_0 .net *"_s8", 2 0, L_0x7f73a8d15018; 1 drivers +v0xb03a40_0 .net *"_s9", 1 0, L_0xb05ba0; 1 drivers +o0x7f73a8d7b0d8 .functor BUFZ 1, C4; HiZ drive +v0xb03b20_0 .net "address0", 0 0, o0x7f73a8d7b0d8; 0 drivers +o0x7f73a8d7b108 .functor BUFZ 1, C4; HiZ drive +v0xb03c30_0 .net "address1", 0 0, o0x7f73a8d7b108; 0 drivers +o0x7f73a8d7b138 .functor BUFZ 1, C4; HiZ drive +v0xb03cf0_0 .net "enable", 0 0, o0x7f73a8d7b138; 0 drivers +v0xb03db0_0 .net "out0", 0 0, L_0xb058e0; 1 drivers +v0xb03e70_0 .net "out1", 0 0, L_0xb05840; 1 drivers +v0xb03fc0_0 .net "out2", 0 0, L_0xb05720; 1 drivers +v0xb04080_0 .net "out3", 0 0, L_0xb05620; 1 drivers +L_0xb05620 .part L_0xb05c80, 3, 1; +L_0xb05720 .part L_0xb05c80, 2, 1; +L_0xb05840 .part L_0xb05c80, 1, 1; +L_0xb058e0 .part L_0xb05c80, 0, 1; +L_0xb05a70 .concat [ 1 3 0 0], o0x7f73a8d7b138, L_0x7f73a8d15018; +L_0xb05ba0 .concat [ 1 1 0 0], o0x7f73a8d7b0d8, o0x7f73a8d7b108; +L_0xb05c80 .shift/l 4, L_0xb05a70, L_0xb05ba0; +S_0xacc0a0 .scope module, "testDecoder" "testDecoder" 3 5; + .timescale -9 -12; +v0xb05080_0 .var "addr0", 0 0; +v0xb05140_0 .var "addr1", 0 0; +v0xb05210_0 .var "enable", 0 0; +v0xb05310_0 .net "out0", 0 0, L_0xb06630; 1 drivers +v0xb053e0_0 .net "out1", 0 0, L_0xb067e0; 1 drivers +v0xb05480_0 .net "out2", 0 0, L_0xb069e0; 1 drivers +v0xb05550_0 .net "out3", 0 0, L_0xb06bd0; 1 drivers +S_0xb04260 .scope module, "decoder" "structuralDecoder" 3 11, 2 19 0, S_0xacc0a0; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "out0" + .port_info 1 /OUTPUT 1 "out1" + .port_info 2 /OUTPUT 1 "out2" + .port_info 3 /OUTPUT 1 "out3" + .port_info 4 /INPUT 1 "in0" + .port_info 5 /INPUT 1 "in1" + .port_info 6 /INPUT 1 "enable" +L_0xb05dc0/d .functor NOT 1, v0xb05080_0, C4<0>, C4<0>, C4<0>; +L_0xb05dc0 .delay 1 (50000,50000,50000) L_0xb05dc0/d; +L_0xb05ed0/d .functor NOT 1, v0xb05140_0, C4<0>, C4<0>, C4<0>; +L_0xb05ed0 .delay 1 (50000,50000,50000) L_0xb05ed0/d; +L_0xb06030/d .functor AND 1, L_0xb05dc0, L_0xb05ed0, C4<1>, C4<1>; +L_0xb06030 .delay 1 (50000,50000,50000) L_0xb06030/d; +L_0xb061e0/d .functor AND 1, L_0xb05ed0, v0xb05080_0, C4<1>, C4<1>; +L_0xb061e0 .delay 1 (50000,50000,50000) L_0xb061e0/d; +L_0xb06340/d .functor AND 1, L_0xb05dc0, v0xb05140_0, C4<1>, C4<1>; +L_0xb06340 .delay 1 (50000,50000,50000) L_0xb06340/d; +L_0xb06400/d .functor AND 1, v0xb05080_0, v0xb05140_0, C4<1>, C4<1>; +L_0xb06400 .delay 1 (50000,50000,50000) L_0xb06400/d; +L_0xb06630/d .functor AND 1, L_0xb06030, v0xb05210_0, C4<1>, C4<1>; +L_0xb06630 .delay 1 (50000,50000,50000) L_0xb06630/d; +L_0xb067e0/d .functor AND 1, L_0xb061e0, v0xb05210_0, C4<1>, C4<1>; +L_0xb067e0 .delay 1 (50000,50000,50000) L_0xb067e0/d; +L_0xb069e0/d .functor AND 1, L_0xb06340, v0xb05210_0, C4<1>, C4<1>; +L_0xb069e0 .delay 1 (50000,50000,50000) L_0xb069e0/d; +L_0xb06bd0/d .functor AND 1, L_0xb06400, v0xb05210_0, C4<1>, C4<1>; +L_0xb06bd0 .delay 1 (50000,50000,50000) L_0xb06bd0/d; +v0xb044c0_0 .net "enable", 0 0, v0xb05210_0; 1 drivers +v0xb045a0_0 .net "in0", 0 0, v0xb05080_0; 1 drivers +v0xb04660_0 .net "in1", 0 0, v0xb05140_0; 1 drivers +v0xb04700_0 .net "nin0", 0 0, L_0xb05dc0; 1 drivers +v0xb047c0_0 .net "nin1", 0 0, L_0xb05ed0; 1 drivers +v0xb048d0_0 .net "out0", 0 0, L_0xb06630; alias, 1 drivers +v0xb04990_0 .net "out1", 0 0, L_0xb067e0; alias, 1 drivers +v0xb04a50_0 .net "out2", 0 0, L_0xb069e0; alias, 1 drivers +v0xb04b10_0 .net "out3", 0 0, L_0xb06bd0; alias, 1 drivers +v0xb04c60_0 .net "preout0", 0 0, L_0xb06030; 1 drivers +v0xb04d20_0 .net "preout1", 0 0, L_0xb061e0; 1 drivers +v0xb04de0_0 .net "preout2", 0 0, L_0xb06340; 1 drivers +v0xb04ea0_0 .net "preout3", 0 0, L_0xb06400; 1 drivers + .scope S_0xacc0a0; +T_0 ; + %vpi_call 3 14 "$dumpfile", "decoder.vcd" {0 0 0}; + %vpi_call 3 15 "$dumpvars", 32'sb00000000000000000000000000000000, v0xb05080_0, v0xb05140_0, v0xb05210_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %vpi_call 3 16 "$display", "En A0 A1| O0 O1 O2 O3 | Expected Output" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05210_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05080_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05140_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 18 "$display", "%b %b %b | %b %b %b %b | All false", v0xb05210_0, v0xb05080_0, v0xb05140_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05210_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05080_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05140_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 20 "$display", "%b %b %b | %b %b %b %b | All false", v0xb05210_0, v0xb05080_0, v0xb05140_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05210_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05080_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05140_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 22 "$display", "%b %b %b | %b %b %b %b | All false", v0xb05210_0, v0xb05080_0, v0xb05140_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05210_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05080_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05140_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 24 "$display", "%b %b %b | %b %b %b %b | All false", v0xb05210_0, v0xb05080_0, v0xb05140_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05210_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05080_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05140_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 26 "$display", "%b %b %b | %b %b %b %b | O0 Only", v0xb05210_0, v0xb05080_0, v0xb05140_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05210_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05080_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05140_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 28 "$display", "%b %b %b | %b %b %b %b | O1 Only", v0xb05210_0, v0xb05080_0, v0xb05140_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05210_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0xb05080_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05140_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 30 "$display", "%b %b %b | %b %b %b %b | O2 Only", v0xb05210_0, v0xb05080_0, v0xb05140_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05210_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05080_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xb05140_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 32 "$display", "%b %b %b | %b %b %b %b | O3 Only", v0xb05210_0, v0xb05080_0, v0xb05140_0, v0xb05310_0, v0xb053e0_0, v0xb05480_0, v0xb05550_0 {0 0 0}; + %end; + .thread T_0; +# The file index is used to find the file name in the following table. +:file_names 4; + "N/A"; + ""; + "./decoder.v"; + "decoder.t.v"; diff --git a/decoder.t.v b/decoder.t.v index e0e925f..da54ec5 100644 --- a/decoder.t.v +++ b/decoder.t.v @@ -2,31 +2,33 @@ `timescale 1 ns / 1 ps `include "decoder.v" -module testDecoder (); +module testDecoder (); reg addr0, addr1; reg enable; wire out0,out1,out2,out3; - behavioralDecoder decoder (out0,out1,out2,out3,addr0,addr1,enable); - //structuralDecoder decoder (out0,out1,out2,out3,addr0,addr1,enable); // Swap after testing + //behavioralDecoder decoder (out0,out1,out2,out3,addr0,addr1,enable); + structuralDecoder decoder (out0,out1,out2,out3,addr0,addr1,enable); // Swap after testing initial begin + $dumpfile("decoder.vcd"); + $dumpvars(0, addr0, addr1, enable, out0, out1, out2, out3); $display("En A0 A1| O0 O1 O2 O3 | Expected Output"); - enable=0;addr0=0;addr1=0; #1000 + enable=0;addr0=0;addr1=0; #1000 $display("%b %b %b | %b %b %b %b | All false", enable, addr0, addr1, out0, out1, out2, out3); enable=0;addr0=1;addr1=0; #1000 $display("%b %b %b | %b %b %b %b | All false", enable, addr0, addr1, out0, out1, out2, out3); - enable=0;addr0=0;addr1=1; #1000 + enable=0;addr0=0;addr1=1; #1000 $display("%b %b %b | %b %b %b %b | All false", enable, addr0, addr1, out0, out1, out2, out3); - enable=0;addr0=1;addr1=1; #1000 + enable=0;addr0=1;addr1=1; #1000 $display("%b %b %b | %b %b %b %b | All false", enable, addr0, addr1, out0, out1, out2, out3); - enable=1;addr0=0;addr1=0; #1000 + enable=1;addr0=0;addr1=0; #1000 $display("%b %b %b | %b %b %b %b | O0 Only", enable, addr0, addr1, out0, out1, out2, out3); - enable=1;addr0=1;addr1=0; #1000 + enable=1;addr0=1;addr1=0; #1000 $display("%b %b %b | %b %b %b %b | O1 Only", enable, addr0, addr1, out0, out1, out2, out3); - enable=1;addr0=0;addr1=1; #1000 + enable=1;addr0=0;addr1=1; #1000 $display("%b %b %b | %b %b %b %b | O2 Only", enable, addr0, addr1, out0, out1, out2, out3); - enable=1;addr0=1;addr1=1; #1000 + enable=1;addr0=1;addr1=1; #1000 $display("%b %b %b | %b %b %b %b | O3 Only", enable, addr0, addr1, out0, out1, out2, out3); end diff --git a/decoder.v b/decoder.v index 17836e0..54f5c11 100644 --- a/decoder.v +++ b/decoder.v @@ -1,5 +1,10 @@ // Decoder circuit - +`define AND and #50 +`define OR or #50 +`define NOT not #50 +`define NAND nand #50 +`define NOR nor #50 +`define XOR xor #50 module behavioralDecoder ( output out0, out1, out2, out3, @@ -14,9 +19,18 @@ endmodule module structuralDecoder ( output out0, out1, out2, out3, - input address0, address1, + input in0, in1, input enable ); - // Your decoder code here + wire in0, in1; + `NOT Nin0(nin0, in0); + `NOT Nin1(nin1, in1); + `AND preo0(preout0, nin0, nin1); + `AND preo1(preout1, nin1, in0); + `AND preo2(preout2, nin0, in1); + `AND preo3(preout3, in0, in1); + `AND o0(out0, preout0, enable); + `AND o1(out1, preout1, enable); + `AND o2(out2, preout2, enable); + `AND o3(out3, preout3, enable); endmodule - diff --git a/decoder.vcd b/decoder.vcd new file mode 100644 index 0000000..a39597b --- /dev/null +++ b/decoder.vcd @@ -0,0 +1,83 @@ +$date + Thu Sep 21 23:09:14 2017 +$end +$version + Icarus Verilog +$end +$timescale + 1ps +$end +$scope module testDecoder $end +$var reg 1 ! addr0 $end +$upscope $end +$scope module testDecoder $end +$var reg 1 " addr1 $end +$upscope $end +$scope module testDecoder $end +$var reg 1 # enable $end +$upscope $end +$scope module testDecoder $end +$var wire 1 $ out0 $end +$upscope $end +$scope module testDecoder $end +$var wire 1 % out1 $end +$upscope $end +$scope module testDecoder $end +$var wire 1 & out2 $end +$upscope $end +$scope module testDecoder $end +$var wire 1 ' out3 $end +$upscope $end +$enddefinitions $end +#0 +$dumpvars +x' +x& +x% +x$ +0# +0" +0! +$end +#50000 +0' +0& +0% +0$ +#1000000 +1! +#2000000 +1" +0! +#3000000 +1! +#4000000 +0" +0! +1# +#4050000 +1' +#4100000 +0' +#4150000 +1$ +#5000000 +1! +#5100000 +1% +#5150000 +0$ +#6000000 +1" +0! +#6100000 +0% +#6150000 +1& +#7000000 +1! +#7100000 +1' +#7150000 +0& +#8000000 diff --git a/multiplexer b/multiplexer new file mode 100755 index 0000000..d229025 --- /dev/null +++ b/multiplexer @@ -0,0 +1,216 @@ +#! /usr/local/bin/vvp +:ivl_version "11.0 (devel)" "(s20150603-477-gc855b89)"; +:ivl_delay_selection "TYPICAL"; +:vpi_time_precision - 12; +:vpi_module "system"; +:vpi_module "vhdl_sys"; +:vpi_module "vhdl_textio"; +:vpi_module "v2005_math"; +:vpi_module "va_math"; +S_0x1c7b8a0 .scope module, "behavioralMultiplexer" "behavioralMultiplexer" 2 9; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "out" + .port_info 1 /INPUT 1 "address0" + .port_info 2 /INPUT 1 "address1" + .port_info 3 /INPUT 1 "in0" + .port_info 4 /INPUT 1 "in1" + .port_info 5 /INPUT 1 "in2" + .port_info 6 /INPUT 1 "in3" +v0x1c8ed90_0 .net "address", 1 0, L_0x1cba7b0; 1 drivers +o0x7f6fc1491048 .functor BUFZ 1, C4; HiZ drive +v0x1cb7350_0 .net "address0", 0 0, o0x7f6fc1491048; 0 drivers +o0x7f6fc1491078 .functor BUFZ 1, C4; HiZ drive +v0x1cb7410_0 .net "address1", 0 0, o0x7f6fc1491078; 0 drivers +o0x7f6fc14910a8 .functor BUFZ 1, C4; HiZ drive +v0x1cb74e0_0 .net "in0", 0 0, o0x7f6fc14910a8; 0 drivers +o0x7f6fc14910d8 .functor BUFZ 1, C4; HiZ drive +v0x1cb75a0_0 .net "in1", 0 0, o0x7f6fc14910d8; 0 drivers +o0x7f6fc1491108 .functor BUFZ 1, C4; HiZ drive +v0x1cb76b0_0 .net "in2", 0 0, o0x7f6fc1491108; 0 drivers +o0x7f6fc1491138 .functor BUFZ 1, C4; HiZ drive +v0x1cb7770_0 .net "in3", 0 0, o0x7f6fc1491138; 0 drivers +v0x1cb7830_0 .net "inputs", 3 0, L_0x1cba710; 1 drivers +v0x1cb7910_0 .net "out", 0 0, L_0x1cba8b0; 1 drivers +L_0x1cba710 .concat [ 1 1 1 1], o0x7f6fc14910a8, o0x7f6fc14910d8, o0x7f6fc1491108, o0x7f6fc1491138; +L_0x1cba7b0 .concat [ 1 1 0 0], o0x7f6fc1491048, o0x7f6fc1491078; +L_0x1cba8b0 .part/v L_0x1cba710, L_0x1cba7b0, 1; +S_0x1c7bae0 .scope module, "testMultiplexer" "testMultiplexer" 3 5; + .timescale -9 -12; +v0x1cba010_0 .var "addr0", 0 0; +v0x1cba0b0_0 .var "addr1", 0 0; +v0x1cba170_0 .var "in0", 0 0; +v0x1cba260_0 .var "in1", 0 0; +v0x1cba350_0 .var "in2", 0 0; +v0x1cba490_0 .var "in3", 0 0; +v0x1cba580_0 .var "na", 0 0; +v0x1cba620_0 .net "out", 0 0, L_0x1cbb9b0; 1 drivers +S_0x1cb7b80 .scope module, "decoder" "structuralMultiplexer" 3 11, 2 34 0, S_0x1c7bae0; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "out" + .port_info 1 /INPUT 1 "address0" + .port_info 2 /INPUT 1 "address1" + .port_info 3 /INPUT 1 "in0" + .port_info 4 /INPUT 1 "in1" + .port_info 5 /INPUT 1 "in2" + .port_info 6 /INPUT 1 "in3" +v0x1cb9790_0 .net "address0", 0 0, v0x1cba010_0; 1 drivers +v0x1cb98a0_0 .net "address1", 0 0, v0x1cba0b0_0; 1 drivers +v0x1cb9960_0 .net "in0", 0 0, v0x1cba170_0; 1 drivers +v0x1cb9a30_0 .net "in1", 0 0, v0x1cba260_0; 1 drivers +v0x1cb9b00_0 .net "in2", 0 0, v0x1cba350_0; 1 drivers +v0x1cb9bf0_0 .net "in3", 0 0, v0x1cba490_0; 1 drivers +v0x1cb9cc0_0 .net "mux0", 0 0, L_0x1cbade0; 1 drivers +v0x1cb9db0_0 .net "mux1", 0 0, L_0x1cbb310; 1 drivers +v0x1cb9ea0_0 .net "out", 0 0, L_0x1cbb9b0; alias, 1 drivers +S_0x1cb7de0 .scope module, "mux_0" "bitMultiplexer" 2 41, 2 21 0, S_0x1cb7b80; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "out" + .port_info 1 /INPUT 1 "addr" + .port_info 2 /INPUT 1 "in0" + .port_info 3 /INPUT 1 "in1" +L_0x1cbaa20/d .functor NOT 1, v0x1cba010_0, C4<0>, C4<0>, C4<0>; +L_0x1cbaa20 .delay 1 (50000,50000,50000) L_0x1cbaa20/d; +L_0x1cbab20/d .functor AND 1, v0x1cba170_0, L_0x1cbaa20, C4<1>, C4<1>; +L_0x1cbab20 .delay 1 (50000,50000,50000) L_0x1cbab20/d; +L_0x1cbac80/d .functor AND 1, v0x1cba260_0, v0x1cba010_0, C4<1>, C4<1>; +L_0x1cbac80 .delay 1 (50000,50000,50000) L_0x1cbac80/d; +L_0x1cbade0/d .functor OR 1, L_0x1cbab20, L_0x1cbac80, C4<0>, C4<0>; +L_0x1cbade0 .delay 1 (50000,50000,50000) L_0x1cbade0/d; +v0x1cb8050_0 .net "addr", 0 0, v0x1cba010_0; alias, 1 drivers +v0x1cb8130_0 .net "in0", 0 0, v0x1cba170_0; alias, 1 drivers +v0x1cb81f0_0 .net "in1", 0 0, v0x1cba260_0; alias, 1 drivers +v0x1cb82c0_0 .net "naddr", 0 0, L_0x1cbaa20; 1 drivers +v0x1cb8380_0 .net "o0", 0 0, L_0x1cbab20; 1 drivers +v0x1cb8490_0 .net "o1", 0 0, L_0x1cbac80; 1 drivers +v0x1cb8550_0 .net "out", 0 0, L_0x1cbade0; alias, 1 drivers +S_0x1cb8690 .scope module, "mux_1" "bitMultiplexer" 2 42, 2 21 0, S_0x1cb7b80; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "out" + .port_info 1 /INPUT 1 "addr" + .port_info 2 /INPUT 1 "in0" + .port_info 3 /INPUT 1 "in1" +L_0x1cbaf40/d .functor NOT 1, v0x1cba010_0, C4<0>, C4<0>, C4<0>; +L_0x1cbaf40 .delay 1 (50000,50000,50000) L_0x1cbaf40/d; +L_0x1cbb0a0/d .functor AND 1, v0x1cba350_0, L_0x1cbaf40, C4<1>, C4<1>; +L_0x1cbb0a0 .delay 1 (50000,50000,50000) L_0x1cbb0a0/d; +L_0x1cbb1b0/d .functor AND 1, v0x1cba490_0, v0x1cba010_0, C4<1>, C4<1>; +L_0x1cbb1b0 .delay 1 (50000,50000,50000) L_0x1cbb1b0/d; +L_0x1cbb310/d .functor OR 1, L_0x1cbb0a0, L_0x1cbb1b0, C4<0>, C4<0>; +L_0x1cbb310 .delay 1 (50000,50000,50000) L_0x1cbb310/d; +v0x1cb8900_0 .net "addr", 0 0, v0x1cba010_0; alias, 1 drivers +v0x1cb89d0_0 .net "in0", 0 0, v0x1cba350_0; alias, 1 drivers +v0x1cb8a70_0 .net "in1", 0 0, v0x1cba490_0; alias, 1 drivers +v0x1cb8b40_0 .net "naddr", 0 0, L_0x1cbaf40; 1 drivers +v0x1cb8c00_0 .net "o0", 0 0, L_0x1cbb0a0; 1 drivers +v0x1cb8d10_0 .net "o1", 0 0, L_0x1cbb1b0; 1 drivers +v0x1cb8dd0_0 .net "out", 0 0, L_0x1cbb310; alias, 1 drivers +S_0x1cb8f10 .scope module, "mux_out" "bitMultiplexer" 2 43, 2 21 0, S_0x1cb7b80; + .timescale -9 -12; + .port_info 0 /OUTPUT 1 "out" + .port_info 1 /INPUT 1 "addr" + .port_info 2 /INPUT 1 "in0" + .port_info 3 /INPUT 1 "in1" +L_0x1cbb470/d .functor NOT 1, v0x1cba0b0_0, C4<0>, C4<0>, C4<0>; +L_0x1cbb470 .delay 1 (50000,50000,50000) L_0x1cbb470/d; +L_0x1cbb5d0/d .functor AND 1, L_0x1cbade0, L_0x1cbb470, C4<1>, C4<1>; +L_0x1cbb5d0 .delay 1 (50000,50000,50000) L_0x1cbb5d0/d; +L_0x1cbb7c0/d .functor AND 1, L_0x1cbb310, v0x1cba0b0_0, C4<1>, C4<1>; +L_0x1cbb7c0 .delay 1 (50000,50000,50000) L_0x1cbb7c0/d; +L_0x1cbb9b0/d .functor OR 1, L_0x1cbb5d0, L_0x1cbb7c0, C4<0>, C4<0>; +L_0x1cbb9b0 .delay 1 (50000,50000,50000) L_0x1cbb9b0/d; +v0x1cb9190_0 .net "addr", 0 0, v0x1cba0b0_0; alias, 1 drivers +v0x1cb9250_0 .net "in0", 0 0, L_0x1cbade0; alias, 1 drivers +v0x1cb9340_0 .net "in1", 0 0, L_0x1cbb310; alias, 1 drivers +v0x1cb9440_0 .net "naddr", 0 0, L_0x1cbb470; 1 drivers +v0x1cb94e0_0 .net "o0", 0 0, L_0x1cbb5d0; 1 drivers +v0x1cb95d0_0 .net "o1", 0 0, L_0x1cbb7c0; 1 drivers +v0x1cb9670_0 .net "out", 0 0, L_0x1cbb9b0; alias, 1 drivers + .scope S_0x1c7bae0; +T_0 ; + %vpi_call 3 14 "$dumpfile", "multiplexer.vcd" {0 0 0}; + %vpi_call 3 15 "$dumpvars", 32'sb00000000000000000000000000000000, v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %vpi_call 3 16 "$display", "A0 A1 | I0 I1 I2 I3 | Out " {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 18 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba170_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 21 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba170_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 24 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %load/vec4 v0x1cba580_0; + %store/vec4 v0x1cba170_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba260_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 28 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba260_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 31 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %load/vec4 v0x1cba580_0; + %store/vec4 v0x1cba260_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba350_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 35 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba350_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 38 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %load/vec4 v0x1cba580_0; + %store/vec4 v0x1cba350_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1cba490_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 42 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba490_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1cba0b0_0, 0, 1; + %delay 1000000, 0; + %vpi_call 3 45 "$display", " %b %b | %b %b %b %b | %b ", v0x1cba010_0, v0x1cba0b0_0, v0x1cba170_0, v0x1cba260_0, v0x1cba350_0, v0x1cba490_0, v0x1cba620_0 {0 0 0}; + %end; + .thread T_0; +# The file index is used to find the file name in the following table. +:file_names 4; + "N/A"; + ""; + "./multiplexer.v"; + "multiplexer.t.v"; diff --git a/multiplexer.t.v b/multiplexer.t.v index fd475c4..9dfddb4 100644 --- a/multiplexer.t.v +++ b/multiplexer.t.v @@ -3,5 +3,45 @@ `include "multiplexer.v" module testMultiplexer (); - // Your test code here + reg addr0, addr1; + reg in0, in1, in2, in3; + reg na; + wire out; + //behavioralMultiplexer decoder (out, addr0, addr1, in0, in1, in2, in3); + structuralMultiplexer decoder (out, addr0, addr1, in0, in1, in2, in3); // Swap after testing + + initial begin + $dumpfile("multiplexer.vcd"); + $dumpvars(0, addr0, addr1, in0, in1, in2, in3, out); + $display("A0 A1 | I0 I1 I2 I3 | Out "); + addr0=0;addr1=0; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + in0 = 0; + addr0=0;addr1=0; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + in0 = 1; + addr0=0;addr1=0; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + in0 = na; + in1 = 0; + addr0=1;addr1=0; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + in1 = 1; + addr0=1;addr1=0; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + in1 = na; + in2 = 0; + addr0=0;addr1=1; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + in2 = 1; + addr0=0;addr1=1; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + in2 = na; + in3 = 0; + addr0=1;addr1=1; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + in3 = 1; + addr0=1;addr1=1; #1000 + $display(" %b %b | %b %b %b %b | %b ", addr0, addr1, in0, in1, in2, in3, out); + end endmodule diff --git a/multiplexer.v b/multiplexer.v index b05820f..3556a42 100644 --- a/multiplexer.v +++ b/multiplexer.v @@ -1,4 +1,10 @@ // Multiplexer circuit +`define AND and #50 +`define OR or #50 +`define NOT not #50 +`define NAND nand #50 +`define NOR nor #50 +`define XOR xor #50 module behavioralMultiplexer ( @@ -12,6 +18,18 @@ module behavioralMultiplexer assign out = inputs[address]; endmodule +module bitMultiplexer +( + output out, + input addr, + input in0, in1 +); + wire naddr; + `NOT n_addr(naddr, addr); + `AND and_0(o0, in0, naddr); + `AND and_1(o1, in1, addr); + `OR or_out(out, o0, o1); +endmodule module structuralMultiplexer ( @@ -19,6 +37,8 @@ module structuralMultiplexer input address0, address1, input in0, in1, in2, in3 ); - // Your multiplexer code here + wire mux0, mux1; + bitMultiplexer mux_0(mux0, address0, in0, in1); + bitMultiplexer mux_1(mux1, address0, in2, in3); + bitMultiplexer mux_out(out, address1, mux0, mux1); endmodule - diff --git a/multiplexer.vcd b/multiplexer.vcd new file mode 100644 index 0000000..d0c79f1 --- /dev/null +++ b/multiplexer.vcd @@ -0,0 +1,87 @@ +$date + Thu Sep 21 23:09:11 2017 +$end +$version + Icarus Verilog +$end +$timescale + 1ps +$end +$scope module testMultiplexer $end +$var reg 1 ! addr0 $end +$upscope $end +$scope module testMultiplexer $end +$var reg 1 " addr1 $end +$upscope $end +$scope module testMultiplexer $end +$var reg 1 # in0 $end +$upscope $end +$scope module testMultiplexer $end +$var reg 1 $ in1 $end +$upscope $end +$scope module testMultiplexer $end +$var reg 1 % in2 $end +$upscope $end +$scope module testMultiplexer $end +$var reg 1 & in3 $end +$upscope $end +$scope module testMultiplexer $end +$var wire 1 ' out $end +$upscope $end +$enddefinitions $end +#0 +$dumpvars +x' +x& +x% +x$ +x# +0" +0! +$end +#1000000 +0# +#1200000 +0' +#2000000 +1# +#2200000 +1' +#3000000 +1! +0$ +x# +#3200000 +x' +#3250000 +0' +#4000000 +1$ +#4200000 +1' +#5000000 +1" +0! +0% +x$ +#5150000 +x' +#5200000 +0' +#6000000 +1% +#6200000 +1' +#7000000 +1! +0& +x% +#7200000 +x' +#7250000 +0' +#8000000 +1& +#8200000 +1' +#9000000