0
0
VerilogHow-ToBeginner · 3 min read

How to Model NAND Gate in Verilog: Syntax and Example

To model a nand gate in Verilog, use the built-in nand primitive or define it using an assign statement with the negation of an AND operation. The nand primitive syntax is nand (output, input1, input2); which directly models the NAND logic.
📐

Syntax

The nand gate in Verilog can be modeled using the built-in primitive with this syntax:

  • nand (output, input1, input2); - This creates a NAND gate with two inputs and one output.
  • The output is the result of NAND operation on input1 and input2.
  • You can also use more than two inputs by listing them after the output.

Alternatively, you can use an assign statement: assign output = ~(input1 & input2);

verilog
nand (output, input1, input2);
💻

Example

This example shows how to model a 2-input NAND gate using the nand primitive and test it with different input values.

verilog
module nand_gate_example();
  reg a, b;
  wire y;

  // Instantiate nand gate primitive
  nand (y, a, b);

  initial begin
    // Test all input combinations
    a = 0; b = 0; #10;
    $display("a=%b b=%b y=%b", a, b, y);
    a = 0; b = 1; #10;
    $display("a=%b b=%b y=%b", a, b, y);
    a = 1; b = 0; #10;
    $display("a=%b b=%b y=%b", a, b, y);
    a = 1; b = 1; #10;
    $display("a=%b b=%b y=%b", a, b, y);
    $finish;
  end
endmodule
Output
a=0 b=0 y=1 a=0 b=1 y=1 a=1 b=0 y=1 a=1 b=1 y=0
⚠️

Common Pitfalls

Common mistakes when modeling NAND gates in Verilog include:

  • Using and instead of nand primitive which gives wrong logic.
  • Forgetting to negate the AND operation when using assign statements.
  • Not specifying all inputs correctly in the primitive call.

Example of wrong and right ways:

verilog
// Wrong: Using and instead of nand
// and (y, a, b); // This models AND gate, not NAND

// Right: Using nand primitive
nand (y, a, b);

// Or using assign with negation
assign y = ~(a & b);
📊

Quick Reference

Remember these tips when modeling NAND gates:

  • Use nand (output, input1, input2, ...); for built-in primitive.
  • Or use assign output = ~(input1 & input2 & ...); for behavioral style.
  • Test all input combinations to verify logic.
  • Use $display to print signals during simulation.

Key Takeaways

Use the built-in nand primitive with syntax: nand (output, input1, input2);
Alternatively, model NAND using assign with negated AND: assign output = ~(input1 & input2);
Always test all input combinations to confirm correct NAND behavior.
Avoid using and primitive when NAND logic is needed.
Use $display in testbenches to observe signal values during simulation.