Synthesizable vs non-synthesizable constructs in VHDL - Performance Comparison
When writing VHDL code, some parts can be turned into hardware, while others cannot.
We want to see how the time to run the code changes depending on which parts are synthesizable.
Analyze the time complexity of the following VHDL code snippet.
process(clk)
begin
if rising_edge(clk) then
for i in 0 to N-1 loop
data_out(i) <= data_in(i) and enable;
end loop;
end if;
end process;
This code copies and masks an input array to an output array on each clock edge.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that runs from 0 to N-1 copying and masking each element.
- How many times: It runs once every clock cycle, repeating N times inside that cycle.
As N grows, the number of operations inside the clock cycle grows linearly.
| Input Size (N) | Approx. Operations per Clock |
|---|---|
| 10 | 10 |
| 100 | 100 |
| 1000 | 1000 |
Pattern observation: Doubling N doubles the work done each clock cycle.
Time Complexity: O(N)
This means the work grows directly with the size of the input array.
[X] Wrong: "All VHDL code runs in constant time because hardware is parallel."
[OK] Correct: Some constructs like loops inside clocked processes run sequentially each cycle, so time grows with loop size.
Understanding which VHDL parts become hardware and how they affect timing helps you design efficient circuits and explain your design choices clearly.
What if we replaced the for-loop with parallel assignments? How would the time complexity change?
Practice
Solution
Step 1: Identify synthesizable constructs
Synthesizable code must describe hardware behavior, typically using clocked processes without delays or waits.Step 2: Analyze each option
A process with only clocked assignments and no wait statements uses clocked assignments without waits, so it is synthesizable. Options A, B, and D use waits, assertions, or file I/O, which are non-synthesizable.Final Answer:
A process with only clocked assignments and no wait statements -> Option DQuick Check:
Synthesizable = clocked process without wait [OK]
- Thinking wait statements are synthesizable
- Confusing assert for hardware logic
- Assuming file I/O can be synthesized
Solution
Step 1: Understand wait statement restrictions
Wait statements likewait until clk = '1';are not synthesizable because hardware cannot implement arbitrary waits.Step 2: Check other options
Options A, B, and C are standard synthesizable constructs: clock edge detection, signal assignments in processes, and concurrent assignments.Final Answer:
A process with a wait until clk = '1'; statement -> Option AQuick Check:
Wait statements = non-synthesizable [OK]
- Assuming wait until is synthesizable
- Confusing sensitivity list with wait statements
- Thinking concurrent assignments are non-synthesizable
process(clk)
begin
if rising_edge(clk) then
if reset = '1' then
q <= '0';
else
q <= d;
end if;
end if;
end process;Solution
Step 1: Analyze reset behavior inside clocked process
The reset check is inside the rising_edge(clk) condition, so reset is synchronous.Step 2: Understand output assignment timing
q is assigned '0' only on clock edge when reset is '1', otherwise q follows d on clock edges.Final Answer:
q synchronously resets to '0' on clock edge when reset is '1' -> Option AQuick Check:
Synchronous reset inside clock edge = q synchronously resets to '0' on clock edge when reset is '1' [OK]
- Thinking reset is asynchronous here
- Assuming q changes immediately without clock
- Ignoring the rising_edge condition
process(clk) begin wait until clk = '1'; q <= d; end process;
Solution
Step 1: Check for wait statement usage
Wait statements inside processes are not synthesizable and cause synthesis errors.Step 2: Verify other syntax elements
The process has a sensitivity list (clk), signal assignment is inside process, and <= is correctly used.Final Answer:
Using wait statement inside a clocked process -> Option CQuick Check:
Wait inside process = synthesis error [OK]
- Ignoring that wait is not synthesizable
- Confusing sensitivity list with wait usage
- Thinking <= operator is wrong here
Solution
Step 1: Identify testbench constructs
Testbenches often usewait forstatements to simulate timing delays, which are non-synthesizable.Step 2: Compare with synthesizable constructs
Options A, C, and D describe synthesizable hardware behavior, not simulation-only code.Final Answer:
A process with wait for 20 ns; to generate clock signals -> Option BQuick Check:
Wait for delays = simulation only [OK]
- Using wait for in synthesizable design code
- Confusing testbench and design code constructs
- Assuming clocked processes are non-synthesizable
Ready to prove it?
Pass the test and this pattern moves unknown
