Bird
Raised Fist0
VHDLprogramming~5 mins

Pure vs impure functions in VHDL

Choose your learning style10 modes available
Introduction

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.

When you want a function that always returns the same result for the same inputs, like a calculator.
When you need a function that can read signals outside itself.
When writing reusable code blocks that should not cause side effects.
When modeling hardware behavior that depends only on inputs.
When you want to allow functions to access external signals.
Syntax
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.

Examples
This is a pure function. It always returns the sum of a and b without changing anything else.
VHDL
pure function add(a : integer; b : integer) return integer is
begin
  return a + b;
end function add;
This is an impure function because it reads a signal outside its parameters.
VHDL
impure function get_signal_value return std_logic is
begin
  return some_signal;
end function get_signal_value;
Sample Program

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.

VHDL
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;
OutputSuccess
Important Notes

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.

Summary

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

(1/5)
1. Which statement best describes a pure function in VHDL?
easy
A. It always returns the same output for the same inputs and does not modify any external signals.
B. It can modify signals outside its scope and may return different outputs for the same inputs.
C. It only reads external signals but does not modify them.
D. It is a function that uses variables inside a process.

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    It always returns the same output for the same inputs and does not modify any external signals. -> Option A
  4. Quick Check:

    Pure function = consistent output, no side effects [OK]
Hint: Pure means no side effects and consistent output [OK]
Common Mistakes:
  • Confusing pure with impure functions
  • Thinking pure functions can modify signals
  • Assuming pure functions can read external signals
2. Which of the following is the correct way to declare a pure function in VHDL?
easy
A. procedure add(a: in integer; b: in integer);
B. function add(a: integer; b: integer) return integer is pure;
C. function add(a: integer; b: integer) return integer is impure;
D. function add(a: integer; b: integer) return integer;

Solution

  1. Step 1: Recall VHDL function declaration syntax

    In VHDL, to declare a pure function explicitly, you add the keyword pure after the function signature.
  2. Step 2: Identify correct syntax

    function add(a: integer; b: integer) return integer is pure; correctly uses is 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, and function add(a: integer; b: integer) return integer; lacks purity specification.
  3. Final Answer:

    function add(a: integer; b: integer) return integer is pure; -> Option B
  4. Quick Check:

    Pure function declaration includes 'is pure;' [OK]
Hint: Pure functions use 'is pure;' in declaration [OK]
Common Mistakes:
  • Omitting 'pure' keyword for pure functions
  • Confusing procedures with functions
  • Using 'impure' when pure is needed
3. Consider this VHDL function:
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?
medium
A. It is impure because it uses a variable that changes each call.
B. It is impure because it modifies an external signal.
C. It is impure because it uses variables inside a function.
D. It is a pure function because it returns a value based on input only.

Solution

  1. Step 1: Analyze variable usage inside function

    The local variable count is initialized to 0 each time the function is called, incremented to 1, and x + count always returns x + 1 for the same x.
  2. 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.
  3. Final Answer:

    It is a pure function because it returns a value based on input only. -> Option D
  4. Quick Check:

    Local variables reinitialized each call = pure [OK]
Hint: Local variables reset each call, pure function [OK]
Common Mistakes:
  • Thinking local variables make function impure
  • Confusing external signals with local variables
  • Believing the function output changes across calls
4. This VHDL function is intended to be pure:
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?
medium
A. The function cannot have parameters.
B. The function should be declared impure because it modifies result.
C. The function uses an undeclared variable result.
D. The function lacks a return statement.

Solution

  1. Step 1: Check variable declarations inside function

    The function uses result without declaring it as a variable or signal inside the function.
  2. Step 2: Understand VHDL variable scope rules

    All variables must be declared before use. Since result is undeclared, this causes a compilation error.
  3. Final Answer:

    The function uses an undeclared variable result. -> Option C
  4. Quick Check:

    All variables must be declared before use [OK]
Hint: Declare all variables before using them [OK]
Common Mistakes:
  • Assuming implicit variable declaration
  • Confusing pure/impure with variable declaration errors
  • Ignoring missing return statements
5. You want to create a function in VHDL that returns the current value of a global signal clk_count and increments it each call. Which is true about this function?
hard
A. It must be declared impure because it reads and modifies external signals.
B. It can be pure if it only returns the value without incrementing.
C. It can be pure if it uses a local variable to track increments.
D. It must be a procedure, not a function.

Solution

  1. Step 1: Understand function interaction with external signals

    Reading and modifying a global signal clk_count means the function has side effects and depends on external state.
  2. Step 2: Determine purity based on side effects

    Because the function changes external data, it cannot be pure and must be declared impure.
  3. Final Answer:

    It must be declared impure because it reads and modifies external signals. -> Option A
  4. Quick Check:

    Modifying external signals means impure function [OK]
Hint: Modifying external signals requires impure functions [OK]
Common Mistakes:
  • Thinking local variables can replace external signal changes
  • Assuming functions can modify signals without impure keyword
  • Confusing functions with procedures for side effects
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard