techmore.in

Verilog Modules

In Verilog, a module is the fundamental building block used to define and encapsulate a piece of hardware. Modules can represent anything from simple gates to complex digital systems. Each module has its own set of inputs, outputs, and internal logic. Understanding how to create and use modules is essential for designing and simulating digital circuits.

1. Basic Module Definition

A module in Verilog is defined using the module and endmodule keywords. Modules can contain ports, internal variables, and procedural blocks to describe their behavior.

Syntax:

verilog
module module_name ( input wire a, output wire b ); // Internal logic endmodule

Example:

verilog
module and_gate ( input wire a, input wire b, output wire c ); assign c = a & b; // AND gate logic endmodule

2. Ports

Ports define the inputs and outputs of a module. They are declared in the module's port list and can be of type input, output, or inout.

Syntax:

verilog
module example ( input wire a, // Input port output wire b, // Output port inout wire c // Inout port ); // Internal logic endmodule

Example:

verilog
module adder ( input wire [3:0] a, // 4-bit input input wire [3:0] b, // 4-bit input output wire [4:0] sum // 5-bit output (to accommodate carry) ); assign sum = a + b; // Add the two 4-bit inputs endmodule

3. Internal Logic

Modules can contain various types of logic, including:

  • Combinational Logic: Describes the behavior of logic gates and other combinational circuits.

    verilog
    assign out = a & b; // Combinational logic assignment
  • Sequential Logic: Describes behavior that depends on clock edges and involves flip-flops and registers.

    verilog
    always @(posedge clk or posedge reset) begin if (reset) q <= 0; else q <= d; end

4. Instantiating Modules

Modules can be instantiated within other modules. Instantiation is the process of creating instances of a module within another module.

Syntax:

verilog
module top_module ( input wire a, output wire c ); wire b; // Instantiate the and_gate module and_gate u1 ( .a(a), .b(b), .c(c) ); // Instantiate another module or additional logic endmodule

Example:

verilog
module top ( input wire a, input wire b, output wire result ); wire and_out; wire or_out; // Instantiate the AND gate module and_gate u1 ( .a(a), .b(b), .c(and_out) ); // Instantiate the OR gate module or_gate u2 ( .a(a), .b(b), .c(or_out) ); // Output the OR gate result assign result = or_out; endmodule

5. Parameterization

Modules can be parameterized to allow for configurable parameters. This makes the module more flexible and reusable.

Syntax:

verilog
module my_module #(parameter WIDTH = 8) ( input wire [WIDTH-1:0] a, input wire [WIDTH-1:0] b, output wire [WIDTH-1:0] sum ); assign sum = a + b; endmodule

Example:

verilog
module mux #(parameter WIDTH = 8) ( input wire [WIDTH-1:0] in0, input wire [WIDTH-1:0] in1, input wire sel, output wire [WIDTH-1:0] out ); assign out = sel ? in1 : in0; endmodule

6. Generate Statements

Generate statements allow for conditional or repetitive module instantiation. They are used for creating parameterized or replicated hardware structures.

Syntax:

verilog
generate genvar i; for (i = 0; i < N; i = i + 1) begin : gen_block // Instantiate modules or create hardware end endgenerate

Example:

verilog
module top; generate genvar i; for (i = 0; i < 4; i = i + 1) begin : adder_gen adder #(8) my_adder ( .a(a[i]), .b(b[i]), .sum(sum[i]) ); end endgenerate endmodule

7. Hierarchical Design

Verilog supports hierarchical design, where modules can be instantiated within other modules, creating a hierarchy of modules. This helps in managing and organizing complex designs.

Example:

verilog
module top_module ( input wire a, input wire b, output wire result ); wire and_out; wire or_out; // Instantiate an AND gate and_gate u1 ( .a(a), .b(b), .c(and_out) ); // Instantiate an OR gate or_gate u2 ( .a(a), .b(b), .c(or_out) ); // Use the results from the AND and OR gates assign result = or_out; endmodule

Summary

Verilog modules are essential for designing digital systems:

  • Basic Module Definition: Define hardware blocks with inputs, outputs, and internal logic.
  • Ports: Specify how modules interact with other modules.
  • Internal Logic: Describe combinational and sequential logic within a module.
  • Instantiation: Create instances of modules within other modules.
  • Parameterization: Create flexible and reusable modules with configurable parameters.
  • Generate Statements: Create parameterized or replicated hardware structures.
  • Hierarchical Design: Manage and organize complex designs with module hierarchies.

Understanding and using Verilog modules effectively allows for the design of scalable, modular, and manageable digital systems.