Module as the basic building block in Verilog - Time & Space Complexity
We want to understand how the time it takes to run a Verilog module changes as the design grows.
How does adding more parts inside a module affect how long it takes to work?
Analyze the time complexity of the following code snippet.
module adder_array #(parameter N = 4) (
input wire [N-1:0] a,
input wire [N-1:0] b,
output wire [N-1:0] sum
);
genvar i;
generate
for (i = 0; i < N; i = i + 1) begin : adders
assign sum[i] = a[i] + b[i];
end
endgenerate
endmodule
This module adds two N-bit numbers bit by bit using a loop to create multiple adders.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The generate-for loop creates N adders that each perform one addition.
- How many times: The addition operation is repeated N times, once per bit.
Explain the growth pattern intuitively.
| Input Size (N) | Approx. Operations |
|---|---|
| 10 | 10 additions |
| 100 | 100 additions |
| 1000 | 1000 additions |
Pattern observation: As the number of bits N grows, the number of addition operations grows linearly.
Time Complexity: O(N)
This means the time to perform all additions grows directly in proportion to the number of bits.
[X] Wrong: "The module runs in constant time no matter how many bits it has."
[OK] Correct: Each bit requires its own addition, so more bits mean more work and more time.
Understanding how module size affects time helps you design efficient hardware and explain your design choices clearly.
"What if we replaced the generate loop with a single adder that handles all bits at once? How would the time complexity change?"
Practice
What is the main purpose of a module in Verilog?
Solution
Step 1: Understand what a module represents
A module in Verilog is a block that describes hardware behavior or structure.Step 2: Identify the purpose of modules
Modules help organize and reuse hardware design parts, not software or power control.Final Answer:
It defines a reusable block of hardware design. -> Option AQuick Check:
Module = reusable hardware block [OK]
- Thinking modules run software code
- Confusing modules with memory storage
- Assuming modules control power
Which of the following is the correct way to start and end a Verilog module named my_module?
?
Solution
Step 1: Recall Verilog module syntax
A module starts with the keywordmodulefollowed by the module name and ends withendmodule.Step 2: Check each option
module my_module(); endmodule uses correct keywords and syntax. Others use invalid keywords or punctuation.Final Answer:
module my_module(); endmodule -> Option BQuick Check:
module ... endmodule = correct syntax [OK]
- Using wrong keywords like start or finish
- Missing parentheses after module name
- Adding colons or semicolons incorrectly
What will be the output of the following Verilog module when input_a = 1 and input_b = 0?
module simple_and(input input_a, input input_b, output reg out);
always @(*) begin
out = input_a & input_b;
end
endmoduleSolution
Step 1: Understand the operation inside the module
The module assignsoutas the AND ofinput_aandinput_b.Step 2: Calculate the AND of inputs
Giveninput_a = 1andinput_b = 0, 1 & 0 = 0.Final Answer:
out = 0 -> Option DQuick Check:
1 AND 0 = 0 [OK]
- Assuming output equals one input directly
- Confusing AND with OR operation
- Ignoring that output is reg type
Identify the error in this Verilog module code:
module faulty_module(input a, input b, output reg c);
always @(*) begin
c = a | b
end
endmoduleSolution
Step 1: Check syntax inside always block
The assignmentc = a | bis missing a semicolon at the end.Step 2: Verify other parts
Usingregfor output is correct; sensitivity list@(*)is valid; module names can be lowercase.Final Answer:
Missing semicolon after assignment inside always block. -> Option CQuick Check:
Statements inside always need semicolons [OK]
- Forgetting semicolon after assignment
- Thinking output cannot be reg
- Believing sensitivity list must list signals explicitly
You want to create a Verilog module named counter that counts from 0 to 3 repeatedly using a 2-bit output count. Which module header and port declaration is correct?
Solution
Step 1: Identify correct port order and types
The clock inputclkshould be input, andcountis a 2-bit register output, declared asoutput reg [1:0] count.Step 2: Check each option
module counter(input clk, output reg [1:0] count); endmodule correctly declares ports and types. module counter(output reg [2:0] count, input clk); endmodule has wrong bit width. module counter(input clk, output [1:0] count); endmodule missesregfor output assigned inside always block. module counter(input clk, output reg count[1:0]); endmodule uses incorrect syntax for bus declaration.Final Answer:
module counter(input clk, output reg [1:0] count); endmodule -> Option AQuick Check:
Output reg [1:0] count with input clk = correct [OK]
- Forgetting 'reg' for output assigned in always block
- Incorrect bus declaration syntax
- Swapping input and output order
Ready to prove it?
Pass the test and this pattern moves unknown
