Pure and impure functions help us understand how functions behave in VHDL. Pure functions always give the same output for the same input and do not change anything outside. Impure functions might do more, like reading signals or depending on outside values.
Pure vs impure functions in VHDL
function function_name (parameters) return return_type is -- function body end function function_name;
Use the keyword pure before function to declare a pure function.
Use the keyword impure before function to declare an impure function.
a and b without changing anything else.pure function add(a : integer; b : integer) return integer is begin return a + b; end function add;
impure function get_signal_value return std_logic is begin return some_signal; end function get_signal_value;
This VHDL example shows a pure function pure_add that adds two integers and an impure function read_signal that reads a signal value. The process reports their results.
library ieee; use ieee.std_logic_1164.all; entity example is end entity example; architecture behavior of example is signal some_signal : std_logic := '1'; pure function pure_add(a : integer; b : integer) return integer is begin return a + b; end function pure_add; impure function read_signal return std_logic is begin return some_signal; end function read_signal; begin process variable result : integer; variable sig_val : std_logic; begin result := pure_add(3, 4); sig_val := read_signal; report "Pure function result: " & integer'image(result); report "Impure function signal value: " & std_logic'image(sig_val); wait; end process; end architecture behavior;
Pure functions cannot read or write signals or variables outside their parameters.
Impure functions can access signals outside their parameters, so their output might change even with the same inputs.
Use pure functions when you want predictable, side-effect-free behavior.
Pure functions always return the same output for the same inputs and do not affect anything outside.
Impure functions can read external signals, so their output may vary.
Choosing between pure and impure depends on whether you need to read external signals or not.
Practice
pure function in VHDL?Solution
Step 1: Understand pure function behavior
A pure function in VHDL must always return the same result for the same inputs and cannot change any external signals or variables.Step 2: Compare options with definition
It always returns the same output for the same inputs and does not modify any external signals. matches this definition exactly, while others describe impure or unrelated behaviors.Final Answer:
It always returns the same output for the same inputs and does not modify any external signals. -> Option AQuick Check:
Pure function = consistent output, no side effects [OK]
- Confusing pure with impure functions
- Thinking pure functions can modify signals
- Assuming pure functions can read external signals
pure function in VHDL?Solution
Step 1: Recall VHDL function declaration syntax
In VHDL, to declare a pure function explicitly, you add the keywordpureafter the function signature.Step 2: Identify correct syntax
function add(a: integer; b: integer) return integer is pure;correctly usesis pure;to declare a pure function. The procedure declaration is not a function,function add(a: integer; b: integer) return integer is impure;declares an impure function, andfunction add(a: integer; b: integer) return integer;lacks purity specification.Final Answer:
function add(a: integer; b: integer) return integer is pure; -> Option BQuick Check:
Pure function declaration includes 'is pure;' [OK]
- Omitting 'pure' keyword for pure functions
- Confusing procedures with functions
- Using 'impure' when pure is needed
function get_value(x: integer) return integer is variable count: integer := 0; begin count := count + 1; return x + count; end function;
What is true about this function?
Solution
Step 1: Analyze variable usage inside function
The local variablecountis initialized to 0 each time the function is called, incremented to 1, andx + countalways returnsx + 1for the samex.Step 2: Determine purity based on output consistency
Same inputs always produce the same output with no external modifications, making it pure. The claim about a changing variable ignores reinitialization, using variables inside is allowed, and there are no external signals.Final Answer:
It is a pure function because it returns a value based on input only. -> Option DQuick Check:
Local variables reinitialized each call = pure [OK]
- Thinking local variables make function impure
- Confusing external signals with local variables
- Believing the function output changes across calls
function multiply(a: integer; b: integer) return integer is pure; begin result := a * b; return result; end function;
What is the error in this code?
Solution
Step 1: Check variable declarations inside function
The function usesresultwithout declaring it as a variable or signal inside the function.Step 2: Understand VHDL variable scope rules
All variables must be declared before use. Sinceresultis undeclared, this causes a compilation error.Final Answer:
The function uses an undeclared variable result. -> Option CQuick Check:
All variables must be declared before use [OK]
- Assuming implicit variable declaration
- Confusing pure/impure with variable declaration errors
- Ignoring missing return statements
clk_count and increments it each call. Which is true about this function?Solution
Step 1: Understand function interaction with external signals
Reading and modifying a global signalclk_countmeans the function has side effects and depends on external state.Step 2: Determine purity based on side effects
Because the function changes external data, it cannot be pure and must be declared impure.Final Answer:
It must be declared impure because it reads and modifies external signals. -> Option AQuick Check:
Modifying external signals means impure function [OK]
- Thinking local variables can replace external signal changes
- Assuming functions can modify signals without impure keyword
- Confusing functions with procedures for side effects
Ready to prove it?
Pass the test and this pattern moves unknown
