A growing collection of reusable, parameterized Verilog modules for learning, prototyping, and integrating into larger digital design projects.
Each module includes documentation, a testbench, simulation waveforms (when applicable), and clean RTL aimed at readability and reusability.
This project welcomes contributions of all kinds—new modules, tests, improvements, documentation, or design suggestions.
- Reusable RTL — Clean, synthesizable, parameterized modules.
- Full workflow support — Testbenches, simulation scripts, and CI-based linting/simulation.
How to use these modules in your projects?
👉 How to Use
Read the contribution guide here:
👉 Contribution Guidelines
If you run into any issues or want help contributing, feel free to open a Discussion:
👉 Discussions
- Icarus Verilog — Simulation
- Verilator — Linting & static checks
- GTKWave — Waveform viewing
- EDA Playground — Quick online testing
- Lattice iCE40 UP5K
- Xilinx Artix-7 XC7A35T
For module requests, ideas, improvements, or collaboration, use the GitHub Discussions section of the repository.
Let’s consider a boolean expression: ((A + B) * C) * D
To implement this expression, we need two modules — MAC and Multiplier.
Step 1: Download MAC.v and Multiplier.v and add them to your work environment.
Step 2: Instantiate them as shown below:
module top (
input [1:0] A_in, B_in,
input [3:0] C_in, D_in,
output [7:0] ex_out
);
wire connector;
// Multiply-Accumulate: (A + B) * C
MAC #(
.WIDTH_A(2),
.WIDTH_B(2)
) u_mac (
.A(A_in),
.B(B_in),
.C(C_in),
.Y(connector)
);
// Final multiplication: result * D
Multiplier #(
.WIDTH_A(4),
.WIDTH_B(4)
) u_mult (
.in1(connector),
.in2(D_in),
.out(ex_out)
);
endmodule