Return to Support Page
 homesearchagentssupportask xilinxmap

Answers Database


FPGA Express/Compiler: Possible Incorrect Logic with downto Range Integer Comparison in VHDL


Record #1477

Product Family:  Software

Product Line:  Synopsys

Problem Title:
FPGA Express/Compiler: Possible Incorrect Logic with downto Range
Integer Comparison in VHDL



Problem Description:
Keywords: FPGA Express, FPGA Compiler, VHDL, compare, range, HDL-395

Urgency: Standard


A problem, which results in the creation of incorrect logic has been identified
in VHDL Compiler. The problem might occur when a constrained integer subtype
with nonnegative downto range is used in a comparison.

This problem has been traced to changes in VHDL Compiler as part of the turbo
enhancements for speeding up elaboration time. It can be reliably detected
during post-synthesis simulation.

Here are the two scenarios that can result in VHDL Compiler producing incorrect
logic. Note that the problem does not exist in Verilog.

In the first scenario, a 'for loop' index is compared to a constrained integer
with a nonnegative downto range, as shown here.

signal addr : integer range A downto B;
--	where A > 0 and B >= 0

This situation produces incorrect logic in the 1998.02* (1998.02, 1998.02-1,
and 1998.02-2) release. Note that the loop index is implicitly treated as an
unconstrained integer by VHDL Compiler.


Scenario 1: (Incorrect logic in 1998.02* release)

...
signal addr : integer range 7 downto 0;
...
...
process (addr, a, b, c)
begin
  for i in 3 downto 0 loop
    if (addr = i ) then 	-- INTEGER TO INTEGER COMPARISON
				-- AS THE INDEX "i" OF THE "for loop"
				-- IS ALWAYS TREATED AS AN INTEGER. THE
				-- OTHER INTEGER HAS A NONNEGATIVE
				-- DOWNTO RANGE. PLEASE NOTE THAT THE
				-- DOWNTO RANGE IN THE FOR LOOP
				-- STATEMENT IS NOT A PROBLEM.
...
...
end behavior;

Although it is not true for all cases, you might get the following HDL-395
warning message when incorrect logic is produced.

   Warning: The statement in routine %s line %d in file %s is never reached.
   (HDL-395)

If you are trying to generate flip-flops within the for loop, you might find
that some of the flip-flops are missing as a result of the incorrect logic.


The second scenario is when two signals, variables, or ports of type integer
are compared and only one of the integers has a nonnegative downto range.
For example, compare "addr1" and "addr2":

"addr1" is an integer of range A downto B where A > 0 and B >= 0.

"addr2" can be: an integer, an integer of range C downto D, or an integer of
range D to C where D < 0 and C is any number.

This will produce incorrect logic in the 1997.08* and 1998.02* releases.

Scenario 2: (Incorrect logic in 1997.08* and 1998.02* release)

...
signal addr1 : integer;
signal addr2 : integer range 7 downto 0;
...
...
process (addr1, addr2, a, b, c);
begin
    if (addr1 /= addr2) then	-- INTEGER TO INTEGER COMPARISON
				-- WHERE ONE OF THE INTEGERS HAS
				-- A NONNEGATIVE DOWNTO RANGE.

...
...
end behavior;


Solution 1:

The following two workarounds exist to resolve this problem. One workaround
sacrifices some of the speedup due to turbo enhancements to the elaboration
process. The other requires a minor code modification.

1) Use the following hidden variable at the dc_shell prompt to disable a part
   of the turbo speedups. Make sure that you set this variable before reading
   or analyzing/elaborating the VHDL.

   hdlin_accel_level = 4

2) The comparison of integers creates problems for a nonnegative downto range.
   Change the 7 downto 0 range of integers in previous scenarios to 0 to 7,
   as shown here.

   Scenario 1:
   signal addr : integer range 0 to 7;

   Scenario 2:
   signal addr2 : integer range 0 to 7;

This problem has been fixed in the 1998.08 release.  This corresponds to FPGA
Express 2.1.1 and Foundation F1.5.



End of Record #1477

For the latest news, design tips, and patch information on the Xilinx design environment, check out the Xilinx Expert Journals!

© 1998 Xilinx, Inc. All rights reserved
Trademarks and Patents