dmux8way.v
/*
DMux8way(in, sel) :
If sel = 000 then { a = in, b = c = d = e = f = g = h = 0 } else if
sel = 001 then { b = in, a = c = d = e = f = g = h = 0 } else if
sel = 010 then { c = in, a = b = d = e = f = g = h = 0 } else if
sel = 011 then { d = in, a = b = c = e = f = g = h = 0 } else if
sel = 100 then { e = in, a = b = c = d = f = g = h = 0 } else if
sel = 101 then { f = in, a = b = c = d = e = g = h = 0 } else if
sel = 110 then { g = in, a = b = c = d = e = f = h = 0 } else if
sel = 111 then { h = in, a = b = c = d = e = f = g = 0 }
*/
// dmux.v
module dmux_gate (output a, b, input in, sel);
// wire : internal pin
wire w1;
wire w2;
wire notsel;
// operations
not(notsel, sel);
and(a, in, notsel);
and(b, in, sel);
endmodule
// gate-level
module dmux8way_gate (output a, b, c, d, e, f, g, h, input in, input [2:0] sel);
wire ao, bo, aoo, boo, coo, doo;
dmux_gate Instance0 (ao, bo, in, sel[0]);
dmux_gate Instance1 (aoo, boo, ao, sel[1]);
dmux_gate Instance2 (coo, doo, bo, sel[1]);
dmux_gate Instance3 (a, b, aoo, sel[2]);
dmux_gate Instance4 (c, d, boo, sel[2]);
dmux_gate Instance5 (e, f, coo, sel[2]);
dmux_gate Instance6 (g, h, doo, sel[2]);
endmodule
// behavioural-level
module dmux8way_behavioural (output reg a, b, c, d, e, f, g, h, input in, input [2:0] sel);
always @ (in or sel) begin
a = 1'b0;
b = 1'b0;
c = 1'b0;
d = 1'b0;
e = 1'b0;
f = 1'b0;
g = 1'b0;
h = 1'b0;
// note: 3'b : 3 bit
if (sel == 3'b000) begin
a = in;
end
else if (sel == 3'b100) begin
b = in;
end
else if (sel == 3'b010) begin
c = in;
end
else if (sel == 3'b110) begin
d = in;
end
else if (sel == 3'b001) begin
e = in;
end
else if (sel == 3'b101) begin
f = in;
end
else if (sel == 3'b011) begin
g = in;
end
else begin
h = in;
end
end
endmodule
// test
module test;
reg [2:0] sel;
reg in;
wire a, b, c, d, e, f, g, h;
// dmux8way_gate Instance0 (a, b, c, d, e, f, g, h, in, sel);
dmux8way_behavioural Instance0 (a, b, c, d, e, f, g, h, in, sel);
// note: #(n) : delay by n timestep (check time scale with $printtimescale)
initial begin
#(0) in = 1; sel[0] = 0; sel[1] = 0; sel[2] = 0; // { a = 1, b = c = d = e = f = g = h = 0 }
#(1) in = 1; sel[0] = 0; sel[1] = 0; sel[2] = 1; // { b = 1, a = c = d = e = f = g = h = 0 }
#(1) in = 1; sel[0] = 0; sel[1] = 1; sel[2] = 0; // { c = 1, a = b = d = e = f = g = h = 0 }
#(1) in = 1; sel[0] = 0; sel[1] = 1; sel[2] = 1; // { d = 1, a = b = c = e = f = g = h = 0 }
#(1) in = 1; sel[0] = 1; sel[1] = 0; sel[2] = 0; // { e = 1, a = b = c = d = f = g = h = 0 }
#(1) in = 1; sel[0] = 1; sel[1] = 0; sel[2] = 1; // { f = 1, a = b = c = d = e = g = h = 0 }
#(1) in = 1; sel[0] = 1; sel[1] = 1; sel[2] = 0; // { g = 1, a = b = c = d = e = f = h = 0 }
#(1) in = 1; sel[0] = 1; sel[1] = 1; sel[2] = 1; // { h = 1, a = b = c = d = e = f = g = 0 }
end
initial begin
$printtimescale;
// Time scale of (test) is 1s / 1s
$monitor ("%1d | in = %d | sel = [%d, %d, %d] | a = %d | b = %d | c = %d | d = %d | e = %d | f = %d | g = %d | h = %d", $time, in, sel[0], sel[1], sel[2], a, b, c, d, e, f, g, h);
// 0 | in = 1 | sel = [0, 0, 0] | a = 1 | b = 0 | c = 0 | d = 0 | e = 0 | f = 0 | g = 0 | h = 0
// 1 | in = 1 | sel = [0, 0, 1] | a = 0 | b = 1 | c = 0 | d = 0 | e = 0 | f = 0 | g = 0 | h = 0
// 2 | in = 1 | sel = [0, 1, 0] | a = 0 | b = 0 | c = 1 | d = 0 | e = 0 | f = 0 | g = 0 | h = 0
// 3 | in = 1 | sel = [0, 1, 1] | a = 0 | b = 0 | c = 0 | d = 1 | e = 0 | f = 0 | g = 0 | h = 0
// 4 | in = 1 | sel = [1, 0, 0] | a = 0 | b = 0 | c = 0 | d = 0 | e = 1 | f = 0 | g = 0 | h = 0
// 5 | in = 1 | sel = [1, 0, 1] | a = 0 | b = 0 | c = 0 | d = 0 | e = 0 | f = 1 | g = 0 | h = 0
// 6 | in = 1 | sel = [1, 1, 0] | a = 0 | b = 0 | c = 0 | d = 0 | e = 0 | f = 0 | g = 1 | h = 0
// 7 | in = 1 | sel = [1, 1, 1] | a = 0 | b = 0 | c = 0 | d = 0 | e = 0 | f = 0 | g = 0 | h = 1
end
endmodule