All of these examples are taken from the textbook, Digital Design and Computer Architecture, by David Harris and Sarah Harris.
// 4.3: gates
module gates(input logic [3:0] a, b,
output logic [3:0] y1, y2,
y3, y4, y5);
/* five different two-input logic
gates acting on 4 bit busses */
assign y1 = a & b; // AND
assign y2 = a | b; // OR
assign y3 = a ^ b; // XOR
assign y4 = ~(a & b); // NAND
assign y5 = ~(a | b); // NOR
endmodule
// 4.6: mux4
module mux4(input logic [3:0] d0, d1, d2, d3,
input logic [1:0] s,
output logic [3:0] y);
assign y = s[1] ? (s[0] ? d3 : d2)
: (s[0] ? d1 : d0);
endmodule
// 4.7: fulladder
module fulladder(input logic a, b, cin,
output logic s, cout);
logic p, g;
assign p = a ^ b;
assign g = a & b;
assign s = p ^ cin;
assign cout = g | (p & cin);
endmodule
// 4.14: mux4
module mux4(input logic [3:0] d0, d1, d2, d3,
input logic [1:0] s,
output logic [3:0] y);
logic [3:0] low, high;
mux2 lowmux(d0, d1, s[0], low);
mux2 highmux(d2, d3, s[0], high);
mux2 finalmux(low, high, s[1], y);
endmodule
// 4.17: flop
module flop(input logic clk,
input logic [3:0] d,
output logic [3:0] q);
always_ff @(posedge clk)
q <= d;
endmodule
// 4.21: latch
module latch(input logic clk,
input logic [3:0] d,
output logic [3:0] q);
always_latch
if (clk) q <= d;
endmodule
// 4.31: patternMoore
module patternMoore(input logic clk,
input logic reset,
input logic a,
output logic y);
typedef enum logic [1:0] {S0, S1, S2} statetype;
statetype state, nextstate;
// state register
always_ff @(posedge clk, posedge reset)
if (reset) state <= S0;
else state <= nextstate;
// next state logic
always_comb
case (state)
S0: if (a) nextstate <= S0;
else nextstate <= S1;
S1: if (a) nextstate <= S2;
else nextstate <= S1;
S2: if (a) nextstate <= S0;
else nextstate <= S1;
default: nextstate <= S0;
endcase
// output logic
assign y = (state == S2);
endmodule
// 4.37: testbench example 1
module testbench1();
logic a, b, c, y;
// instantiate device under test
sillyfunction dut(a, b, c, y);
// apply inputs one at a time
initial begin
a = 0; b = 0; c = 0; #10;
c = 1; #10;
b = 1; c = 0; #10;
c = 1; #10;
a = 1; b = 0; c = 0; #10;
c = 1; #10;
b = 1; c = 0; #10;
c = 1; #10;
end
endmodule
// 5.1: adder
module adder #(parameter N = 8)
(input logic [N-1:0] a, b,
input logic cin,
output logic [N-1:0] s,
output logic cout);
assign {cout, s} = a + b + cin;
endmodule