Comprehensive Guide to Declaring wire or reg with input and output in Verilog/SystemVerilog

Dec 06, 2025 · Programming · 6 views · 7.8

Keywords: Verilog | SystemVerilog | wire | reg | input_output_declaration

Abstract: This article delves into the selection of wire or reg types when declaring module ports in Verilog and SystemVerilog. By analyzing the assignment characteristics of input and output ports, it explains why wire is typically used for combinational logic assignments and reg for sequential logic assignments, while clarifying common misconceptions. With code examples, the article details that outputs assigned in always blocks should use reg, whereas those assigned via direct connections or assign statements should use wire, also discussing the applicability of input reg and default declaration rules.

Introduction

In Verilog and SystemVerilog hardware description languages, module port declarations involve two key aspects: direction (e.g., input or output) and data type (e.g., wire or reg). Correctly understanding these declaration rules is crucial for writing efficient and error-free code. Based on common Q&A data, this article systematically analyzes how to choose wire or reg based on assignment methods and clarifies related concepts.

Basic Differences Between wire and reg

wire and reg in Verilog specify how objects are assigned, not their physical implementation. wire represents a net, typically used for combinational logic, with values driven by continuous assignments (e.g., assign statements) or module connections. For example, in the following code, output wire is assigned via an assign statement:

module example1 (
    input a,
    input b,
    output wire c
);
    assign c = a & b; // combinational logic assignment
endmodule

In contrast, reg represents a register or variable, used to store values in sequential logic, often assigned within always blocks. In Verilog, reg is a historical term, more akin to "variable" in concept. For example:

module example2 (
    input clk,
    input d,
    output reg q
);
    always @(posedge clk) begin
        q <= d; // sequential logic assignment
    end
endmodule

Rules for Output Port Declarations

For output ports, the choice between wire and reg depends on the assignment method. If the output is assigned in an always block (e.g., sequential logic), it should be declared as reg. For example, in a clock-edge triggered always block:

module sequential_output (
    input clk,
    input data_in,
    output reg data_out
);
    always @(posedge clk) begin
        data_out <= data_in; // requires reg type
    end
endmodule

If the output is driven by continuous assignment or direct connection, wire should be used, which is also the default declaration. For example:

module combinational_output (
    input x,
    input y,
    output z // defaults to wire
);
    assign z = x | y;
endmodule

The shorthand output reg foo is equivalent to output foo_wire; reg foo; assign foo_wire = foo, which is convenient when registering the output.

Rules for Input Port Declarations

For input ports, they are typically declared as wire, since input values are driven externally and not directly assigned within the module. In Verilog, input defaults to wire type, so input wire is just a more explicit notation. For example:

module input_example (
    input wire signal_in, // equivalent to input signal_in
    output result
);
    assign result = ~signal_in;
endmodule

input reg is generally meaningless at the module level, as inputs should not be registered internally; however, it may be useful in task or function contexts for passing variable references.

Integrated Examples and Best Practices

Consider a simple counter module that combines input and output port declarations:

module counter (
    input clk,
    input reset,
    output reg [3:0] count // output assigned in always block, must be declared as reg
);
    always @(posedge clk or posedge reset) begin
        if (reset) begin
            count <= 4'b0;
        end else begin
            count <= count + 1;
        end
    end
endmodule

In practice, follow these guidelines:

Conclusion

Understanding the declaration rules for wire and reg in Verilog and SystemVerilog is fundamental to hardware design. By selecting the appropriate type based on assignment methods, common errors can be avoided and clearer code can be written. Remember, reg is used for sequential logic assignments, wire for combinational logic or default cases, and input ports typically remain as wire. These principles are especially important in complex designs, helping to ensure correctness in synthesis and simulation.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.