/* General introduction to Verilog code Example of an inverting multiplexor done is several coding styles */ // behavioural-level description of an inverting multiplexor module mux_beh (out, cnt, a, b); output out; input cnt, a, b; reg out; always @(cnt or a or b) if (cnt == 1) out = ~a; else out = ~b; endmodule // mux_gate // behavioural-level description of an inverting multiplexor module mux_beh_2 (out, cnt, a, b); output out; input cnt, a, b; assign out = (cnt == 1) ? ~a: ~b; endmodule // mux_gate // functional-level description of an inverting multiplexor module mux_func (out, cnt, a, b); output out; input cnt, a, b; assign out = ~((cnt & a) |(~cnt & b)); endmodule // mux_gate // gate-level description of an inverting multiplexor module mux_gate (out, cnt, a, b); output out; input cnt, a, b; wire cntBar; wire aval, bval; not (cntBar, cnt); and (aval, cnt, a); and (bval, cntBar, b); nor (out, aval, bval); endmodule // mux_gate // NECESSARY TEST stimulus to verify designs module stimulus; reg a, b, c; wire out1, out2, out3, out4; integer i; mux_beh_2 mod1 (out1, c, a, b); mux_beh mod2 (out2, c, a, b); mux_func mod3 (out3, c, a, b); mux_gate mod4 (out4, c, a, b); initial begin for (i = 0; i < 8; i = i + 1) begin {a, b, c} = i[2:0]; #10 $display ($time, " %b %b %b - %b %b %b %b", a, b, c, out1, out2, out3, out4); end #10 $finish; end // initial begin endmodule // stimulus