VHDL Mug
VHDL Mug
User’s Guide
Version 2.4
3 - Introduction to VHDL
VHDL '93 ................................................................................... 3 - 2
Structure of a VHDL Design Description ................................... 3 - 3
Structural VHDL ......................................................................... 3 - 6
Data Flow VHDL ........................................................................ 3 - 8
Behavioral VHDL ....................................................................... 3 - 9
VHDL Types .............................................................................. 3 - 11
My model simulates, but.... ........................................................ 3 - 13
Some other issues .............................................................. 3 - 13
12 - Synthesis Attributes
Predefined attributes ............................................................... 12 - 2
User defined attributes ............................................................ 12 - 3
Attribute 'critical' ....................................................................... 12 - 4
Attribute 'enum_encoding' ....................................................... 12 - 5
Attribute part_name ................................................................. 12 - 5
Attribute pinnum ...................................................................... 12 - 6
Attribute property ..................................................................... 12 - 7
Atribute Xilinx_BUFG ............................................................... 12 - 9
Atribute Xilinx_GSR ................................................................. 12 - 10
Attribute foreign ....................................................................... 12 - 11
Attribute array_to_numeric ...................................................... 12 - 13
Attribute macrocell ................................................................... 12 - 15
Attribute Ungroup .................................................................... 12 - 16
Attribute Inhibit_buf .................................................................. 12 - 18
Attributes for Downstream Tools ............................................. 12 - 19
B - PREP Examples
PREP 1 ......................................................................................B - 2
PREP 2 ......................................................................................B - 5
PREP 3 ......................................................................................B - 7
PREP 4: Using enum_encoding ................................................B - 10
PREP 4: Using std_logic_1164 .................................................B - 15
PREP 5 ......................................................................................B - 21
PREP 6 ......................................................................................B - 23
PREP 7 ......................................................................................B - 24
PREP 9 ......................................................................................B - 25
D - Compile options
All formats: ......................................................................... D - 1
Cupl only: ........................................................................... D - 3
Open Abel 2 only: ............................................................... D - 4
XNF only (for XactStep 6.0) ............................................... D - 5
EDIF only ........................................................................... D - 5
This guide is intended for the engineer who is familiar with the principles of
hardware design, but has little experience in designing with a language-based
synthesis system. It describes the general concepts of synthesis, the general
organization and usage of VHDL, and provides specific information on how the
Metamor tool is used in this environment. It does not attempt to present the VHDL
language in depth, but does provide an example-based summary of VHDL syntax
that serves as a helpful reference for any user.
Notation Conventions
entity counter is
port (clk, reset: in bit; sum: out integer);
end counter ;
The information in this guide is subject to change without notice and does
not represent a commitment on the part of Metamor. The program described in this
guide is furnished under a license agreement and may not be used or copied
except in accordance with the terms of the agreement.
Design I/O
Combinational Logic
State Machines
Hierarchy
Compiling
Types
Debugging
Downstream Tools
How to be Happy
See Also
entity ent1 is
port(a0,a1,b0,b1 : in std_logic; c0, c1 : out std_logic) ;
end ent1;
entity ent2 is
port(a,b : std_logic_vector(0 to 5);
sel : std_logic; c : out std_logic_vector(0 to 5)) ;
end ent2;
INOUT and BUFFER are used to specify routing on ports. An INOUT port
specifies bi-directional dataflow, and a BUFFER port is a unidirectional OUT that
you can read from. INOUT describes a signal path that runs through a pin and back
into the design: "pin feedback" in PLDs or an IO block in some FPGAs. BUFFER
describes a signal path that drives an output buffer to a pin and internal logic:
"register feedback" in PLDs or internal routing in FPGAs. INOUT is required to
specify pin feedback. Register feedback may be specified using BUFFER or using
OUT and an extra signal.
•library ieee;
•use ieee.std_logic_1164.all;
The equations assign values to signals. Ports are examples of signals; all
signals must be declared before they are used. We could describe a two bit adder
using boolean equations :
Note that omitting the 'else b' above would specify a latch:
q <= '0' when rst = '1' else d when clk = '1' and clk'event
library ieee;
use ieee.std_logic_1164.all;
entity counter is
port (a0,a1,b0,b1,clk : in std_logic; c0, c1 : out std_logic) ;
end counter;
begin
d <= b0 and a0;
e <= b1 xor a1;
f <= (b0 and not a0) or (not b0 and a0);
g <= (e and not d) or (not e and d);
begin
d <= b0 and a0;
e <= b1 xor a1;
f <= (b0 and not a0) or (not b0 and a0);
g <= (e and not d) or (not e and d);
process(clk)
begin
if rising_edge(clk) then
q <= d;
end if;
end process;
library ieee;
use ieee.std_logic_1164.all;
entity ent5 is
port (clk,reset : in std_logic;
p : buffer std_logic_vector(1 downto 0));
end ent5 ;
---Child
library ieee;
use ieee.std_logic_1164.all;
entity Child is
port (I : std_logic_vector(2 downto 0) ;
O : out std_logic_vector(0 to 2));
end Child;
architecture behavior of Child is
begin
o <= i;
end;
---Parent
use ieee.std_logic_1164.all;
entity Parent is
port(a : std_logic_vector(7 downto 5);
v : out std_logic_vector( 1 to 3));
end Parent;
architecture behavior of Parent is
-- component declaration , bound to Entity Child above
component Child
port (I : std_logic_vector(2 downto 0) ;
O : out std_logic_vector(0 to 2));
end component;
begin
-- component instantiation
u0 : Child port map (a,v);
end;
package type_defs is
subtype very_short is integer range 0 to 3;
end type_defs;
library ieee;
use ieee.std_logic_1164.all;
use work.type_defs.all;
entity counter2 is
port (clk, reset : std_logic; p : buffer very_short);
end counter2 ;
In this example we used type integer because the "+" operator is defined
for integers, but not for std_logic_vectors, which we have been using up to now.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter2 is
port (clk, reset : std_logic;
p : buffer std_logic_vector(1 downto 0));
end counter2 ;
Simulate your VHDL design before synthesis using a third party VHDL
simulator. This allows you to verify the specification of your design. If you don't
have a VHDL simulator, run Metamor with the compile option optimize set to zero
(to minimize compile time), and simulate the output with your equation or gate level
simulator.
Hierarchy
Check the size of the logic in this module. Is it about what you expected?
Using hierarchy to represent the modules of your design will result in faster
and better optimization, and may allow you to reuse these design units in future
designs.
Attribute 'critical'
The name of the VHDL signal will be maintained -- but may be prefixed
with instance, block labels, or package names, and suffixed with a "_n", if it
represents more than one wire.
This information lists the inferred structure. The name field represents the
name of an inferred logic element. The name will be a local signal or variable name
from within the VHDL source code. The name of the structure in the output file will
be derived within a larger context and may be different. If no user recognizable
name exists, the name field will contain "[anonymous]". The bit field is optional. A
macrocell name will be a predefined Xblox or LPM name.
Note that the design statistics printed at the end of the compile may not be
the same as the sum of the per process inference information. There are three
possible reasons for this:
The VHDL report statement specifies no logic and is useful for following
the execution of the compiler -- perhaps to see when functions are called or to see
iterations of a loop. For example:
entity loop_stmt is
port (a: std_logic_vector (0 to 3);
m: out std_logic_vector (0 to 3));
end loop_stmt;
The supported features depend on the output format and the way it
supports properties. The output format depends on the OEM environment that calls
the compiler. See Attributes for Downstream Tools.
The single most productive thing you can do is to be aware of what, and
how much hardware you are describing using an HDL. This guide attempts to
provide you with the information you will need. With this approach you can expect
to be happy with the results.
VHDL '93
Structural VHDL
Behavioral VHDL
VHDL Types
VHDL is a large language and it provides many features. This guide does
not attempt to describe the full language -- rather it introduces enough of the
language to enable useful design.
Package (optional)
concurrent statements
Signal declaration
Signal assignment
Variable assignment
Procedure call
If, case, loop, next, exit ,return
Wait statement
Later we will discuss sequential logic (logic with memory elements such as
flip-flops). Sequential statements in VHDL refer to statement ordering, not to the
type of logic compiled. Sequential statements may be used to compile both
combinational and sequential logic.
entity hello is
port (clock, reset : in boolean; char : out character) ;
end hello;
-- Counter
process (reset,clock)
begin
if reset then
step <= 1;
elsif clock and clock'event then
if step = char_sequence'high then
step <= 1;
else
step <= step + 1;
end if;
end if;
end process ;
-- Output Decoder
char <= char_sequence(step);
end behavioral ;
The design in the following example has been partitioned into two
instantiated components. Note that the components are declared but not defined
in the example. The components would be defined as entity/architecture as
discussed in 9 - Managing Large Designs.
component counter
port (clock , reset : in boolean; num : out short ) ;
end component;
component decoder
port (num : in short ; res : out character) ;
end component;
begin
U0 : counter port map (clock,reset,step);
U1 : decoder port map (step,char);
end structural;
This is useful if counter and decoder had been previously created and
compiled into two PALs. The availability of a larger PAL allows us to integrate the
design by instantiating these as components and compiling for the larger device.
a <= b and c;
m <= in1 when a1 else in2;
entity hello is
port (clock , reset: in boolean; char : out character ) ;
end hello;
begin
-- Output decoder
char <= char_sequence(step1);
-- Counter logic
step1 <= 1 when step0 = char_sequence'high else step0 + 1;
process (insig)
variable var1: integer;-- variable declaration
begin
var1:= insig; -- variable assignment
var1:= function_name(var1 + 1); -- function call
end process;
In hardware design we use the process statement in two ways: one for
combinational logic and one for sequential logic. To describe combinational logic
the general form of the process statement is :
process (clock_signal)
begin
if clock_signal and clock_signal'event then
....
end if;
end process;
For combinational logic there is a list of all process input signals after the
keyword process. For sequential logic there is either: (a) no sensitivity list but there
is a wait statement; or (b) a sensitivity list containing the clock and the statements
are within an if statement.
It is illegal in VHDL for a process to have both a sensitivity list and a wait
statement. To have neither implies no logic. Combinatorial logic is discussed in 4 -
Programming Combinational Logic, sequential logic in 5 - Programming Sequential
Logic.
entity hello is
port (clock, reset : in boolean; char : out character) ;
end hello;
end behavioral ;
3 - 10 3 - Introduction to VHDL
VHDL Types
VHDL contains the usual programming language data types, such as:
• boolean
• character
• integer
• real
• string
These types have their usual meanings. In addition, VHDL has the types:
• bit
• bit_vector
The type bit can have a value of '0' or '1'. A bit_vector is an array of bits.
(Similarly, a string is an array of characters in VHDL just as it is in Pascal).
• std_logic
• std_logic_vector
• library ieee;
• use ieee.std_logic_1164.all;
For an example see Fifo. For more info see VHDL Design Libraries and
Metamor VHDL Libraries.
Definitions for all of the predefined types can be found in the file std.vhd,
which contains the package standard.
3 - Introduction to VHDL 3 - 11
The type of a variable, signal, or constant (which are collectively called
objects) determines the operators that are predefined for that object. For hardware
design, the type also determines the number -- and possibly the encoding scheme
used -- for the wires that are implemented for that object.
3 - 12 3 - Introduction to VHDL
My model simulates, but....
This section is primarily for experienced VHDL simulation users who have
VHDL code that has been developed using a VHDL simulator.
Synthesis assumes that the VHDL code describes the logic of a design,
and not some model of the design. This assumption puts additional constraints on
the programmer. Most of the remainder of this guide describes how to program in
VHDL within these constraints.
For example, suppose you have a VHDL simulation model of a PAL, lets
say the model configures itself from a JEDEC file during simulation initialization.
The model actually simulates the programming and logic of the PAL. It describes
more than just the hardware, the model also describes the manufacturing step
when the PAL was programmed. A synthesizable VHDL model would only
describe the component function and not the earlier manufacturing step.
3 - Introduction to VHDL 3 - 13
A simulation model may use enumerated types to:
3 - 14 3 - Introduction to VHDL
4 - Programming Combinational Logic
Combinational Logic
Logical Operators
Relational Operators
Arithmetic Operators
Control Statements
Tristates
Certain operators are generally restricted to use with specific types. See
Logical Operators and Arithmetic Operators for more information.
In VHDL, operators can also be redefined for any type. This is known as
operator overloading, but it is outside the scope of this guide.
• and
• or
• nand
• nor
• xor
• xnor
• not
These operators are defined for the types bit, boolean and arrays of bit or
boolean (for example, bit_vector). The compilation of logic is fairly direct from the
language construct, to its implementation in gates, as shown in the following
examples:
entity logical_ops_1 is
port (a, b, c, d: in bit; m: out bit);
end logical_ops_1;
entity logical_ops_2 is
port (a, b: in bit_vector (0 to 3); m: out bit_vector (0 to 3));
end logical_ops_2
c
d
a_0
m_0
b_0
a_1
m_1
b_1
a_2
m_2
b_2
a_3
m_3
b_3
Relational Operators
VHDL provides the following relational operators:
= Equal to
/= Not equal to
> Greater than
< Less than
>= Greater than or equal to
<= Less than or equal to
The equality operators ( = and /= ) are defined for all types. The ordering
operators ( >=, <=, >, < ) are defined for numeric types, enumerated types, and
some arrays. The resulting type for all these operators is boolean.
The simple comparisons, equal and not equal, are cheaper to implement
(in terms of gates) than the ordering operators. To illustrate, the first example below
uses an equal operator and the second uses a greater-than-or-equal-to operator.
As you can see from the schematic, the second example uses more than twice as
many gates as the first.
entity relational_ops_1 is
port (a, b: in bit_vector (0 to 3); m: out boolean);
end relational_ops_1;
entity relational_ops_2 is
port (a, b: in integer range 0 to 3; m: out boolean);
end relational_ops_2;
a_2
b_2
a_3
b_3
a>=b
b_0
a_0
b_1
a_1
b_2
a_2
b_3
a_3
m
Arithmetic Operators
The arithmetic operators in VHDL are defined for numeric types.
These are:
+ Addition
- Subtraction
* Multiplication
/ Division
mod Modulus
rem Remainder
abs Absolute Value
** Exponentiation
The following example illustrates the logic due to an addition operator (and
the use of package and type declaration):
package example_arithmetic is
type small_int is range 0 to 7;
end example_arithmetic;
use work.example_arithmetic.all;
entity arithmetic is
port (a, b: in small_int; m: out small_int);
end arithmetic;
architecture example of arithmetic is
begin
m <= a + b;
end example;
b_0
c_1
a_1
b_1
a_2 c_2
b_2
Control Statements
VHDL provides the following concurrent statements for creating
conditional logic:
• if
• case
entity control_stmts is
port (a, b, c: boolean; m: out boolean);
end control_stmts;
All possible cases must be used for selected signal assignments. You can
be certain of this by using an others case:
entity control_stmts is
port (sel: bit_vector (0 to 1); a,b,c,d : bit; m: out bit);
end control_stmts;
entity control_stmts is
port (a, b, c: boolean; m: out boolean);
end control_stmts;
entity control_stmts is
port (sel: bit_vector (0 to 1); a,b,c,d : bit; m: out bit);
end control_stmts;
a m
case
sel_1
sel_0
d
Subprograms and Loops
VHDL provides the following constructs for creating replicated logic:
• generate
• loop
• for loop
• while loop
• function
• procedure
entity loop_stmt is
port (a: bit_vector (0 to 3); m: out bit_vector (0 to 3));
end loop_stmt;
entity loop_stmt is
port (a: bit_vector (0 to 3); m: out bit_vector (0 to 3));
end loop_stmt;
entity subprograms is
port (a: bit_vector (0 to 2); m: out bit_vector (0 to 2));
end subprograms;
a_1
m_2
a_2
m_1
a_3 m_0
subprogram
a_0
m_2
a_1
m_1
a_2
m_0
Shift and Rotate Operators
VHDL provides the following shift and rotate operators:
• sll
• srl
• sla
• sra
• rol
• ror
The left operand may be a one dimensional array whose element type is
either BIT or BOOLEAN, and the right operand is of type INTEGER. If the right
operand is a constant (or a metalogic expression), these operations imply no logic.
entity sr_1 is
port (a, b,c: in bit_vector (5 downto 0 );
ctl : integer range 0 to 2**5 -1;
w,x,y: out bit_vector (5 downto 0);
end sr_1
Note that a negative right argument means a shift or rotate in the opposite
direction. If the right argument is non constant (not metalogic expression), and has
a subtype which has a range that includes a negative number, a bidirectional shift
or rotate structure will be constructed. This can be very expensive. For example :
library ieee;
use ieee.std_logic_1164.all;
entity tbuf2 is
port (enable : boolean;
a : std_logic_vector(0 to 4);
m : out std_logic_vector(0 to 4));
end tbuf2;
begin
process (enable, a)
if enable then
m <= a;
else
m <= 'Z';
end if;
end process;
end;
The assignment of null to a signal of kind bus turns off its driver. When
embedded in an if statement, a null assignment is synthesized to a tristate buffer.
package example_bus is
subtype bundle is bit_vector (0 to 4);
end example_bus;
use work.example_bus.all;
entity tbuf is
port (enable: boolean; a: bundle; m: out bundle bus);
end tbuf;
Sequential Logic
Latches
Flip-Flops
Synchronous Set/Reset
Asynchronous Load
The techniques shown here may be extended to specify Set and Reset,
both synchronous and asynchronous, as shown in later sections. There are often
several ways to describe a particular behavior, the following examples typically
show two styles each, however, there is no particular 'right' style. The choice of
style is simply that which helps the programmer specify the clearest description of
the particular design.
For example, the designer may choose to copy the procedures for latches
and flip-flops from the following examples, and describe a design in terms of
equations and procedure calls as shown in Registers and Tri-state.
There are three major methods to program this register behavior: using
conditional specification , using a wait statement, or using guarded blocks.
Conditional specification is the most common method.
if clk then
y <= a;
else
-- do nothing
end if;
This describes the behavior of a latch, if the clock is high the output (y) gets
a new value, if not the output retains its previous value. Note that if we had
assigned in both conditions, the behavior would be that of a mux:
if clk then
y <= a;
else
y <= b;
end if;
if clk then
-- do nothing
else
y <= a;
end if;
Or more concisely:
In all these cases the number of registers or the width of the mux are
determined by the type of the signal "y";
Wait Statement
Guarded Blocks
-- A Process statement :
-- A Process statement :
As with any kind of hardware design, there is a risk that gated clocks may
cause glitches in the register clock, and hence produce unreliable hardware. You
need to be aware of the constraints of the target hardware and, as a general rule,
use only simple logic in the if expression.
if clk1 then
if ena then
-- register assignments here
end if;
end if;
This will connect 'ena' to the register clock enable if the clock enable
compile option is used. If the clock enable option is not used then the data path will
be gated with 'ena'. In neither case will 'ena' gate the 'clk1' line.
-- Set:
process (clk)
begin
if clk and clk'event then-- clock rising
if set then
y <= true;-- y is type boolean
else
y <= a and b;
end if;
end if;
end process;
y <= false when reset else a when clk and clk 'event else y;
if if expression then
then branch
else
else branch
end if;
Reset/Preset
Clock
One branch of the if statement assigns to the register, the other branch
does not assign to the register (or assigns the register output). A register is inferred
because its value is incompletely specified.
Clock Enable
One branch of the if statement assigns to the register input in the clock
expression, the other branch does not assign to the register. Must occur
immediately within the clock if statement.
Control signals are inferred with the following priority, listed with the
highest priority first (not all combinations are supported) :
Introduction
Feedback Mechanisms
Moore Machine
Mealy Machine
This section shows the relationship between these machines and VHDL
code. Each example illustrates a single machine. This is not a constraint, just a
simplification. If there were multiple machines, they could have different clocks. In
this case, synchronization would be the responsibility of the designer.
Feedback on signals
c
a
clk
reset
clk
reset
B C D
F1 Register F2
A
clock
entity system is
port (clock: boolean; a: some_type;.d: out some_type);
end system;
If the system timing requires no logic between the registers and the output
(the shortest output propagation delay is desired), the following architecture could
be used:
Output
F Register
A D
clock
If the system timing requires no logic between the registers and the input
(if a short setup time is desired), the following architecture could be used:
Input
Register
D
F
A
Input
Register
clock
B D
F1 Register F2
C
A
clock
Seven-Segment Decoder
Craps Game
Blackjack
A Simple ALU
Hello
Fifo
use work.seven.all;
entity decoder is
port (input: bcd; drive: out segments);
end decoder;
use work.gamble.all;
entity craps is
port (roll, new_game: boolean; number: dice; win,
loss: out boolean);
end craps;
architecture no_cheating of craps is
begin
process (roll, new_game,number)
variable first_roll: boolean;
variable point: dice;
constant snake_eyes: dice := 2;
begin
if newgame then-- async reset
first_roll := true;
win <= false;
loss <= false;
point := 0;
elsif roll and roll'event then-- clock
if first_roll then
first_roll := false;
if number = 7 or number = 11 then
win <= true;
elsif number = snake_eyes then
loss <= true;
else
point := number;
end if;
-- decode outputs
end;
process ( clk )
begin
if clk'event and clk then
if reset then
tlc_state <= highway_green;
set_timer <= false;
else
set_timer <= false;
case tlc_state is
when highway_green =>
if farm_traffic and long_timeout then
tlc_state <= highway_yellow;
set_timer <= true;
end if;
use work.alu_types.all;
entity alu is
port (a: buffer data_path; instr: ops;
clk: boolean; b: data_path);
end alu;
begin
wait until clk;
case instr is
when add => a <= a + b; -- Uses "+" function.
when nop => null; -- A null statement,
when op_and =>a <= a and b;
when op_or => a <= a or b;
when shl => a <= shiftl(a);
when shr => a <= shiftr(a);
when load => a <= b;
when loadc => a <= not b;
end case;
end process;
end simple;
entity hello is
port (clock, reset: in boolean; char: out character);
end hello;
counter : process
begin
wait until clock;
if reset then
step <= 1;
else
if step = char_sequence'high then
step <= 1;
else
step <= step +1;
end if;
end if;
end process;
entity hello is
port (clock, reset: in boolean; char: out character);
end hello;
entity hello is
port (clock , reset: in boolean; char : out character) ;
end hello;
library ieee;
use ieee.std_logic_1164.all;
entity fifo4 is
- change size of fifo by changing vales of generics
generic(FifoDepth : integer := 16;
FifoWidth : integer := 5);
port(D : std_logic_vector(FifoWidth - 1 downto 0);
Rst : std_logic;
Oe : std_logic;
Ldclk : std_logic;
Unclk : std_logic;
Empty : buffer std_logic; -- these outputs are fed back
Full : buffer std_logic; -- to flip-flop clock enable
Full_2 : out std_logic;
Empty_2: out std_logic;
Q : out std_logic_vector(FifoWidth - 1 downto 0));
end fifo4;
-- constant
constant tristate : data_path := (others => 'Z');
constant dont_care : data_path := (others => '-');
begin
-- FifoDepth flip-flops with clock enable,
-- low bit preset, rest are reset
read_ring_counter:
ring_counter (Rst, Unclk, Empty, ReadPtr);
end dataflow;
Introduction
Enumerated Types
Numeric Types
Each subtype declaration defines a subset of its type and can specify the
number or wires, and possibly the encoding scheme.
For example:
The definition of the encoding may contain a string consisting of '0' '1' 'Z'
'M' or '-', delimited by whitespace. The encoding of each enumerated element must
have the same number of characters. Each encoding should be unique. The
encoding 'Z' represents a high impedance, the encoding '-' represents a dont care,
and the encoding 'M' represents a metalogic value.
Users must be aware that the enum_encoding attribute allows the user to
redefine the semantics of an enumerated type. In certain cases this may results in
synthesis creating logic that does not have the same behavior as the original VHDL
source! In general, this is not a big problem; it is, however, a pitfall to be aware of,
as explained below.
This type and its derivatives 'std_logic' and 'std_logic_vector' are often
used in VHDL simulation. This allows the user to maintain information about the
simulation model itself as well as describe the design. The values 'U' 'X' 'W'
and ‘-’ are referred to as metalogical values because they represent the state of a
model rather than the logic of a design.
The 'U' 'X' 'W' and '-' values have the same synthesis semantics -- except
as arguments to the IEEE Standard 1076.3 function STD_MATCH. The semantics
are defined in 1076.3 and allow dont care logic optimization if evaluation results in
assigning a metalogic value or dont care value.
User defined encoding may be used to specify one hot encoding. For
instance, in Prep 4 the enumerated type 'state_type' could be redefined as one hot
simply by changing the enum_encoding attribute. There are two possible forms:
The number of wires that are synthesized depends on the value in its
subtype declaration that has the largest magnitude. The smallest magnitude is
assumed to be zero for numeric types.
Floating point numbers are constrained to have the same set of possible
values as integers -- even though they can be represented using floating point
format with a positive exponent.
Warning: Take great care when using signed scalar numbers. These are
encoded as twos-complement, which is a fixed width encoding.
This can be a problem when mixing objects that have different signed
subtypes -- each will have different widths and result in unexpected behavior. This
is not a problem during simulation since these objects are always encoded as a
fixed , 32 bit, width.
If the type of the object to which the result is assigned has fewer bits than
either of the operands, the result of the numeric operations is truncated.
For example, a "+" generates a carry that will be truncated , used , or sign
(or zero) extended, according to the type of the object to which the result is
assigned.
Using Hierarchy
Blocks
Direct Instantiation
Hierarchical Compilation
It is not necessary (and possibly not even a good idea)to compile a whole
design in one pass. Large designs are commonly compiled in multiple partitions
and the resulting netlists linked together. Since you can compile more than one
entity/architecture in one pass, compile granularity is distinct from optimize
granularity. Compile methodology is discussed in Compiling.
From the point of view of the VHDL code, you don’t have to do anything
special for hierarchical compile (although there are some constraints imposed by
netlist semantics Hierarchical compile). Simply compile the parent without the
Child :
---Parent
library ieee;
use ieee.std_logic_1164.all;
entity Parent is
port(a : std_logic_vector(7 downto 5);
v : out std_logic_vector( 1 to 3));
end Parent;
architecture behavior of Parent is
-- component declaration , unbound
component Child
port (I : std_logic_vector(2 downto 0) ;
O : out std_logic_vector(0 to 2));
end component;
begin
-- component instantiation
u0 : Child port map (a,v);
end;
It is also possible that the Child is never defined to the synthesis tool, but
defined by a downstream tool. You can use this to specify primitives in the target
hardware. The primitives could be as simple as I/O buffers, or clock buffers. They
might also be a pre-defined component such as a special counter, or an XBLOX
or LPM macrocell. For simulation using third party tools prior to simulation you may
need simulation models of such components. These models should not be visible
to the synthesis compiler.
---Parent
library ieee;
use ieee.std_logic_1164.all;
entity Parent is
port(a : std_logic_vector(7 downto 5);
v : out std_logic_vector( 1 to 3));
end Parent;
architecture behavior of Parent is
-- component declaration , unbound
component IN_BUF_3
port (I : std_logic_vector(2 downto 0) ;
O : out std_logic_vector(0 to 2));
end component;
component OUT_BUF_3
port (I : std_logic_vector(2 downto 0) ;
O : out std_logic_vector(0 to 2));
end component;
signal x : std_logic_vector(2 downto 0);
--you may need to add this attribute , see the text below.
attribute macrocell : Boolean;
attribute macrocell of IN_BUF_3, OUT_BUF_3 : component is true;
If a design contains multiple design entities, you need to specify which one
is used as the root (top level) of the design. Metamor's default is the last entity
analyzed. You can override this default by using the elaborate compile option.
package example_package is
type shared_enum is (first, second, third, last);
end example_package;
use work.example_package.all;
entity design_io is
...
end design_io;
Placing a use clause before an entity causes the contents of the specified
package to be visible to that entity and its architecture(s), but nowhere else.
The work library is the default name of the current library. For now, just
treat it as template and always include it in the use clause.
Since the VHDL visibility rules ignore file boundaries, the package might
be in one file, the use clause and entity declaration in another, and the architecture
in a third file. VHDL requires that these units have already been analyzed when
they are referenced in the code, therefore the order in which the files are specified
to the compiler is important. It is not required that design units be placed in different
files.
Libraries are made visible within the source code by the library statement.
To make the library units within the library visible outside the library, it is necessary
to add use statements:
library stuff;
use stuff.all;-- Makes visible all design units in stuff.
use useless.all;-- Makes all declarations in the design unit
named useless visible.
use stuff.useless.all;
There are two mechanisms for associating VHDL libraries with source
files. The first assumes a library statement directly specifies a file name, the
second uses a compile option to associate one or more files with a library name.
Power users will probably want to use the second mechanism. The first mechanism
provides a simple default support for libraries.
Direct association
Common uses are to add files such as the Synopsys library to the library
IEEE:
WORK my_pack.vhd
There are three special cases. Aliases of the library "std" are ignored. Also
the file metamor.vhd must be in a library named "metamor" ; and the file ieee.vhd
must be in a library named "ieee." It is not good practice to list unused files because
large libraries may use significant amounts of memory.
ieee.std_logic_1164
ieee.numeric_bit
This package is part of the IEEE 1076.3 Draft Standard VHDL Synthesis
Package. The package is supplied in binary compiled form. The source code is
available from the IEEE as part of the Standard.
This package defines numeric types and arithmetic functions for use with
synthesis tools. Two numeric types are defined:
The base element type is type BIT. The leftmost bit is treated as the most
significant bit. Signed vectors are represented in two's complement form. This
package contains overloaded arithmetic operators on the SIGNED and
UNSIGNED types. The package also contains useful type conversions functions,
clock detection functions, and other utility functions.
This package is in the binary file num_bit.mm0. To use this package the
library alias for IEEE should be set to num_bit.vhd. ( IEEE <path>\num_bit.vhd )
ieee.numeric_std
The base element type is type STD_LOGIC. The leftmost bit is treated as
the most significant bit. Signed vectors are represented in two's complement form.
This package contains overloaded arithmetic operators on the SIGNED and
UNSIGNED types. The package also contains useful type conversions functions.
metamor.attributes
metamor.array_arith
The documentation with the file describes the list of assumptions and
example usage. More examples of the use of these functions can be found in
vlbit.vhd and synopsys.vhd
vlbit.pack1076
You should validate using simulation and also check to see that the
number of registers used and their type (flip-flop/latch, preset/reset, sync/async)
are what you expected. When run in verbose mode, the compiler reports register
types, and number of instances.
ieee.std_logic_arith
ieee.std_logic_unsigned
These packages are versions of the Synopsys packages that have been
optimized for use with the Metamor compiler. When importing designs you should
validate using simulation and also check the number of registers used and their
type (flip-flop/latch, preset/reset, sync/async) to ensure they are what you
expected. When run in verbose mode the compiler reports register types, and
number of instances.
These packages are in the file synopsys.vhd (although they are not an
IEEE standard ). To use these packages the library alias for IEEE should be set to
include ieee.vhd and synopsys.vhd.
xblox.macros
This feature requires that the user maintain and link the resulting elements
of the hierarchy (components) external to Metamor. The user is also responsible
for checking the root and leaf interfaces for consistentcy. This feature is only
available with output formats that support hierarchy.
Because the binding between root and leaf is external to the VHDL
compiler (the user links these together) certain VHDL features are not available at
the hierarchical compilation boundary. The user is responsible to ensure that
component and entity port definitions match exactly. Some things to watch out for
include:
Introduction
Logic expressions
Metalogic expression
Metalogic values
(a and b) or c
d+e
Metalogic expression
An example of a simple metalogic expression is one using constants. In
VHDL examples might be:
for i in 4 to 9 loop
left(i) <= right(i+2);
end loop;
end to_integer;
Reviewing this function we can see that the variable 'w' depends only on
the initial value ( w: integer := 1; ) and the current value of 'w' (w := w + w). We can
say that 'w' is always a metalogical variable and the assignments to 'w' imply no
logic.
The variable 'result' depends on the initial value of 'result' (metalogic), the
value of 'w' (metalogic), and 'arg', which depends on the argument the function is
called with. If the function is called with a metalogic parameter, say :
to_integer("010101");
then arg is a constant, and hence metalogic. It also follows that 'result' is
metalogic. The function implies no logic, just pull up and pull down. However, if the
function were called with a logical parameter, arg would not be metalogic, so
hardware is implied. For example:
to_integer(some_signal);
In this case the algorithm implemented is such that the hardware is simply
wires. (hint: a binary representation of 'w' is always a single 1 and many 0s).
Within VHDL, the only common use of metalogic values is some of the
elements of the enumerated type std_ulogic :
The IEEE standard 1076.3 specifies that four of these values ( ‘U’ ‘X’ ‘W’
‘-’ ) are metalogic values, with specific semantics. However, to a simulator they are
just elements of an enumerated types. For synthesis we make use of the attribute
'enum_encoding' to describe which elements describe logic values and which
describe metalogic values (see Std_logic_ll64 ). Metamor follows the standard and
considers '0' , '1', 'Z'. ‘L’ and ‘H’ as logic values and the remainder as metalogic
values. The metalogic values may be used within Metamor's logic minimization.
assert not isome_signal = ‘X’ report "unknown, bad news" severity error;
if is_x('W') then
assert false report "simulation code" severity note;
else
assert false report "synthesis code" severity note;
end if;
WARNING:
Macrocells
Macrocell Instantiation
This is not an error, simply a note that this component’s behavior is not
defined in VHDL , it will be defined by the macrocell compiler.
If the formal port declarations are unconstrained, or generics are used, the
macrocell becomes a parameterized macrocell. Parameterized macrocells are
only supported for the LPM, XBLOX and Open Abel 2 output formats. This is
described in the following section.
The verbose command line option will enable the compiler to print the
names of inferred macrocells. See D - Compile options.
Macrocell Instantiation
For example, the Compare macrocell from the Xblox library is declared
with unconstrained ports and a style parameter:
component compare
generic (style : string := "");
port (a, b: std_logic_vector;
a_eq_b, a_ne_b, a_lt_b, a_gt_b, a_le_b, a_ge_b :
out std_logic);
end component;
attribute macrocell of compare : component is true;
The macrocell may be instantiated with input ports whose size varies with
each instantiation. The parameter style may be specified or left as the XBLOX
default. And, in the usual VHDL manner, we may use named association to pick
from the out ports. For example:
p <= a * b;
Macrocell inference only occurs if both operands are VHDL signals (or
more formally are not metalogic expressions). So for example, adding two VHDL
constants will not produce an adder macrocell.
process(RST,CLK)
begin
if RST then -- Reset
Q <= 0;
else
if (CLK and CLK'event) then
if load then
Q <= P;
else
Q <= P + Q;
end if;
end if;
end if;
end process;
end behavior;
process(RST,CLK)
begin
if RST then -- Async Reset
Q <= 0;
else
if CLK and CLK'event then
if LD or CE then -- load dominates clock enable,
-- so OR clkena pin
if LD then-- sync load
Q <= D;
else
Q <= Q + 1;
end if;
end if;
end if;
end if;
end process;
Predefined attributes
Attribute 'critical'l
Attribute 'enum_encoding'
Attribute part_name
Attribute pinnum
Attribute property
Atribute Xilinx_BUFG
Atribute Xilinx_GSR
Attribute foreign
Attribute array_to_numeric
Attribute macrocell
Attribute Ungroup
Attribute Inhibit_buf
12 - Synthesis Attributes 12 - 1
Predefined attributes
One feature of VHDL that may not be familiar to programmers is attributes.
VHDL has many predefined attributes which allow access to information about
types, arrays, and signals. A list of the supported attributes and their definitions is
contained in A - VHDL Quick Reference. Some examples are :
and
when used with an array the 'high attribute has a value of the array index:
12 - 2 12 - Synthesis Attributes
User defined attributes
VHDL allows the user to define their own attributes. Metamor uses this
capability to define attributes for synthesis. The declaration of these attributes may
be found in the system library 'metamor'. To use these attributes, either make them
visible (use metamor.attributes.all), or copy to your VHDL source description. The
value of these attributes must be locally static.
package attributes is
-------------------------------------------------------
-- User defined place and route information passed to
-- output file
-------------------------------------------------------
attribute pinnum : string;
attribute part_name : string;
attribute property : string;
-------------------------------------------------------
-- User defined encoding of enumerated types
-------------------------------------------------------
attribute enum_encoding : string;
-------------------------------------------------------
-- User specified critical nodes
-------------------------------------------------------
attribute critical : boolean;
-------------------------------------------------------
-- User specified macrocells
-------------------------------------------------------
attribute macrocell : boolean;
end attributes;
12 - Synthesis Attributes 12 - 3
Attribute 'critical'
This introduces nodes into the design, but does so from the VHDL source.
The attribute critical allows the user to specify signals in the VHDL description
whose timing is critical. An assignment to such a specified signal may imply a node
in the output logic description. Critical is also used to put factoring under control of
the user.
This may be of use when the delay of the resulting logic can benefit from
the designers knowledge of the structure or circuit (electrical/timing) characteristics
of the implementation and not simply depend on being logically minimal. Critical
constrains both the logic optimizer and the factoring function as specified by the
user. It is also used to specify signals that will have net attributes for downstream
tools.
For example, look at the top level of the of PREP 4: Using std_logic_1164
implementation. Critical is used here to separate the output encoder of one
instance from the input decoder of the next; the result is a faster design. Critical is
used in this case because neither the inputs or outputs of the components are
registered. The state machine inputs are also encoded in such a way that they
(just) fit within 16 product terms. In the multiple instance case, manual specification
of the critical nodes in the combined output/input logic using the critical attribute
produces better results than automatic synthesis.
12 - 4 12 - Synthesis Attributes
Attribute 'enum_encoding'
You may need to specify different machine encoding for different hardware
technologies. For example, one hot encoding may be preferred for an FPGA but
not for a CPLD. For further information see User Defined Encoding and One Hot
Encoding . Also see Don't Cares for more on enum_encoding.
Attribute part_name
Metamor allows designers to pass place and route information to fitters, or
netlists. This information has no meaning to Metamor, it is simply passed from
VHDL to the output file.
library metamor;
use metamor.attributes.all
entity special_attributes is
port(c : bit_vector (3 to 5);
d : bit_vector (27 downto 25);
e : out boolean) ;
--usage of part_name
attribute part_name of special_attributes : entity is "22v10";
end special_attributes;
The device compile option will override the value of the part_name
attribute.
12 - Synthesis Attributes 12 - 5
Attribute pinnum
Metamor allows designers to pass place and route information to fitters, or
netlists. This information has no meaning to Metamor, it is simply passed from
VHDL to the output file.
The pinnum attribute is used to specify the pinout in the target device, and
may be applied to ports in the top level entity. The attribute is declared in the
Metamor library as :
Its value is a string containing a comma (',') delimited list of pad names or
pin numbers. These values are assigned to the elements of the port in a left to right
order. For example :
library metamor;
use metamor.attributes.all
entity special_attributes is
port(a , b : in integer range 0 to 7;
c : bit_vector (3 to 5);
d : bit_vector (27 downto 25);
e : out boolean) ;
-- usage of pinnum
attribute pinnum of a : signal is "4,5,6,7"; -- extra pin ignored
-- bit 0 of gets "6"
attribute pinnum of b : signal is "8,9"; -- missing pin number
-- b(0) not assigned
attribute pinnum of c : signal is "a3,b4,a1"; -- ascending order
-- c(0) get "a3"
attribute pinnum of d : signal is "w1,W2,w99"; -- descending order
-- c(27) gets "w1"
attribute pinnum of e : signal is "2"; -- single bit
end special_attributes;
12 - 6 12 - Synthesis Attributes
Attribute property
Metamor allows designers to pass place and route information to fitters, or
netlists. This information has no meaning to Metamor, it is simply passed from
VHDL to the output file.
The property attribute is used to pass an arbitary string to the output file. If
applied to an entity the value is included at the head of the output file, if applied to
a port the value is included as a property of the port in the output file. The attribute
is declared in the Metamor library as :
The value is passed directly to the output file; therefore, you will need to
know the legal syntax for that file. The second example shows how using VHDL
functions can make this task less error prone.
library metamor;
use metamor.attributes.all
entity special_attributes is
port(c : bit_vector (3 to 5);
d : bit_vector (27 downto 25);
e : out boolean) ;
end special_attributes;
12 - Synthesis Attributes 12 - 7
Strings are passed to the output file exactly as specified in the VHDL
source, and case is maintained. A characteristic of VHDL is that a new line
character is not legal within a string; therefore, to create several lines we
concatenate strings and a new line using "xxx" & CR & "yyy" as shown in the
example above. This can get a little cluttered unless you declare functions for
commonly used string values. For example:
package xilinx is
function timespec(name,from, too,delay : string) return string;
end;
library ieee,metamor;
use ieee.std_logic_1164.all;
use metamor.attributes.all;
use work.xilinx.all;
entity MORE_ATTRIBUTES is
port (d,c,ce,r,tri : in std_logic;
q,p : out std_logic;
w : out std_logic_vector(2 downto 0));
end;
12 - 8 12 - Synthesis Attributes
Atribute Xilinx_BUFG
This attribute is ignored if the compiler output format is not XNF. If the
output format is XNF and input and output buffers are being inserted, this attribute
causes IBUFs to be replaced by BUFGs. If buffers are not being inserted, the user
may simply instantiate a BUFG.
For example
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity prep7 is
generic (width : natural := 15);
port (CLK, RST,LD,CE : in std_logic;
D : in std_logic_vector(width downto 0);
Q : buffer std_logic_vector(width downto 0));
end prep7;
12 - Synthesis Attributes 12 - 9
Atribute Xilinx_GSR
This attribute is ignored if the compiler output format is not XNF. If the
output format is XNF, this attribute is used to mark a net that uses the global set
or reset resource. It has the same behavior as a STARTUP symbol.
entity prep7 is
generic (width : natural := 15);
port (CLK, RST,LD,CE : in std_logic;
D : in std_logic_vector(width downto 0);
Q : buffer std_logic_vector(width downto 0));
end prep7;
If design units are separately compiled and linked with XNFMERGE and
one unit contains a startup symbol, the units that do not contain the startup symbol
should use the Xilinx_GSR attribute.
12 - 10 12 - Synthesis Attributes
Attribute foreign
VHDL has an external language interface to allow users to specify
modules in some non-VHDL form; the implementation is VHDL tool specific. The
foreign attribute supports external HDLs. This mechanism is only supported using
those output formats that support hierarchy and linking.
entity abel_code is
port (a,b : bit_vector(0 to 7) ; sum : out bit_vector(0 to 8)) ;
end abel_code;
12 - Synthesis Attributes 12 - 11
These statements in the architecture are ignored, and a call to the foreign
language module 'adder' is generated when the entity abel_code is instantiated in
a VHDL design. The inputs and outputs of adder must match the port declarations
in VHDL. There are two constraints: the VHDL ports must have locally static types,
and VHDL generics are not passed to the external module.
MODULE adder
a = [a_7..a_0];
b = [b_7..b_0];
sum = [sum_8..sum_0];
EQUATIONS
sum = a + b;
END;
A side effect of the foreign attribute is that the foreign module might be
defined in VHDL. An easier way to do this is provided by the hierarchical
compilation feature described in 9 - Managing Large Designs.
12 - 12 12 - Synthesis Attributes
Attribute array_to_numeric
Some type conversion functions can be very slow to compile during VHDL
synthesis. This attribute accelerates compilation in one specific and common case:
converting arrays to numbers. An example is converting bit_vector to integer as
shown in 10 - Logic and Metalogic. This particular conversion specifies no logic but
is slow to compile. This aspect is also discussed in some detail in 10 - Logic and
Metalogic.
end to_integer;
12 - Synthesis Attributes 12 - 13
The array argument is treated as signed or unsigned depending on the
subtype of the function return value. If the subtype of the return value ('natural' , the
subtype of the variable 'result' in the example above) is signed (integer is signed),
the array argument is sign extended. If the subtype is unsigned (natural is
unsigned), the argument is zero extended.
When this attribute is true, the formal parameter is returned by the function
with the subtype of the returned object. Since this function short circuits the
semantics of VHDL it should be used with caution.
12 - 14 12 - Synthesis Attributes
Attribute macrocell
When a component instance has no entity bound to it the macrocell
attribute is used to specify a different naming convention for the component’s multi-
bit formal ports. Examples of multi-bit types are integer and std_logic_vector.
Examples of single bit types are bit and std_logic. The macrocell attribute is
required for parameterized macrocells such as XBLOX and LPM.
library ieee;
use ieee.std_logic_1164.all;
entity Parent is
port(a : std_logic_vector(7 downto 5);
v : out std_logic_vector( 1 to 3));
end Parent;
architecture behavior of Parent is
-- component declaration , unbound
component IN_BUF_3
port (I : std_logic_vector(2 downto 0) ;
O : out std_logic_vector(0 to 2));
end component;
component OUT_BUF_3
port (I : std_logic_vector(2 downto 0) ;
O : out std_logic_vector(0 to 2));
end component;
signal x : std_logic_vector(2 downto 0);
attribute macrocell : Boolean;
attribute macrocell of IN_BUF_3, OUT_BUF_3 : component is true;
begin
-- component instantiation
u0 : IN_BUF_3 port map (a,x);
u2 : OUT_BUF_3 port map (x,v);
end;
Note that if the component formal ports have an unconstrained type (such
as XBLOX or LPM instances) the macrocell attribute must be used.
12 - Synthesis Attributes 12 - 15
Attribute Ungroup
The ungroup attribute removes hierarchy from the design and also
overrides the default logic optimize behavior. By default, the logic optimizer works
on the logic within a single architecture. The logic is separately optimized for any
component instantiated within the architecture maintaining the hierarchy.
---Child
library ieee;
use ieee.std_logic_1164.all;
entity Child is
port (A, B : std_logic;
C : out std_logic);
end Child;
architecture behavior of Child is
begin
C <= A and B;
end;
---Parent
use ieee.std_logic_1164.all;
entity Parent is
port (X : std_logic;
Y : out std_logic);
end Parent;
architecture behavior of Parent is
-- component declaration , bound to Entity Child above
12 - 16 12 - Synthesis Attributes
component Child
port (A, B : std_logic;
C : out std_logic);
end component;
-- UNGROUP TRUE, child is optimized as part of Parent
attribute ungroup : Boolean;
attribute ungroup of Child : component is true;
begin
-- component instantiation
u0 : Child port map (X, X, Y);
end;
12 - Synthesis Attributes 12 - 17
Attribute Inhibit_buf
For the XNF and EDIF output formats you may set a compile option that
automatically inserts input and output buffers for the target device. Sometimes you
may wish to override this buffer insertion on a per-pin basis. This may be done by
attaching the inhibit_buf to the top level port (as in the example insertion of a clock
buffer shown below, or with any silicon specific IO structure).
library ieee;
use ieee.std_logic_1164.all;
entity Parent is
port(clk : std_logic;
a : std_logic_vector(7 downto 5);
v : out std_logic_vector(3 downto 1));
-- inhibit automatic input buffer on signal clk
-- because of clock buffer instantiation
attribute inhibit_buf : Boolean;
attribute inhibit_buf of clk : signal is true;
end Parent;
12 - 18 12 - Synthesis Attributes
Attributes for Downstream Tools
The Metamor compiler makes use of user defined attributes to pass
information to downstream tools. The Metamor compiler also recognizes some
attributes such as "critical" or "ungroup" to control its own operation. These are not
passed to downstream tools. This section discusses the rules for passing attributes
to downstream tools and shows some specific examples.
To pass attributes to downstream tools you will need to know the netlist
format, and the attributes plus their netlist location recognized by the downstream
tool. Please refer to the downstream tool documentation for its legal attribute
names, values and locations.
• the attribute as a name/value pair, this passes the pair to the netlist
• the value of the attribute "property", this passes only the value to the
netlist
• the value of the attribute "pinnum", this passes pin numbers to the
netlist
• the value of the attribute "part_name", this passes the specific device
to the netlist.
12 - Synthesis Attributes 12 - 19
EDIF part_name pinnum property name/value
Signal, instance
inferring
flip-flop,
latch, or
tristate
Component instance
Component instance
instance
label
12 - 20 12 - Synthesis Attributes
XNF part_name pinnum property name/
value(4)
Entity,
lower level
(3)
Port, lower
level (3)
12 - Synthesis Attributes 12 - 21
Open Abel 2 part_name pinnum property name/value
Port, top
level
12 - 22 12 - Synthesis Attributes
Attributes attached to a signal may be attached to an instance, a net or a
port in the netlist according to the priority, highest to lowest, listed below. (The
attributes may also be ignored.)
For explicit instances, attach the VHDL attribute to the instance label as
shown below:
architecture x of y is
-- Placement hints
attribute CHIP_PIN_LC of u0 : label is "LAB2";
attribute CHIP_PIN_LC of u2 : label is "LAB7";
begin
u0 : buffer port map (a,b);
u1 : buffer port map (x,y);
....
12 - Synthesis Attributes 12 - 23
You may also use generics to pass instance parameters. This approach is
useful if the child component won't be synthesized, but will have a simulation model
that needs to see the attribute value.
architecture x of y is
component ROM
generic(filename : string)
port (A : std_logic_vector(7 downto 0) ;
D : out std_logic_vector(4 downto 0));
end component;
begin
uo : ROM generic map ("init.prg") port map (address, data);
....
architecture x of y is
signal q : std_logic_vector(3 downto 0);
-- Register placement hint,
-- all 4 flip-flops get REGTYPE=IOC
attribute REGTYPE of q : signal is "IOC" ;
begin
q <= d when rising_edge(clk);
....
You may attribute nets , but only if the Metamor compiler is allowed to
retain the signals in the output netlist with the Metamor Critical attribute.
architecture x of y is
signal c : std_logic;
--allow Metamor to keep the logic
attribute Critical of c : signal is true;
-- using attribute property
attribute property of c : signal is "X";
-- adds the value to the net (XNF only)
12 - 24 12 - Synthesis Attributes
-- using name/value , assume W is attribute type integer
attribute W of c : signal is 100;
-- assume SC is declared as boolean.
attribute SC of c : signal is true;
begin
c <= a or b;
d <= c or d;
....
entity x is
port (a,b : std_logic;
d : out std_logic);
end x;
architecture x of y is
signal c : std_logic;
-- using attribute property
attribute property of a : signal is "NODELAY"; -- adds the value to the port
-- using name/value , assume TMN is attribute type string
attribute TMN of b : signal is "name_list";
-- assume FAST is declared as boolean.
attribute FAST of d : signal is true;
begin
c <= a or b;
d <= c or d;
....
12 - Synthesis Attributes 12 - 25
12 - 26 12 - Synthesis Attributes
13 - Synthesis Coding Issues
Introduction
Don't Care
Unintended Latches
Understanding the hardware that you are specifying is the simplest rule for
success. This is particularly important for critical timing. Conversely the easiest
way to fail is write a model of your design and then wonder why the synthesis tool
didn't 'do the design' for you.
This section contains examples of user coding problems. They are all real
user issues, some may be obvious, others are not.
See Also
How to be Happy
The code specifies a logic cell that looks at the drive of its fanin then
outputs true if not driven, and false if driven true or false. Such a cell does not exist
in most programmable silicon. IEEE 1076.3 specifies that this comparison should
always be false, so the statements inside the if are not executed, and no logic is
generated.
case sig is
when "000" => -- first branch
when "001" => -- second branch
when "010" => -- third branch
when "011" => -- fourth branch
when "100" => -- fifth branch
when others => -- last branch
end case;
In practice, if the branches contain very little logic, or there are few
branches, then there may be little difference. However, the case statement
generally results in a better implementation.
An example where this is not the expected behavior may be hidden in your
code .....
Some of the predefined VHDL operations also imply long signal paths, see
4 - Programming Combinational Logic.
In the following example it is assumed that only one control input will be
active at a time. The description is efficient for simulation, but a poor logic
description because the independence of the control signals is not described within
the VHDL code.
Note that the issue is not a long signal path, but an unclear specification of
the design. The best optimizer in the world can't turn an inefficient algorithm into an
efficient one. And an algorithm that is efficient from one viewpoint may not be
efficient from another.
Users often use inout when they have a logical output they wish to read
from, in this case use mode buffer. This results in a signal path internal to the
target device It is not a good idea to use inout on lower levels of hierarchy when
separately compiling each design unit. Doing so may be a problem for third party
linkers. If the design units are compiled at the same time, the implementation will
be two wires, one for data flow in each direction.
The same applies to libraries of functions written for simulation. They may
be acceptable to the synthesis tool, but are unlikely to produce good synthesis
results. It is critically important that libraries be tuned for synthesis. This is typically
done by keeping the same package interface and modifying the package body.
Metamor supplies some tuned packages; study these before attempting your own
port.
The value at time zero has no clear meaning in the context of synthesis,
therefore, the initial value of signals and process variables must be used with care.
This issue does not arise with the initial value of variables declared in
subprograms.
You should not depend on the initial value of signals or process variables
if they are not completely specified in the process in which they are used. In this
case, the compiler will ignore the time zero condition and use the driven value --
effectively ignoring the single transition from the time zero state. If such signals or
variables are not assigned, you may reliably use their initial value. Obviously,
signals assigned in another process will never depend upon the initial value. For
example :
In this case 'res1' is never assigned low -- the code will be synthesized as
a pull-up. However during simulation at time zero, 'res1' starts at '0', makes one
transition to '1' and stays there. If this is really the intent, the solution is to use a flip-
flip.
process(tmpval,INIT)
begin
if (tmpval = 2**6 -1) then
res1 <= '1';
elsif (INIT ='1') then
res1 <= '1';
else
res1 <= '0'; -- drive it low *****
end if;
end process;
a(b) <= c;
If b is not a constant, then some care should be taken with this expression.
This is because the statement means element 'b' of 'a' gets the value of 'c'; AND
all the other elements of 'a' get their previous value (i.e. are unchanged). In
hardware this implies storage of data. If this assignment is not clocked,
combinational feedback paths will be created.
If the assignment is clocked as in the example above (and the clock enable
compile option is on), the element select logic will drive the flip-flop clock enable
control for an efficient implementation. However, an explicit clock enable will
override the implicit clock enable. In the following example ‘clk_ena’ will be
connected to the clock enable control and the select logic will be included in the
data path.
if rising_edge(clk) then
if clk_ena = '1' then
a(b) <= c;
end if;
end if;
For example, if
a <= "00010"
b <= a = "00---"
You can use the verbose compile option, which will log the name and line
number of all inferred elements including (unintended) latches.
In the following example (from the Fifo example), if the ReadPtr(i) is never
equal to '1', Qint keeps its previous value. It may be a characteristic of the design
that one bit of ReadPtr is always '1', but nothing says this is so. Qint is incompletely
specified and a feedback path exists, which includes Qint when ReadPtr is all
zeros.
process(ReadPtr, Fifo)
begin
for i in ReadPtr'range loop
if ReadPtr(i) = '1' then
Qint <= Fifo(i);
end if;
end loop;
end process ;
We code for this case by making certain Qint is always assigned. In which
case its value is defaulted to all zeros, and the unintended feedback path is
removed.
process(ReadPtr, Fifo)
begin
Qint <= (others => '0'); -- because of possible comb feedback
for i in ReadPtr'range loop
if ReadPtr(i) = '1' then
Qint <= Fifo(i);
end if;
end loop;
end process;
You can use the verbose compile option. It will log the name and line
number of all inferred elements, including (unintended) combinational feedback.
For example:
process (clk1,clk2)
begin
if rising_edge(clk1) then
if rising_edge(clk2) then
q <= d;
end if;
end if;
end process;
This probably describes a flip-flop that loads when its two clocks change
at the same instant. It will function during simulation (because of the discrete nature
of simulation time) but no hardware element has this behavior, and the compiler
will report an error.
Lexical Elements
Reserved Words
Sequential Statements
Subprograms
Concurrent Statements
Library Units
Attributes
VHDL constructs
Unsupported Constructs
Ignored Constructs
Constrained Constructs
Declarations
-- OBJECTS
constant alpha : character := 'a';
variable total : integer ;
variable sum : integer := 0;
signal data_bus : bit_vector (0 to 7);
-- TYPES
type opcodes is (load,store,execute,crash);
type small_int is range 0 to 100;
type big_bus is array ( 0 to 31 ) of bit;
type glob is record
first : integer;
second : big_bus;
other_one : character;
end record;
-- SUBTYPES
subtype shorter is integer range 0 to 7;
subtype smaller_int is small_int range 0 to 7;
Names
-- Array element
big_bus(0)
-- Record element
record_name.element
--IF STATEMENT
if increment and not decrement then
count := count +1;
elsif not increment and decrement then
count := count -1;
elsif increment and decrement then
count := 0;
else
count := count;
end if;
--CASE STATEMENT
case day is
when Saturday to Sunday =>
work := false;
work_out := false;
when Monday | Wednesday | Friday =>
work := true;
work_out := true;
when others =>
work := true;
work_out := false;
end case;
-- WAIT STATEMENT
wait until clk;
-- FUNCTION DECLARATION
-- parameters are mode in
-- return statements must return a value
function is_zero (n : integer) return boolean is
-- type, variable,constant,subprogram declarations
begin
-- sequential statements
if n = 0 then
return true;
else
return false;
end if;
end;
-- PROCEDURE DECLARATION
-- parameters may have mode in , out or inout
procedure count (incr : boolean; big : out bit;
num : inout integer) is
-- type, variable,constant,subprogram declarations
begin
-- sequential statements
if incr then
num := num +1;
end if;
if num > 101 then
big := '1';
else
big := '0';
end if;
end;
-- BLOCK STATEMENT
label5 : -- label is required
block
-- type, signal,constant,subprogram declarations
begin
-- concurrent statements
end block;
-- GENERATE STATEMENT
label4 : -- label required
for i in 0 to 9 generate
-- declarations
begin -- begin is optional if no declarations
-- concurrent statements
label : if i /= 0 generate
-- concurrent statements
sig(i) <= sig(i-1);
end generate;
end generate;
-- COMPONENT INSTANTIATION
-- label is required
-- positional association
U1 : decode port map (instr, rd, wr);
-- named association
U2 : decode port map (r=> rd, op => instr, w=> wr);
-- DIRECT INSTANTIATION
-- label is required
-- positional association
U1 : entity decode port map (instr, rd, wr);
-- named association
U2 : entity decode port map (r=> rd, op => instr, w=> wr);
-- PACKAGE DECLARATION
package globals is
-- type,constant, signal ,subprogram declarations
end globals;
-- ENTITY DECLARATION
entity decoder is
port (op : opcodes; r,w : out bit);
end decoder;
-- ARCHITECTURE DECLARATION
architecture first_cut of decoder is
-- type, signal,constant,subprogram declarations
begin
-- concurrent statements
end first_cut;
-- CONFIGURATION DECLARATION
configuration example of decoder is
-- configuration
end example;
-- LIBRARY CLAUSE
-- makes library , but not its contents visible
library utils;
-- USE CLAUSE
use utils.all;
use utils.utils_pkg.all;
-- STRING ATTRIBUTES
E'simple_name string "E"
E'path_name hierarch y path string
E'instance_name hierarch y and binding string
• Access types
• File types
• Signal attributes (except 'event , 'stable,and'last_value)
• Textio package
• Impure functions
• Shared variables
Ignored Constructs
The following constructs are ignored. They may be used in VHDL
simulation, but Metamor will not generate any logic.
• Disconnect specifications
• Resolution functions
• Signal kind register
• Waveforms, except the first element value
Constrained statement
Constrained expressions
PREP 1
PREP 2
PREP 3
PREP 5
PREP 6
PREP 7
PREP 9
B - PREP Examples B- 1
PREP 1
package typedef is
subtype byte is bit_vector (7 downto 0);
end;
use work.typedef.all;
entity data_path is
port (clk,rst,s_l : boolean;
s0, s1 : bit;
d0, d1 ,d2, d3 : byte;
q : out byte);
end data_path;
use work.typedef.all;
entity prep1 is
port (CLK,RST,S_L : boolean;
S0, S1 : bit;
ID : bit_vector(23 downto 0);
IPD : byte;
Q : out byte);
end prep1;
B - PREP Examples B- 3
begin
first : data_path port map (CLK,RST,S_L,
S0,S1,
IPD,
ID(7 downto 0),
ID(15 downto 8),
ID(23 downto 16),
Q);
end;
use work.typedef.all;
entity prep2 is
port(CLK,RST,SEL,LDCOMP,LDPRE : boolean;
DATAa , DATAb : byte;
DATAc : out byte);
end prep2;
B - PREP Examples B- 5
procedure counter ( signal clk,rst,ld : boolean; signal d : byte;
signal q : inout byte) is
begin
if rst then
q <= 0;
elsif clk and clk'event then
if ld then
q <= d;
else
q <= q + 1;
end if;
end if;
end;
use work.typedef.all;
entity state_machine is
port (clk,rst : boolean;
inn : byte;
outt : out byte);
end state_machine;
B - PREP Examples B- 7
when start =>
if inn = x"3c" then
current_state := sa;
outt <= x"82";
else
outt <= x"00";
end if;
when sa =>
if inn = x"2a" then
current_state := sc;
outt <= x"40";
elsif inn = x"1f" then
current_state := sb;
outt <= x"20";
else
outt <= x"04";
end if;
when sb =>
if inn = x"aa" then
current_state := se;
outt <= x"11";
else
current_state := sf;
outt <= x"30";
end if;
when sc =>
current_state := sd;
outt <= x"08";
when sd =>
current_state := sg;
outt <= x"80";
when se =>
current_state := start;
outt <= x"40";
entity prep3 is
port (CLK,RST : boolean;
INN : byte;
OUTT : out byte);
end prep3;
B - PREP Examples B- 9
PREP 4: Using enum_encoding
library metamor;
use metamor.attributes.all;
package encode1 is
type state_type is (st0,st1,st2,st3,st4,st5,st6,st7,st8,
st9,st10,st11,st12,st13,st14,st15);
attribute enum_encoding of state_type : type is
"00101 00000 10000 00100 10100 " &
"01100 01000 10101 10001 11000 " &
"10011 00011 00001 01101 01001 11001";
use work.encode1.all;
entity prep4 is
port (clk,rst : boolean;
i : bit_vector(7 downto 0);
o : out byte);
end prep4;
B - 10 B - PREP Examples
architecture instance of prep4 is
signal machine : state_type;
begin
process (clk,rst)
begin
if rst then
machine <= st0;
elsif clk and clk'event then
case machine is
when st0 =>
case I is
when x"00" => machine <= st0;
when x"01" to x"03" => machine <= st1;
when x"04" to x"1f" => machine <= st2;
when x"20" to x"3f" => machine <= st3;
when others => machine <= st4;
end case;
when st1 =>
if I(1 downto 0) = b"11" then
machine <= st0;
else
machine <= st3;
end if;
when st2 =>
machine <= st3;
when st3 =>
machine <= st5;
when st4 =>
if (I(0) or I(2) or I(4)) = '1' then
machine <= st5;
else
machine <= st6;
end if;
B - PREP Examples B - 11
when st5 =>
if (I(0) = '0') then
machine <= st5;
else
machine <= st7;
end if;
when st6 =>
case I(7 downto 6) is
when b"00" => machine <= st6;
when b"01" => machine <= st8;
when b"10" => machine <= st9;
when b"11" => machine <= st1;
end case;
when st7 =>
case I(7 downto 6) is
when b"00" => machine <= st3;
when b"11" => machine <= st4;
when others => machine <= st7;
end case;
when st8 =>
if (I(4) xor I(5)) = '1' then
machine <= st11;
elsif I(7) = '1' then
machine <= st1;
end if;
when st9 =>
if I(0) = '1' then
machine <= st11;
end if;
when st10 =>
machine <= st1;
B - 12 B - PREP Examples
when st11 =>
if i = x"40" then
machine <= st15;
else
machine <= st8;
end if;
when st12 =>
if i = x"ff" then
machine <= st0;
else
machine <= st12;
end if;
when st13 =>
if (I(5) xor I(3) xor I(1)) = '1' then
machine <= st12;
else
machine <= st14;
end if;
when st14 =>
case I is
when x"00" => machine <= st14;
when x"01" to x"3f" => machine <= st12;
when others => machine <= st10;
end case;
when st15 =>
if (I(7) = '1') then
case I(1 downto 0) is
when b"00" => machine <= st14;
when b"01" => machine <= st10;
when b"10" => machine <= st13;
when b"11" => machine <= st0;
end case;
end if;
end case;
end if;
end process;
B - PREP Examples B - 13
with machine select
O <= o0 when st0,
o1 when st1,
o2 when st2,
o3 when st3,
o4 when st4,
o5 when st5,
o6 when st6,
o7 when st7,
o8 when st8,
o9 when st9,
o10 when st10,
o11 when st11,
o12 when st12,
o13 when st13,
o14 when st14,
o15 when st15;
end;
B - 14 B - PREP Examples
PREP 4: Using std_logic_1164
library ieee;
use ieee.std_logic_1164.all;
package encode2 is
subtype byte is std_logic_vector (7 downto 0);
subtype state_type is std_logic_vector (4 downto 0);
constant st0 : state_type := "00101";
constant st1 : state_type := "00000";
constant st2 : state_type := "10000";
constant st3 : state_type := "00100";
constant st4 : state_type := "10100";
constant st5 : state_type := "01100";
constant st6 : state_type := "01000";
constant st7 : state_type := "10101";
constant st8 : state_type := "10001";
constant st9 : state_type := "11000";
constant st10 : state_type := "10011";
constant st11 : state_type := "00011";
constant st12 : state_type := "00001";
constant st13 : state_type := "01101";
constant st14 : state_type := "01001";
constant st15 : state_type := "11001";
constant dont_care : state_type := "-----";
end ;
library ieee;
use ieee.std_logic_1164.all;
use work.encode2.all;
entity state_machineis
port (clk,rst : boolean;
i : byte;
o : out byte);
end state_machine;
B - PREP Examples B - 15
architecture instance of state_machine is
signal machine : state_type;
begin
process (clk,rst)
begin
if rst then
machine <= st0;
elsif clk and clk'event then
case machine is
when st0 =>
case I is
when "00000000" => machine <= st0;
when "00000001" to "00000011" => machine <= st1;
when "00000100" to "00011111" => machine <= st2;
when "01000000" to "00111111" => machine <= st3;
when others => machine <= st4;
end case;
when st1 =>
if I(1 downto 0) = "11" then
machine <= st0;
else
machine <= st3;
end if;
when st2 =>
machine <= st3;
when st3 =>
machine <= st5;
when st4 =>
if (I(0) or I(2) or I(4)) = '1' then
machine <= st5;
else
machine <= st6;
end if;
B - 16 B - PREP Examples
when st5 =>
if (I(0) = '0') then
machine <= st5;
else
machine <= st7;
end if;
when st6 =>
case I(7 downto 6) is
when "00" => machine <= st6;
when "01" => machine <= st8;
when "10" => machine <= st9;
when "11" => machine <= st1;
end case;
when st7 =>
case I(7 downto 6) is
when "00" => machine <= st3;
when "11" => machine <= st4;
when others => machine <= st7;
end case;
when st8 =>
if (I(4) xor I(5)) = '1' then
machine <= st11;
elsif I(7) = '1' then
machine <= st1;
end if;
when st9 =>
if I(0) = '1' then
machine <= st11;
end if;
when st10 =>
machine <= st1;
B - PREP Examples B - 17
when st11 =>
if i = "01000000" then
machine <= st15;
else
machine <= st8;
end if;
when st12 =>
if i = "11111111" then
machine <= st0;
else
machine <= st12;
end if;
when st13 =>
if (I(5) xor I(3) xor I(1)) = '1' then
machine <= st12;
else
machine <= st14;
end if;
when st14 =>
case I is
when "00000000" => machine <= st14;
when "00000001" to "00111111" => machine <= st12;
when others => machine <= st10;
end case;
when st15 =>
if (I(7) = '1') then
case I(1 downto 0) is
when "00" => machine <= st14;
when "01" => machine <= st10;
when "10" => machine <= st13;
when "11" => machine <= st0;
end case;
end if;
when others => machine <= dont_care;
end case;
end if;
end process;
B - 18 B - PREP Examples
with machine select
O <= "00000000" when st0,
"00000110" when st1,
"00011000" when st2,
"01100000" when st3,
"1------0" when st4,
"-1----0-" when st5,
"00011111" when st6,
"00111111" when st7,
"01111111" when st8,
"11111111" when st9,
"-1-1-1-1" when st10,
"1-1-1-1-" when st11,
"11111101" when st12,
"11110111" when st13,
"11011111" when st14,
"01111111" when st15,
"--------" when others;
end;
library metamor;
use metamor.attributes.all;
use work.encode2.all;
entity prep4 is
port (clk,rst : boolean;
i : byte;
o : out byte);
end prep4;
B - PREP Examples B - 19
architecture top_level of prep4 is
component state_machine
port (clk,rst : boolean;
i : byte;
o : out byte);
end component;
signal q1,q2,q3 : byte;
attribute critical of q1,q2,q3 : signal is true; --q1,q2,q3 are nodes
begin
u1 : statemachine port map (clk,rst,i,q1);
u2 : statemachine port map (clk,rst,q1,q2);
u3 : statemachine port map (clk,rst,q2,q3);
u4 : statemachine port map (clk,rst,q3,o);
end;
B - 20 B - PREP Examples
PREP 5
entity arith is
port(CLK,MAC,RST: boolean; A,B: integer range 0 to 15;
Q: in buffer integer range 0 to 255);
end arith;
B - PREP Examples B - 21
entity prep5_4 is
port(CLK,MAC,RST: boolean; A,B: integer range 0 to 15;
Q: in buffer integer range 0 to 255);
end prep5_4;
component arith
port(CLK,MAC,RST: boolean; A,B: integer range 0 to 15;
Q: in out integer range 0 to 255);
end component;
begin
one: arith port map (CLK,MAC,RST, A , B ,QX);
-- Instance #1
QX_Low <= QX rem 16; -- slice low nibble
QX_High <= QX / 16; -- slice high nibble
two: arith port map (CLK,MAC,RST,QX_Low,QX_High,QY);
-- Instance #2
QY_Low <= QY rem 16; -- slice low nibble
QY_High <= QY / 16; -- slice high nibble
three: arith port map (CLK,MAC,RST,QY_Low,QY_High,QZ);
-- Instance #3
QZ_Low <= QZ rem 16; -- slice low nibble
QZ_High <= QZ / 16; -- slice high nibble
four: arith port map (CLK,MAC,RST,QZ_Low,QZ_High, Q);
-- Instance #4
end structure;
B - 22 B - PREP Examples
PREP 6
entity prep6 is
port(CLK,RST: boolean; D: in integer range 0 to 65535;
Q: buffer integer range 0 to 65535);
end prep6;
B - PREP Examples B - 23
PREP 7
entity prep7 is
port(CLK,RST,LD,CE: boolean; D: integer range 0 to 65535;
Q: buffer integer range 0 to 65535);
end prep7;
B - 24 B - PREP Examples
PREP 9
package typedef is
subtype byte is bit_vector(7 downto 0);
end ;
entity prep9 is
port (clk,rst,as,ce : boolean; al,ah : byte;
be : out boolean; q : out byte);
end prep9;
B - PREP Examples B - 25
else
q <= x"00";
be <= false;
end if;
end if;
end;
B - 26 B - PREP Examples
C - Error Message Index
The compiler has encountered the end of the source file before reaching
the end of the current library unit (entity, architecture, configuration, package or
package body).
Check to make sure that you have not omitted one or more end statements
from the source file. Also check to ensure that the disk file is not corrupt or
truncated.
# 002
Syntax error near 'operator'.
Check to make sure you are using the operator properly. Also check to
make sure there is no other syntax error on the same line, or on previous lines, that
might cause the error.
Check carefully to make sure that you have placed semicolons in their
proper locations on previous lines.
Check to make sure you are using the identifier properly. Also check to
make sure there is no other syntax error on the same line, or on previous lines, that
might cause the error.
Check carefully to make sure that you have placed semicolons in their
proper locations on previous lines.
# 004
Based literal format is incorrect.
The compiler has encountered a based literal (a literal that has been
specified as having a base between 2 and 16) that does not have a valid format.
Check the syntax of the literal to make sure it conforms to the requirements
of the specified number base.
The compiler has encountered a character that is not a part of the defined
VHDL character set.
Check to make sure that the text editor used to create the source file has
not placed illegal characters (such as word processor control codes) into your
source file.
# 006
An identifier may not begin with the special character 'character'.
Also check to make sure you have not misplaced an operator or other
special character.
# 007
Unable to open file 'name'.
Check to ensure that the indicated filename is correctly spelled, and exists
in the current directory or the directory indicated in the file path.
Check to make sure that you have placed a terminating quote character on
the end of the string, or terminating backslash on an extended name. For
readability in your editor you may prefer shorter strings, in this case use the
concatenation operator (&) to break the string into multiple parts on multiple lines.
# 009
A 'name' must not contain a CR character.
Check to make sure that you have placed a terminating quote character on
the end of the string. If the string is too long to enter on one line, use the
concatenation operator (&) to break the string into multiple parts on multiple lines.
If you require that a carriage return character be embedded in the string, use the
syntax: 'string1' & CR & 'string 2' to concatenate two substrings with a carriage
return character.
Check to make sure that the string or extended identifier indicated contains
only valid VHDL characters. If the string or extended identifier appears to include
only valid characters, check to make sure your text editor or word processor has
not inserted illegal non-graphic characters.
# 011
A bit string must not contain a new line character.
Check to make sure that you have placed a terminating quote character on
the end of the bit string.
Check to make sure that you have used the same character delimiter at
the beginning and end of the bit string. If you have used the replacement character
'%' in the bit string, make sure that the same replacement character is used as both
the first and second delimiter.
# 013
Illegal binary value 'character' in bit string.
Check to make sure that the bit string is in a valid binary number format,
or change the base specification to reflect the format used.
# 014
A Bit string must not have '_' as its first element.
The compiler has encountered an illegal use of the special character '_' in
a bit string. The '_' character may not be used as the first or last character in a bit
string.
Check to make sure that the bit string does not begin with a '_' character.
The compiler has encountered an illegal use of the special character '_' in
a bit string. The '_' character can only be used to provide separation between
numeric characters in a bit string, and must be entered as a single character.
Check to make sure that the bit string does not include extraneous '_'
characters.
# 016
A bit string must not have '_' as its last element.
The compiler has encountered an illegal use of the special character '_' in
a bit string. The '_' character can only be used to provide separation between
numeric characters in a bit string. The '_' character may not be used as the first or
last character in a bit string. Check to make sure that the bit string does not end
with an extraneous '_' character.
# 017
Illegal octal value 'character' in bit string.
The compiler has encountered an invalid octal format bit string. Octal bit
strings must include only the characters '0' through '7' and the special character '_'.
Check to make sure that the bit string is in a valid octal number format, or
change the base specification to reflect the format used.
Check to make sure that the bit string is in a valid hexadecimal number
format, or change the base specification to reflect the format used.
# 019
Based literal contains illegal character 'character'.
Check to make sure that the based numeric literal is in a valid numeric
format that matches the base specification.
# 020
Literal Base must not be greater than 16.
The compiler has encountered an invalid based numeric literal. The literal
base specification must be in the range of 2 to 16. Check to make sure that the
literal has a valid base specification.
The compiler has encountered an invalid based numeric literal. The literal
base specification must be in the range of 2 to 16.
Check to make sure that the literal has a valid base specification.
# 022
Illegal literal format, missing 'E'.
Check to make sure that the floating point literal is specified correctly.
(Note, however, that floating point numbers are only supported as integers during
synthesis. The fractional part of a floating point number will be truncated.)
# 023
A number must not contain '_character'.
Check to make sure that there are no invalid characters used in the
numeric literal, and that the '_' character is used properly.
Check to make sure that there are no missing or additional delimiters (such
as white space or newline) at the end of the number.
# 025
An identifier may not contain consecutive under bars '__'.
Check to make sure that there are no invalid characters used in the
numeric literal, and check to make sure there are no extraneous consecutive '_'
characters in the numeric literal.
Check to make sure that there are no invalid characters used in the
identifier. Also consider using the extended identifier syntax; an extended identifier
may contain any graphic character. Extended identifiers have a backslash (\) as
their first and last character. Also note that extended identifiers are case sensitive.
# 027
An identifier may not have '_' as its last character.
Check to make sure that the '_' character is not used as the last character
in the identifier.
Check to make sure that the text editor you have used to create the source
file has not placed illegal characters (such as word processor control codes) into
your source file.
# 029
'mm': unknown command option 'name'.
# 030
Unable to create a temporary file.
Check to make sure that you have sufficient space on the disk. Also check
to make sure the disk drive is not write protected or a read- only device. If you have
a networked system, check to ensure that you have adequate network privileges.
Check to make sure the disk drive or network directory is available. If you
have a networked system, check to make sure that you have adequate network
privileges.
# 032
Unable to write to a temporary file.
Check to make sure that you have sufficient space on the disk. Also check
to make sure the disk drive is not write protected or a read-only device. If you have
a networked system, check to ensure that you have adequate network privileges.
Also check to ensure that your system has adequate physical memory,
and that there is enough free memory to run the synthesis software. (Select the
Help About menu item from the Windows Program Manager -- or Help About
Windows 95 in any Windows 95 folder window -- to determine the amount of free
memory available.)
If your design is very large, you should consider partitioning it into multiple,
smaller design modules and synthesize those modules independently.
# 034
Disk is full.
# 036
Design too large for Demonstration version.
Check to make sure that the number of semicolons in your design is within
the restriction imposed by the demonstration version. If you are not intending to run
the software in demonstration mode, check to ensure that the software security
device is properly attached.
# 082
Unable find package 'standard' in the file 'std.vhd'.
Check to make sure the std.vhd file has not become corrupted. If
necessary, re-install the std.vhd file from the installation disk.
The compiler was unable to find the indicated entity in the specified input
source files.
Check to make sure that you have specified the top-level entity correctly.
Check also to make sure you have specified all necessary source files on the
command line, and that the desired top-level entity exists.
# 084
Architecture 'name' does not exist in the design.
The compiler was unable to find the indicated architecture in the specified
input source files.
Check to make sure that you have specified the top-level architecture
correctly.
Also check to make sure you have specified all necessary source files on
the command line, and that the desired top-level architecture exists.
The compiler has determined that the input and output file names you have
specified are the same.
Check to make sure that you have specified the correct file names for input
and output files, and check to make sure you have specified the correct file name
extensions.
# 086
Incorrect version of library STD.
Check to make sure the std.vhd file has not become corrupted. If
necessary, re-install the std.vhd file from the installation disk.
Also check to make sure you do not have an old version of std.vhd
somewhere on your path, or in your project directory.
Check to make sure the metamor.vhd file has not become corrupted. If
necessary, re-install the metamor.vhd file from the installation disk.
Also check to make sure you do not have an old version of metamor.vhd
somewhere on your path, or in your project directory.
# 088
Install error, file name is missing.
The compiler has encountered a missing file, this file is part of the product
and must be present.
If the directory containing the file is on a networked drive, check that the
drive is shared. Once you verify that the file is missing, re-install the product.
# 089
Install error, file name is incorrect version.
The compiler has encountered a file that is part of the product but is from
another version of the product. This file is incompatible and must be replaced.
Check to make sure that you have correctly specified the expression.
Also check to make sure the indicated name has been declared, and is not
hidden by another declaration.
# 101
'name ' has not been declared as a 'description'.
Check to make sure that you have provided a component declaration for
the indicated component.
The compiler has determined that the mode (direction) of the actual
parameter indicated is not compatible with the mode of the formal parameter.
For example, you cannot connect an actual that is itself an out port, to a
formal that is an inout port.
Check to make sure that the mode specified in the component declaration
is compatible with the mode of the actual parameter.
Check to make sure the mode on the component declaration is the same
as the mode on its entity port declaration.
Also check to make sure you have associated the actual parameters to
formal parameters as expected. A mode conflict is actually an electrical rules
check, and usually indicates a design error. It is often possible to work around this
error using a temporary signal as the actual.
# 103
No actual is specified for generic 'name''.
Check to make sure that all required generic parameters have been
specified, or add a default value to the declaration of this generic.
The compiler has determined that the indicated port of an entity has been
left unspecified or specified as open. Input ports that do not have default values
must be connected.
Check to make sure that all necessary input ports have been specified with
actual parameters, or add default values to those ports that will be left
unconnected.
# 105
Port 'name' has mode description has a type that is unconstrained and may not be
unconnected.
The compiler has encountered a port mapping that is invalid, due to the
use of a formal port that has an unconstrained array type. All ports that have
unconstrained types must be connected.
Check to make sure that you have described the intended port mapping,
and have not inadvertently omitted one or more ports from the port map or
specified this port as open.
# 107
'name ' is not an Entity.
Check to make sure that you have entered the name of the entity correctly.
Also check to make sure you have not used the same name to identify a
local signal or other object, and that the entity is made visible with a use statement
or with a selected name such as work.entity.
Check to make sure the type or subtype has been entered properly.
Also check to make sure the type or subtype has been declared correctly,
and is visible in the current region of the design. If the type or subtype declaration
was made within a package, make sure you have provided the appropriate use
statement to make that declaration visible.
# 109
A Return statement in a procedure must not return an expression.
Check to make sure that a procedure is what you really intended to create.
If you need to return values from a procedure, you will need to use procedure
parameters of mode out or inout, or replace the procedure with a function.
Check to make sure that all return statements within the function have valid
return values.
# 111
Operator function has too few parameters.
Check to make sure that the number of function parameters matches the
requirements of the specified operator.
# 112
Operator function has too many parameters.
Check to make sure that the number of function parameters matches the
requirements of the specified operator.
Check to make sure that the explicit type conversion is being used for
closely related types, or use a type conversion function.
# 114
'name ' has no Architecture named 'name'.
Check to make sure that the correct architecture name has been used.
Also check to ensure that the specified architecture exists in the design
source files.
# 115
'name ' is already declared as a description.
Check to make sure that you are specifying the correct identifier name and
that the name is unique in this declarative region, remove one of the duplicate
declarations.
Check to make sure that you have used the correct name at the end of the
section.
Also check to make sure that you have not omitted one or more end
statements.
# 117
Block configuration must be an Architecture.
Check to make sure that the name specified in the block configuration is
an architecture, and that the architecture specified exists in the design.
# 119
Unable to determine the range of a non-scalar type.
Check to make sure that a range is actually needed, or rewrite the design
so that a scalar data type is used.
Check to make sure that the subtype and base type are compatible with
the constraint specified.
# 121
'name ' is not an array.
Check to make sure that the object or literal you are specifying is an array
type.
# 123
Attempt to select element of an object whose type is not a record.
Check to make sure that the object you are specifying is a record type of
object. If you did not intend to specify a record field, check to make sure you have
not inadvertently used a '.' operator or other record-related syntax.
Check to make sure that you have specified the declaration properly in the
package body. If the declaration is for a subprogram, check to make sure the
parameters are correctly specified and have matching class, mode, type and
names.
Also check to make sure the specified identifier has been properly
declared (as a prototype) in the package.
# 125
'name ' is not a Physical Unit.
Check to make sure that the physical type definition includes the physical
unit you have specified. If you did not intend to specify a physical type literal, check
to make sure you have not inadvertently omitted an operator or other language
element from the statement.
Check to make sure that you have specified a valid package, library, entity
or architecture name in the statement.
# 127
Physical unit prefix must be a number.
Check to make sure that the physical type definition includes a valid
numeric prefix. If you did not intend to specify a physical type literal, check to make
sure you have not inadvertently omitted an operator or other language element
from the statement.
Check to make sure that the correct base type has been referenced, and
check to make sure that the range specified falls within the range of the base type.
# 129
Illegal NULL in expression, NULL must be in a simple assignment.
The compiler has encountered an illegal use of null. When used as a value,
null may only be used in the right hand side of a simple assignment, and may not
appear within an expression.
Check to make sure that null was really intended in the expression. You
may be able to simplify the expression to a simple assignment by using a selected
assignment or similar statement.
# 130
Others must be the last choice in a selected signal assignment.
The compiler has encountered an illegal use of the choice others. Others
is only allowed as the last choice in a series of choices.
Check to make sure that the others choice is at the end of the series of
choices.
The compiler has encountered an illegal use of the choice others. Others
is only allowed as the last choice in a case statement.
Check to make sure that the others choice is at the end of the case
statement.
# 132
Others must be the only choice in a selected alternative.
The compiler has encountered an illegal use of the choice others, it may
not be or'd with another choice (for example, a case of the following form is illegal:
when '000' | others => .....).
Check to make sure that the others choice is the only choice in the
selected alternative. You can probably remove the or'd choice.
# 133
Others must be the only choice in a case alternative.
The compiler has encountered an illegal use of the choice others, it may
not be or'd with another choice (for example, a case of the following form is illegal:
when '000' | others => .....).
Check to make sure that the others choice is the only choice in the
selected alternative. You can probably remove the or'd choice.
Check to make sure that you have terminated the concurrent statement
with the correct label.
# 135
An Exit statement must be within a loop statement.
The compiler has encountered an incorrect use of the exit statement. Exit
is used to terminate execution of a loop, and must be used within a loop.
Check to make sure that the exit statement is being used within a loop.
Also check to make sure you have not inadvertently terminated the loop
prior to the exit statement with a misplaced end statement.
Check to make sure that the optional loop label has been correctly
specified.
Check to make sure the loop (or loops) in which the exit statement is being
used are correctly labeled.
# 137
A Next statement specifies a label that is not a Loop label.
Check to make sure that the optional loop label has been correctly
specified.
Check to make sure the loop (or loops) in which the next statement is being
used are correctly labeled.
Check to make sure that the return statement is being properly used within
a function or procedure.
# 139
A passive process may not contain a signal assignment.
Check to make sure the process has been entered in the desired location
of the source file. If the process is not intended to be passive, it must be located
within an architecture declaration.
# 141
Illegal NULL in concurrent signal assignment.
Check to make sure that you really need to assign the signal to null. If you
are attempting to describe an output enable, you should use the std_logic data type
and assign the signal a value of 'Z', rather than null. If you require an assignment
of null, modify the design so that the assignment is performed within a process or
subprogram.
Check to make sure that a guard expression or the implicit signal guard
has been specified for the guarded block. If guard is not an implicit signal, check to
make sure it has been properly declared as a Boolean type.
# 143
'guard' is not a signal.
The compiler has encountered an invalid use of the signal guard. Guard is
not an implicit signal in this context, and is not declared as a Boolean-type signal.
Check to make sure that you have not specified the wrong signal name.
Also check to make sure you have correctly declared the explicit guard
signal.
The compiler has encountered an invalid use of the special signal guard.
The condition expression of the guarded block does not evaluate to a Boolean
result, or guard has been declared as a non-Boolean type.
# 145
Target of un-guarded assignment is guarded.
Check to make sure that you have specified the guarded keyword for all
assignments to guarded signals.
Check to make sure that you have correctly entered the procedure name
with the correct number of arguments, each of the correct type.
Also check to make sure there is no other local declaration that hides the
procedure declaration, and that the procedure declaration is visible in the current
region of the design.
# 147
Positional association must not follow named association.
Check to make sure that the ports have been specified in the correct order.
Also check to make sure you have not inadvertently omitted one or more
named associations.
The compiler has encountered an attribute name that has not been
declared.
Check to make sure that the attribute has been properly declared. If the
attribute declaration is in a package, make sure the package has been properly
loaded from the library, and make sure the package contents have been made
visible with a use statement.
# 149
Attribute not defined for this object.
The compiler has encountered an attribute use that is not defined for the
object the attribute is being applied to.
Check to make sure that the attribute has been defined for the type of the
object. Use a type conversion, if necessary, to convert the object to the correct data
type, or use an attribute that has been declared for the data type.
# 150
Prefix for attribute 'base must be a type or subtype.
Check to make sure that you are using the correct attribute. If necessary,
add the appropriate attribute parameter.
# 152
Attribute 'base must be the prefix of another attribute.
Check to make sure that you are using the attribute correctly.
# 153
Attribute 'attribute may not have a parameter if the prefix is a scalar type.
Check to make sure that the attribute is being used correctly, and that the
prefix is an enumeration type or integer.
# 155
Attribute 'attribute must have a parameter.
Check to make sure that you are using the correct attribute. Add an
attribute parameter if necessary.
# 157
Signal attribute prefix is not a signal.
Check to make sure that the attribute is being used correctly, and that the
prefix is a signal identifier.
Note that most signal attributes are not supported for synthesis.
Check to make sure that the elements of the aggregate have been
specified in the correct order. Also check to make sure you have not inadvertently
omitted one or more named associations.
# 159
Choice Others must only occur once in an aggregate.
The compiler has encountered more than one use of the others choice in
an aggregate. Others may only be used once to define the default assignment in a
aggregate.
Check to make sure that you have only provided one others choice in the
aggregate.
# 160
Choice Others must be last element of an aggregate.
Check to make sure that you have only provided one others choice in the
aggregate, and that it is the last choice.
The compiler has encountered an illegal use of the choice others, it may
not be or'd with another choice (for example, a case of the following form is illegal:
when 7 | others => .....).
Check to make sure that the others choice is the only choice in the
selected alternative. You can probably remove the or'd choice.
# 162
Unable to action library file 'name'.
For read, check to make sure the library file exists, and is located in the
current working directory, in the library directory, or is correctly specified in the list
of files in a library alias.
For write of a compiled library file, check to make sure you have write
privileges in the specified directory.
Check to make sure that the identifier has been entered correctly, and is
the expected type of object, design unit, loop, block, or subprogram.
# 164
'name ' is not a user defined attribute.
Check to make sure that that the attribute name has been correctly
entered. If an attribute was not intended, check to make sure the ' (single quote)
character has not been incorrectly used.
# 165
Subtype has more dimensions than base type.
Check to make sure that the correct base type has been referenced, and
check to make sure that the dimensions of the subtype are compatible with the
range of the base type.
Check to make sure that the correct base type has been referenced, and
check to make sure that the index of the subtype is compatible with the range of
the base type.
# 167
Base type of subtype must not be a record.
Check to make sure that the correct base type has been referenced, and
check to make sure that the base type is not a record type.
# 168
Base type for index constraint must be an array.
Check to make sure that the correct base type has been referenced.
Check to make sure that the correct base type has been referenced, or
constrain the array subtype with a valid range.
# 170
'name ' was declared outside of the function in which it is used.
Check to make sure that you are referencing an object that is local to the
function, or has been passed into the function via the parameter list.
# 171
A function may not contain a wait statement.
Note that wait statements are legal within procedures, but are not
supported for synthesis.
The compiler has encountered a function that does not contain a return
statement. Functions must have at least one return statement with a return value .
Check to make sure that a return statement is the last statement of the
function, and that the return statement is not dependent on an if statement or other
conditional expression.
# 173
The subtype indication given in the full declaration of 'name' must conform to that
given in the deferred constant declaration.
Check to make sure that the same subtype indications of the deferred and
full constant declaration are compatible.
# 174
Range of a physical type must be an integer.
Check to make sure that the physical type declaration includes a valid
base unit, and that subsequent units are defined using an integer multiplier.
Check to make sure that you have provided a function or procedure body
for the subprogram. If the subprogram has been declared within a package, make
sure that a corresponding package body has been provided that includes the
function or procedure body.
Also check to make sure the declarations in the package and package
body match.
# 176
Deferred constant declaration 'name', is not declared in a package body.
Check to make sure that you have provided a full constant declaration for
the indicated deferred constant.
Check to make sure that you are using the return statement correctly to
exit from a subprogram.
Also check to ensure that you have not incorrectly placed one or more end
statements that would cause the subprogram to be prematurely terminated.
# 178
Next statement must be within a Loop statement.
The compiler has encountered a next statement that is not within a function
or procedure body.
Check to make sure that you are using the next statement correctly in the
subprogram.
Also check to ensure that you have not incorrectly placed one or more end
statements that would cause the subprogram to be prematurely terminated.
Check the proper use of the unaffected keyword and modify the design.
# 180
Attempt to assign to a port with mode IN.
The compiler has encountered an invalid use of a port with mode in. It is
not legal to assign values to ports that have been declared as mode in.
Check to make sure that you are assigning to the correct port in your
design. If you need to assign a value to the port, use mode inout or out.
# 181
Attempt to assign to a port with mode LINKAGE.
The compiler has encountered an invalid use of a port with mode linkage.
It is not legal to assign values to ports that have been declared as mode linkage.
Check to make sure that you are assigning to the correct port in your
design. If you need to assign a value to the port, use mode inout or out.
The compiler has encountered an invalid use of the implicit signal guard.
This signal is created as a result of a guard expression, and may not have a value
assigned to it.
Check to make sure that you have not specified the wrong identifier name
in the assignment. If you are attempting to modify the guard expression
dynamically, you will need to rewrite the design so there are multiple guarded
blocks specified with the required guard expressions.
# 183
Attempt to assign to an alias of a port with mode IN.
The compiler has encountered an invalid use of a port with mode in. It is
not legal to assign values to ports, or to aliases of ports, that have been declared
as mode in.
Check to make sure that you are assigning to the correct port in your
design. If you need to assign a value to the port, use mode inout or out.
The compiler has encountered an invalid use of a port with mode linkage.
It is not legal to assign values to ports, or to aliases of ports, that have been
declared as mode linkage.
Check to make sure that you are assigning to the correct port in your
design. If you need to assign a value to the port, use mode inout or out.
# 185
A description cannot be the target of a Signal assignment statement.
Check to make sure that the left side of the assignment is a signal or port.
If you are assigning to a variable, use the variable assignment operator := .
Check to make sure that the left side of the assignment is a variable. If you
are assigning to a signal or port, use the signal assignment operator <= .
# 187
Expected a static expression, description 'name' is illegal here.
The compiler has encountered an invalid use of a port with mode out. It is
not legal to read values of ports, or aliases of ports, that have been declared as
mode out.
Check to make sure that you are specifying the correct port in your design.
If you need to read the value of a port, use mode buffer. You could also consider
mode inout; this, however, specifies bi-directional data flow and is often
overspecification.
# 189
'name ' is not a static signal name.
# 190
Enumerated type contains duplicate element 'name '.
Check to make sure that you have not incorrectly typed in the enumerated
values for the type. Remove or rename the duplicate entries.
Check to make sure that all array types in your design are provided with
valid array bounds (ranges).
# 192
Function parameter must be mode IN.
# 193
Package Body with no Package of same name.
The compiler has encountered a package body that does not correspond
to any package in the design.
Check to make sure that the expression used for the array index results in
a integer or other valid index value. Introducing an intermediate signal or variable
can help to resolve data type ambiguities.
# 195
Array must have an index constraint.
Check to make sure that the array is provided with an index constraint.
# 196
Prefix of a selected name cannot be a slice name.
Check to make sure that you have correctly specified the selected name.
If a selected name was intended, check to make sure the prefix of the selected
name is a valid selection name.
Check to make sure that the named association has been correctly
entered.
Also check the component declaration to ensure that the lower- level entity
has been properly declared.
# 198
Only the last entry in a group template declaration can include a <>.
Check to make sure that you have specified a legal group template
declaration, and modify the entries accordingly.
The compiler has encountered a when expression that does not match the
possible values specified in the selected expression.
Check to make sure that the when expressions specified in the selected
assignment are non-overlapping, and fall into the range of possible values for the
selection.
# 201
Value of when expression is outside range of values of case expression.
The compiler has encountered a when expression that does not match the
possible values specified in the case condition expression.
Check to make sure that the when expressions specified in the case
condition expression are non-overlapping, and fall into the range of possible values
for the case statement.
# 202
Operands have types that are incompatible with the operator 'operator'.
Check to make sure that the operand types have the required operations
defined for them. If the operand types do not support the operator you are using,
you can use a type conversion function to convert the operands to the required
types, or write your own overloaded operator.
The compiler has encountered an identifier that has not been declared, or
has been declared but is not visible here.
Check to make sure that the indicated identifier has been declared, and is
visible where it is being referenced. If the identifier has been declared within a
package, make sure the declaration has been made visible with a use statement.
Also check to make sure the name has not been hidden by another
declaration.
# 204
Operands of 'name' have incompatible types.
Check to make sure that the operand types have the required operations
defined for them. If the operand types do not support the operator you are using,
you can use a type conversion function to convert the operands to the required
types.
# 206
Parameter associated with formal 'name' must be a Signal.
# 207
Formal parameter 'name' and its actual parameter have incompatible types.
Check to make sure that the actual and formal parameters have
compatible types. If the types are different, you may be able to use a type
conversion function to convert the operands to the required types.
Check to make sure that the guard expression has a boolean type.
# 209
Range of an integer type declaration must be some integer type.
Check to make sure that the range has been correctly specified. Make sure
the range is specified using integer values.
# 210
Unable to determine type of attribute prefix.
Check to make sure that the attribute is being used in the intended way.
You may be able to simplify the description and remove the type ambiguity by
introducing an intermediate signal or variable of the correct type.
Check to make sure that the attribute prefix is of the intended type, and that
the correct attribute is being used.
# 212
Parameter of an array attribute must be a universal integer.
Check to make sure that the array attribute parameter is a universal integer
value.
# 213
Operand has a type that is incompatible with the operator 'operator'.
Check to make sure that the operand types have the required operations
defined for them. If the operand types do not support the operator you are using,
you can use a type conversion function to convert the operands to the required
types.
Check to make sure that the left operand is a floating type value, or use a
type conversion to convert the value to floating point.
# 215
No parameter associated with formal parameter 'name'.
Check to make sure that you have specified all required parameters to the
procedure or function.
# 216
There are more actual parameters than formal parameters.
Check to make sure that you have specified the correct number and type
of required parameters when invoking the procedure or function.
Check to make sure that the subprogram you have invoked is declared as
a procedure, or use the subprogram in such a way that the return value is used.
# 218
Expected a Function and not a Procedure.
# 219
Function returns an incompatible type.
Check to make sure that the types are compatible. Use a type conversion
function if necessary to convert the returned function value to the appropriate type.
The compiler has encountered a call to a procedure that does not exist, or
that is not visible in the current region of the design.
Check to make sure that the procedure has been declared properly, and
that the declaration is visible. If the procedure was declared in a package, you must
include a use statement prior to the current design unit to make the declaration
visible.
Procedures may be overloaded; check that the number and type of the
actual arguments match one of the formal declarations of the procedure.
# 221
No function definition matches 'name'.
The compiler has encountered a call to a function that does not exist, or
that is not visible in the current region of the design.
Check to make sure that the function has been declared properly, and that
the declaration is visible. If the function was declared in a package, you must
include a use statement prior to the current design unit to make the declaration
visible. Functions may be overloaded, check that the number and type of the actual
arguments match one of the formal declarations of the function.
Check to make sure that you have specified all required parameters to the
procedure or function.
# 223
More than one association specified for formal parameter 'name '.
Check to make sure that you have specified all required parameters to the
procedure or function.
# 224
The aggregate has an incompatible type in this context.
Check to make sure that the aggregate is of the correct format for the
intended usage. The type of an aggregate is determined from the context, check
that the type of the aggregate is clear in this context.
Check to make sure that the string is of the correct format for the intended
usage, and that the type of the elements of the string can be distinguished in this
context. The type of a string is determined from the context, check that the type of
the string is clear in this context.
# 226
The bit string has an incompatible type in this context.
Check to make sure that the string is of the correct format for the intended
usage as a bit string, and that the type of the elements of the string can be
distinguished in this context. The type of a bit string is determined from the context,
check that the type of the bit string is clear in this context.
# 227
The direction of the slice is not the same as the direction of the prefix.
The compiler has encountered an index range that does not match the
direction of the array prefix.
Check to make sure that the declaration of the array matches (in terms of
direction, either to or downto) the range specified in the array slice.
The compiler has encountered a procedure that has two or more possible
declarations, but is unable to determine which procedure declaration is intended
due to ambiguous parameter types.
Check to make sure that the parameter types are clearly specified.
Introducing intermediate variables or signals can help to resolve ambiguous types.
# 229
Unable to determine type of attribute parameter.
Check to make sure that the type of the attribute parameter is clearly
distinguished.
# 230
Prefix of attribute 'attribute must be a scalar type.
Check to make sure that the attribute is being applied to a scalar type.
Check to make sure that the attribute is being applied to an array data type.
# 232
Attribute parameter value exceeds dimensionallity of array.
# 233
An If statement condition expression must be type boolean.
Check to make sure that the expression will evaluate to a Boolean value.
If you are testing a binary value (such as a bit type signal), you should use the
relational operator '=' to create a Boolean result.
Check to make sure that the expression will evaluate to a Boolean value.
If you are testing a binary value (such as a bit type signal), you should use the
relational operator '=' to create a Boolean result.
# 235
Select expression must be an integer type, enumerated type, or an array.
Check to make sure that you have specified a valid select expression, and
that the expression evaluates to an integer, enumerated type or array.
# 236
Case expression must be an integer, enumerated type, or an array.
Check to make sure that you have specified a valid case expression, and
that the expression evaluates to an integer, enumerated type or array.
Check to make sure that you have specified a valid select expression, and
that the expression evaluates to an integer, enumerated type or single-dimension
array.
# 238
Case expression must not be a multi-dimensional array.
Check to make sure that you have specified a valid case expression, and
that the expression evaluates to an integer, enumerated type or single-dimension
array.
# 239
Unable to determine type of With expression from context.
Check to make sure that the with expression has been clearly specified. If
necessary, introduce one or more intermediate signals to clearly distinguish the
types of the expression elements.
Check to make sure that the case expression has been clearly specified.
If necessary, introduce one or more intermediate signals to clearly distinguish the
types of the expression elements.
# 241
The type of a With expression must be locally static.
The compiler has encountered a with expression that has a type that is not
locally static.
Check to make sure that the type of the with expression is locally static.
# 242
The type of a Case expression must be locally static.
The compiler has encountered a case expression that has a type that is
not locally static.
Check to make sure that the type of the case expression is locally static.
Check to make sure that you have correctly specified the loop range.
# 244
Assert condition must be type 'boolean'.
Check to make sure that you have correctly specified the assert statement.
If the assert expression is an object name, check to make sure the object has been
declared as type Boolean. If necessary, use the '=' comparison operator to create
a Boolean expression.
# 245
Assert severity must be type 'severity_level'.
Check to make sure that you have correctly specified the value of the
assert severity.
Check to make sure that you have correctly specified the assert report
string.
# 247
Shift or rotate right operand must be type 'integer'.
The compiler has encountered an invalid use of the shift or rotate operator.
Only integer values are allowed as the shift distance (right operand).
Check to make sure that you have correctly specified the shift operation.
Check also to make sure the right operand evaluates to an integer type.
# 248
Unable to resolve overloaded function 'name'.
Check to make sure that the parameters of the function are clearly
distinguished in terms of their types.
The compiler has encountered an illegal use of the others choice. The
aggregate being specified includes an unconstrained array.
# 250
Record aggregate contains too many elements.
Check to make sure that the declaration of the record matches its use in
the record aggregate.
# 251
Others must represent at least one element.
The compiler has encountered an others clause that does not represent
any possible elements.
Check to make sure that the others clause is being used correctly.
# 253
Record aggregate contains unknown named association.
Check to make sure that the named associations have been properly
entered, and all names used in the association are valid.
# 254
Operands of 'operator' have incompatible lengths.
Check to make sure that the correct operands have been specified, and
that they have the type and length required.
The compiler has encountered an array index that is invalid. The index is
outside the range of the array declaration.
Check to make sure that the declaration of the array matches the use of
the array.
# 256
Duplicate association in array aggregate, it is a duplicate of association on line
number
Check to make sure that the array association has been correctly entered.
Check the duplication association indicated for more information.
# 257
Duplicate choice in selected signal assignment, it is a duplicate of choice on line
number.
Check to make sure that the choice has been correctly entered.
Check to make sure that the choice has been correctly entered.
# 259
Choice Others is required when selected signal assignment expression is a univer-
sal integer.
Check to make sure that an others choice has been provided, or do not use
a universal integer.
# 260
Choice Others is required when case statement expression is a universal integer.
The compiler has encountered a case statement that does not include a
required others choice due to the use of a universal integer.
Check to make sure that a universal integer is really what you intend in the
case expression. Add an others choice to the case statement to cover the
unspecified conditions.
The compiler has encountered a selected signal assignment that does not
include all possible choices. Selected signal assignments must include all possible
choices.
Check to make sure that you have included all possible choices in the
selected signal assignment, or add the others choice to define a default choice.
# 262
Missing choice in case statement.
Check to make sure that all possible choices are included in the case
statement, or add an others choice.
# 263
The value of the choice is outside the range of array elements.
The compiler has encountered a choice in a case statement that does not
fall in the range of possible values specified in the selection expression.
Check to make sure that the selection expression and choices in the case
statement are compatible.
Check to make sure that you have not inadvertently omitted the named
association for one or more elements of the aggregate.
# 265
Too few elements in array aggregate.
The compiler has encountered an array aggregate that does not match the
usage. The number of elements in the array aggregate is incorrect.
Check to make sure that source and destination array aggregates match,
in terms of the number and types of their elements.
# 266
Too few elements in string.
The compiler has encountered a string that is not valid in the current
context.
Check the format of the string, and check to ensure that it matches the
intended usage.
The compiler has encountered a bit string that does not match (in terms of
size) the objects used in an expression or assignment.
Check to make sure that the bit string contains the correct number of bit
characters. If you have entered the bit string using an alternate (non-binary) format,
check to ensure that the bit string represents the expected number of bits when
analyzed.
# 268
Too many elements in array aggregate.
The compiler has encountered an array aggregate that does not match the
usage. The number of elements in the array aggregate is incorrect.
Check to make sure that source and destination array aggregates match,
in terms of the number and types of their elements.
The compiler has encountered a quoted string that illegal for the current
expression or assignment.
Check to make sure that the string is of the correct format for the intended
usage.
Also check to ensure that you have not omitted the terminating quote
character.
# 270
Too many elements in bit string.
The compiler has encountered a bit string that does not match (in terms of
size) the objects used in an expression or assignment.
Check to make sure that the bit string contains the correct number of bit
characters. If you have entered the bit string using an alternate (non-binary) format,
check to ensure that the bit string represents the expected number of bits when
analyzed.
Check to make sure that the target of the assignment is a type compatible
with the assigned value.
Check the declaration of the subtype to ensure that it specifies the required
range.
# 272
Too many elements in record aggregate.
Check to make sure that the record type declaration is compatible with the
aggregate you have specified.
# 274
Aggregate type must be array or record.
Check to make sure that the aggregate has been properly specified.
# 275
Parameter of attribute 'succ equals prefix'base'high.
The compiler has encountered an invalid use of the 'succ attribute. The
parameter of the 'succ attribute does not have a successor.
Check to make sure that the declaration of the base type is compatible with
the use of the 'succ attribute parameter.
The compiler has encountered an invalid use of the 'pred attribute. The
parameter of the 'pred attribute does not have a predecessor.
Check to make sure that the declaration of the base type is compatible with
the use of the 'pred attribute parameter.
# 277
Parameter of attribute 'leftof equals prefix'base'left.
The compiler has encountered an invalid use of the 'leftof attribute. The
parameter of the 'leftof attribute does not have a predecessor.
Check to make sure that the declaration of the base type is compatible with
the use of the 'leftof attribute parameter.
# 278
Parameter of attribute 'rightof equals prefix'base'right.
The compiler has encountered an invalid use of the 'rightof attribute. The
parameter of the 'rightof attribute does not have a successor.
Check to make sure that the declaration of the base type is compatible with
the use of the 'rightof attribute parameter.
Check to make sure that the attribute parameter is a valid integer value.
# 280
Parameter of attribute 'val is too small.
Check to make sure that the attribute parameter is a valid integer value.
# 281
Subtype range is not within the range of the base type.
Check to make sure that the correct base type has been referenced, and
check to make sure that the range of the subtype falls within the range of the base
type.
The compiler has encountered an invalid case statement. There are too
many choices provided for the possible values of the case condition expression.
Check to make sure that you have not specified case choices that overlap,
and that you have not duplicated the same choice in two different case choices.
# 283
Select expression is an array which must be of a character type.
Check to make sure that the selection expression is a valid array type.
# 284
Case expression is an array that must be of a character type.
Check to make sure that the selection expression is a valid array type.
# 286
Attempt to index non-array.
Check to make sure that the object being indexed is declared as an array.
Use a type conversion function to convert the object to a valid array type if
necessary.
# 287
Array index has an incompatible type.
The compiler has encountered an invalid array index. An array index must
be either an integer, enumerated or physical type.
Check to make sure that the array index has been correctly specified.
The compiler has encountered an invalid array index. An array index must
be either an integer, enumerated or physical type.
Check to make sure that the array index has been correctly specified.
# 289
A Next statement condition expression must be type boolean.
Check to make sure that the expression will evaluate to a Boolean value.
If you are testing a binary value (such as a bit type signal), you should use the
relational operator '=' to create a Boolean result.
Check to make sure that the expression will evaluate to a Boolean value.
If you are testing a binary value (such as a bit type signal), you should use the
relational operator '=' to create a Boolean result.
# 291
A while loop condition expression must be type boolean.
Check to make sure that the expression will evaluate to a Boolean value.
If you are testing a binary value (such as a bit type signal), you should use the
relational operator '=' to create a Boolean result.
Check to make sure that the argument types are clearly distinguished.
Introduce intermediate signals or variables if necessary to clearly distinguish the
types of literal values.
# 293
Too few elements in Group.
The compiler has encountered a group declaration that does not match the
size of the group template declaration.
Check to make sure that the group declaration and group template
declaration are compatible.
# 294
Too many elements in Group.
The compiler has encountered a group declaration that does not match the
size of the group template declaration.
Check to make sure that the group declaration and group template
declaration are compatible.
# 296
The signature does not match the 'description '.
Check to make sure that the type specified in the signature matches the
return value of the specified function or procedure.
# 297
A signature is required here because the 'description' is overloaded.
Check to make sure that the data types used for the operands are clear
and unambiguous. Add a signature if necessary to clearly identify the operator
function. Introducing intermediate signals or variables can often solve problems
with ambiguous types and operations.
The compiler has encountered a signal that is being driven in more than
one process.
Check to make sure that the signal is not assigned in more than one
process.
Note that it is legal VHDL to have a signal with multiple drivers if the signals
type is a resolved type (i.e. has a resolution function) such as 'std_logic' (but not
'std_ulogic'). It is a synthesis constraint, however, that resolution functions are
ignored so that no type is a resolved type. In this case you must recode your design
so that it does not depend upon the resolution function.
# 401
No Block label matches configuration label 'name'.
Check to make sure that the block label has been correctly entered in the
configuration.
The compiler has been unable to find the indicated component in the
current design. The configuration statement or declaration is invalid.
Check to make sure that the component name has been correctly specified
in the configuration.
Check also to make sure that the component has been properly
referenced in the design, and that the design unit in which the component has been
referenced is included in the current compile.
# 403
Generate range is unconstrained.
Check to make sure that the generate range specified is correct, and is
properly constrained.
# 404
Component has more than one binding.
Check to make sure that duplicate component bindings are not specified.
The compiler has encountered an invalid next or exit statement. The loop
label specified in the next or exit statement is not valid.
Check to make sure that the loop label specifies a valid loop, and that the
next or exit statement is inside the specified loop.
Also check to make sure you have not inadvertently terminated the loop
with a misplaced end loop statement.
# 406
The array index is illegal for a null array.
The compiler has encountered an array index for a null array. Null arrays
do not have any members, and therefore cannot be indexed.
Check to make sure that the array has been declared as intended, and that
the index is valid.
# 408
Design contains no entity.
The compiler was unable to find a valid entity in the input design files.
Check to make sure that you have correctly specified the input source files,
and that one or more valid entities exist in the design.
Check to make sure that the operator and operands have been correctly
specified.
# 421
Result of 'operator' exceeds minimum possible value.
Check to make sure that the operator and operands have been correctly
specified. Also check the range of the data type being used.
# 422
Divide by zero.
Check to make sure that the operator and operands have been correctly
specified.
# 431
Unconstrained range in CASE statement choice.
Check to make sure that the case statement has been correctly specified,
and that all choices specify constrained expressions.
# 432
Selected prefix is not a record.
Check to make sure that you are specifying a valid record type of object in
the attribute specification. If you did not intend to use a record attribute, check to
make sure you are specifying the correct attribute.
Check to make sure that the constant value is correctly specified, or use a
signal declaration if a non-constant value is required.
# 435
Generic value illegal for its type.
Check to make sure that you have correctly specified the generic value.
Also check to make sure the generic has been correctly specified in the
lower-level design unit.
The compiler has encountered a constant (scalar) value that is not legal for
the type used. This error is most likely the result of specifying a numeric value that
is outside the valid range of numeric types.
Note that the value of a constant must be within the range of the subtype
of the constant.
Check to make sure that the constant has been entered in the format
required for the type.
Also check to ensure that you have specified a value that is in the legal
range for the type.
# 437
Expected signal, variable, or constant but not a description .
The compiler has encountered a named item (such as a design unit name,
subprogram name, type or block name) when a signal, variable or constant name
was required.
Check to ensure that you have used the correct object name.
Also check to make sure that you have not inadvertently used the same
name for a block, loop or process label as you have used for a signal, variable or
constant.
Check to make sure that the iteration range has been properly specified.
# 440
Subprogram call actual parameter is an unconstrained array.
Check to make sure that the function or procedure is being used properly,
and check to ensure that all parameters specified when using the subprogram are
valid.
Check to make sure that the procedure is being used properly, and check
to ensure that all parameters specified when using the subprogram are valid. If the
parameter indicated is intended to be a procedure input, then change the
parameter's mode from 'out' to 'in'.
# 442
Function 'name' has no return statement.
The indicated function has not been provided with a return statement. All
functions must be provided with a value prior to exiting. This value must be
specified using a return statement.
Check to make sure that the function is provided with a return statement,
and that there is no possibility of the return statement to be skipped as a result of
a conditional expression.
# 451
Named association missing from record aggregate.
Check to make sure that each item in the record aggregate is provided with
a named association, or use positional association and do not omit any record
elements.
# 452
Named association missing from array aggregate.
Check to make sure that each item in the array aggregate is provided with
a named association, or use positional association and do not omit any array
elements.
Check to make sure that each item in the record aggregate is provided, or
use named association to specify the aggregate.
# 454
Description 'name' has a type that is an unconstrained array.
Check to make sure that you have properly specified the array, and
provided a constraint range if necessary.
# 460
Combinational Feedback using variable 'name'.
The compiler has determined that the indicated variable will require
combinational feedback to produce the specified behavior. Combinational
feedback is specified whenever a variable's value is read prior to its having been
set in a process or subprogram.
Check to make sure that you have used the variable correctly. If you did
not intend to generate a combinational feedback loop, be sure you have assigned
a value to the variable before attempting to use it in an expression.
The compiler has encountered a use of the 'Z' or null value that appears to
be for describing an output enable, but enable logic following the conventions of
the Metamor synthesis compiler has not been specified.
Check to make sure that an enable expression has been specified using a
conditional signal assignment or an if statement. Also check that an if statement
describing a tristate is a simple if statement, and not embedded within another if
statement or a case statement.
# 480
Constraint: The name library does not contain a description.
The compiler has encountered the use of a logic element that does not
exist in the named gate library (not VHDL library), and is unable to re-synthesize to
some logic element that does exist in the library. The logic element description will
be some form of flip-flop, latch, or tristate. The element does not exist in the target
gate library because it has no realization in the target silicon. A common example
of a structure that may cause this error is a flip-flop with both set and reset.
Change the VHDL source code desription so it does not describe this logic
element.
Check to make sure that the wait statement is the first statement in the
process. If you are attempting to describe registered behavior with an
asynchronous reset, you should use a sensitivity list and an if-then statement to
described the reset and clock logic.
# 501
Constraint: Process contains more than one Wait statement.
The compiler has encountered more than one wait statement being used
in a process. Only one wait statement may be used in a process, and that wait
statement must be the first statement in the process.
Check to make sure that the wait statement is the first statement in the
process, and do not attempt to use more than one wait statement in any one
process. If you are trying to describe a system with multiple clocks, you will have
to use multiple processes.
Check to make sure that the formal part of the subprogram or component
is not a function call.
# 503
Constraint: Signal attribute 'attribute is not supported.
Check to make sure that the correct attribute is being used, or remove the
attribute.
If you are attempting to describe registered logic in a procedure, use the if-
then synthesis convention for describing flip-flop logic.
# 505
Constraint: Expected a static expression, description 'name ' is not allowed here.
Check to make sure that the expression is static, and does not depend on
the value of a signal or port.
Check to make sure that the expression is static, and does not depend on
the value of a signal or port.
# 507
Constraint: '**' is supported only for constant operands.
Check to make sure that the exponent value specified is a constant value.
# 508
Constraint: Assign to array element must have constant array index.
Check to make sure that the index argument used in the target of the
assignment is a constant value.
The compiler required that array slices be specified using constant range
values.
Check to make sure that the array slice is specified using a constant range.
You can use a loop or generate statement to specify non-constant array slices if
necessary.
# 510
Constraint: Recursive Component instantiation.
Check to make sure that you have not inadvertently created recursion in
your design by specifying the wrong component or subprogram name.
Check to make sure that you have not inadvertently created recursion in
your design by specifying the wrong subprogram name.
# 512
Constraint: Literal value exceeds maximum positive value.
The compiler has encountered a numeric value that is larger than the
maximum allowed.
Check to make sure that you have correctly specified the numeric literal
value.
# 513
Constraint: Literal value exceeds minimum negative value.
Check to make sure that you have correctly specified the numeric literal
value.
The compiler has encountered a floating point literal value that includes a
fractional part. Floating point numbers are only supported as integer values in
synthesis, and any fractional part is truncated.
# 515
Constraint: Attribute 'event is not supported here.
Check to make sure that you have followed the documented synthesis
conventions for specifying registered logic.
# 516
Constraint: Attribute 'stable is not supported here.
Check to make sure that you have specified the correct attribute. Use the
'event attribute to describe edge-triggered flip-flop logic.
# 518
Constraint: File types are not supported.
The compiler has encountered an unsupported use of the type file. File
types are not supported in synthesis.
Check to ensure that you are not inadvertently compiling a test bench,
rather than a synthesizable design description.
# 519
Constraint: File Declaration is not supported.
The compiler has encountered an unsupported use of a file type. File types
are not supported in synthesis.
Check to ensure that you are not inadvertently compiling a test bench,
rather than a synthesizable design description.
Check to ensure that you are not inadvertently compiling a test bench,
rather than a synthesizable design description.
# 521
Constraint: Waveform truncated.
# 524
Constraint: Attribute 'attribute parameter is non-constant.
Check to make sure that the target of the attribute parameter is a constant
value.
If the signal was intended as an asynchronous input, add that signal name
to the sensitivity list. If the signal was not intended to an asynchronous input, check
to ensure that all flip-flops in the process referencing the indicated signal as an
input have been properly and completely specified.
Take special care to ensure that unwanted latches have not been
inadvertently specified.
# 526
Constraint: Flip-flop 'name' has missing preset or reset.
The compiler has determined that the behavior of the indicated registered
signal is ambiguous without a reset or preset being provided. This error occurs
when the missing preset or reset would result in a flip-flop with a gated clock, when
the other flip-flops inferred in the process do not have gated clocks.
Check to make sure that the indicated signal is either provided with preset
or reset logic, or has been described in such a way that its behavior is
unambiguous for all possible input conditions.
# 528
Constraint: An operator symbol (description) is not supported here.
Rewrite the design section so the operator is not required, or do not use
an alias in this context.
# 529
Constraint: Design contains no top level Output, Buffer, or Inout ports.
The compiler has encountered a design that has no top-level output ports.
Check to make sure you are not inadvertently compiling a test bench. Also
check to make sure you have correctly specified the mode of all entity ports.
Check to make sure that the hierarchical name has been correctly entered.
# 531
Constraint: Tristate buffer 'name' drives a logic gate, it must drive a port.
Rewrite the design section so that the tristate buffer drives an output of the
design. If you wish to make use of the internal tristate busses available in some
fpgas to build, for example, a small mux, consider instantiating a macrocell.
Note that if the compiler is unable to provide a 'name' related to the original
source description, no 'name' will be reported. In this case you should use the file
name and line number from the message to track down the error. The verbose
option may also help as it will report the inference of tristate buffers on a per-
process basis.
Check to make sure that the enum_encoding attribute string has been
correctly specified.
# 601
Each encoding in Enum_encoding must have the same number of characters.
Check to make sure that you have specified all enumeration values with
an equal number of characters.
# 602
Enum_encoding may only be applied to an enumerated type.
Check to make sure that the referenced enumerated type has been
properly declared.
# 604
Too few encodings specified in Enum_encoding.
# 606
Enum_encoding may not be applied to a subtype of an enumerated type.
Check to make sure that the critical attribute has been applied to a signal.
# 608
'name ' has a type which is not locally static, a design unit with 'foreign attribute
must have ports with locally static types.
Check to make sure that the indicated port name represents a locally static
type of object.
# 609
A design unit with 'foreign attribute may only have ports with mode IN or OUT.
Check to make sure the external module has been referenced using only
ports of mode in or out.
Compile options are specified from within the OEM environment in which
the Metamor compiler is found. Please refer to documentation of that tool set first.
The following mechanisms exists only to bypass the OEM environment, and should
not be considered by the end user for normal use. The availability of output formats
referenced here depends upon the OEM version of the compiler you are using.
Compile options may also be set from a file named 'metamor.arg' in the
current working directory. This allows the user to set the command line arguments
directly. Any settings made by the OEM environment will be overridden by settings
in the file 'metamor.arg'.
In metamor.arg, for example, you could set the library alias for the IEEE
library using (your file path may vary):
-l IEEE
C:\metamor\vhdl_lib\ieee.vhd
C:\metamor\vhdl_lib\synopsys.vhd
In addition, the path to the directory containing the Metamor library files
may be overridden by setting this path as the value of the environment variable
METAMOR_LIB.
The file metamor.arg may contain any of the following options delimited by
white-space or newline. Some options apply only to specific output formats. It helps
to set -x to 0 when debugging metamor.arg.
All formats:
Analyze
-a
-g <file_name>
Elaborate
-e <entity>
-e <entity(architecture)>
-e <configuration>
Specifies the root (top) of the design to be elaborated. Default is the last
configuration, or the last architecture of the last entity to be analyzed.
Device
-d name
Verbose
-v
Quiet
-q
Library Alias
-l <libname> <file_list>
-x #
Optimize level
-z #
Cupl only:
Clock Enable
-c
Reset
-r
Forces all registers with preset to use reset. Transforms registers with
asynchronous preset into registers with asynchronous reset. The design behavior
remains unchanged. Resisters with both preset and reset are not transformed.
-s #
Clock Enable
-c
Reset
-r
Force all registers with preset to use reset. Transforms registers with
asynchronous preset into registers with asynchronous reset. The design behavior
remains unchanged. Resisters with both preset and reset are not transformed.
-I
-b
-p #
-f xblox
-h
-u #
-p #
-f xblox
EDIF only
-h
-f Actel
-f Altera
-f Lattice
http://www.vhdl.org/
IEEE Documents
VHDL
Doug Perry, 390 pages, 2nd editiond ISBN0-07-049434-7
MacGraw-Hill, Inc.
A Guide to VHDL
Stanley Mazor, Patricia Langstraat, Kluwer academic publishers,
ISBN 0-7923-9255-8
VHDL '92;
The New Features of the VHDL Hardware Description Language
Berge, Fonkoua, Maginot and Rouillard, Kluwer
Academic Publishers ISBN:0-7923-9356-2,
Introduction to VHDL
D Hunter, T Johnson, Chapman & Hall, 246x189mm, 496 pages
A A’reverse_range(N) A - 12
A’right(N) A - 12
A'high(N) A - 12 T’base A - 12
access types A - 15 T’high A - 12
and 4 - 3 T’image(N) A - 12
architecture 3 - 3 T’left A - 12
ARCHITECTURE DECLARATION A - T’leftof(N) A - 12
11 T’low A - 12
arithmetic operators T’pos(N) A - 12
+, -, *, /, mod, rem, abs, ** 4 - 7 T’pred(N) A - 12
array index 13 - 12 T’right A - 12
arrays T’rightof(N) A - 12
converting 12 - 13 T’succ(N) A - 12
assertion statement A - 16 T’val(N) A - 12
asynchronous 5 - 2 T’value(N) A - 12
asynchronous load 5 - 12
asynchronous set and reset 5 - 11 B
asynchronous set or reset 5 - 10
atribute behavioral VHDL 3 - 9
Xilinx_BUFG 12 - 9 bi-directional 13 - 8
attribute binary numbers 8 - 8
array_to_numeric 12 - 13 bit 3 - 11
critical 12 - 4 bit_vector 3 - 11
enum_encoding 12 - 5 block 9 - 2
foreign 12 - 11 BLOCK STATEMENT A - 8
inhibit_buf 12 - 18 blocks 9 - 6
macrocell 12 - 15 Books on VHDL E - 1
part_name 12 - 5 boolean 3 - 11
pinnum 12 - 6 buffer 13 - 8
property 12 - 7 buffers
ungroup 12 - 16 input 12 - 9
attribute ’critical’ 2 - 16 output 12 - 9
attributes A - 12
A’ascending A - 12
A’high(N) A - 12 C
A’left(N) A - 12
A’length(N) A - 12 carry chain 13 - 5
A’low(N) A - 12 case 4 - 9
A’range(N) A - 12 case choice 8 - 6
VARIABLE ASSIGNMENT X
STATEMENT A - 6
variables 2 - 8, 3 - 4 XBLOX 11 - 1
declared in a process 10 - 6 xblox.macros 9 - 16
declared in subprograms 10 - 6 xnor 4 - 3
VHDL xor 4 - 3
design description organization 3 -
3
VHDL constructs A - 13 Z
VHDL types 3 - 11, 8 - 2
VHDL'87 2 - 4, 3 - 2 Z2-7
VHDL'93 2 - 4, 3 - 2 zero extended 8 - 9
VIUF E - 1
vlbit.pack1076 9 - 15