UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 13421

3.x FPGA Express - "ERROR:OldMap:448 - The CY4 symbol "symbol_name" (output signal=net_name) is missing its required carry-mode designation..."

Description

Keywords: CY4, FPGA, Express, carry, logic, mode, Spartan, XC4000, 4000, 4K, increment, decrement

Urgency: Standard

General Description:
I am using an incrementor and/or decrementor in a design in the following manner:

(This is the general incrementor:)

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

entity inc_16 is port (
a: in std_logic_vector (15 downto 0);
s: out std_logic_vector (15 downto 0));
end inc_16;
architecture made of inc_16 is
begin
s <= a + 1;
end made;

(This is the general decrementor:)

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

entity dec_16 is port (
a: in std_logic_vector (15 downto 0);
s: out std_logic_vector (15 downto 0));
end dec_16;
architecture made of dec_16 is
signal cout : std_logic_vector (1 downto 0);
signal stemp : std_logic_vector (14 downto 0);
begin

s <= a - 1;
end made;


FPGA Express does not properly connect the carry logic, which results in the following error:

"ERROR:OldMap:448 - The CY4 symbol "symbol_name" (output signal=net_name) is missing its required carry-mode designation. Please check the original schematic, vendor macro, or synthesis library to make sure a carry-mode designator symbol (CY4_xx) is attached to this CY4."

Solution

To work around this problem, create a modified incrementor and/or decrementor. (The work-arounds below are implemented as functions.) You must then declare the functions inside your VHDL design.

-- stepsize_inc is the increment value
-- operand_inc holds the count value

function incrementor
(operand_inc : in std_logic_vector; stepsize_inc : in integer)
return std_logic_vector is

variable temp_inc : std_logic_vector(operand_inc'high-1 downto 0);
variable cout_inc : std_logic_vector (1 downto 0);
variable result_inc : std_logic_vector(operand_inc'range);

begin

temp_inc := '0' & operand_inc(operand_inc'high-2 downto 0) + stepsize_inc;
cout_inc := (std_logic_vector'('0', temp_inc(operand_inc'high-1))) + operand_inc(operand_inc'high downto operand_inc'high-1);
result_inc := cout_inc & temp_inc(operand_inc'high-2 downto 0);
return result_inc;
end function;

-- stepsize is the increment value
-- operand holds the count value

function decrementor
(operand : in std_logic_vector; stepsize : in integer)
return std_logic_vector is

variable temp : std_logic_vector(operand'high-1 downto 0);
variable cout : std_logic_vector (1 downto 0);
variable result : std_logic_vector(operand'range);

begin

temp := '0' & operand(operand'high-2 downto 0) - stepsize;
cout := operand(operand'high downto operand'high-1) - (std_logic_vector'('0', temp(operand'high-1)));
result := cout & temp(operand'high-2 downto 0);
return result;
end function;
AR# 13421
Date Created 12/20/2001
Last Updated 08/11/2003
Status Archive
Type General Article