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# 22741

8.1i XST - XST generates incorrect logic for code that infers ROM in other synthesis tools

Description

XST generates incorrect logic for code that infers ROM in other synthesis tools.

Solution

This problem occurs when a "when others" statement is used in an incomplete case statement.  

 

The following code causes the issue: 

 

process(<CLK>,<RST>)begin 

if <RST> = '0' then 

<output> <= "000000"; 

elsif <CLK>'event and <clk> = '1' then 

case <signal_name> is 

when "01111111111111111111111111111111" => <output> <= "000000"; 

when "10111111111111111111111111111111" => <output> <= "000001"; 

when "11011111111111111111111111111111" => <output> <= "000010"; 

when "11101111111111111111111111111111" => <output> <= "000011"; 

when "11110111111111111111111111111111" => <output> <= "000100"; 

when "11111011111111111111111111111111" => <output> <= "000101"; 

when "11111101111111111111111111111111" => <output> <= "000110"; 

when "11111110111111111111111111111111" => <output> <= "000111"; 

when "11111111011111111111111111111111" => <output> <= "001000"; 

when "11111111101111111111111111111111" => <output> <= "001001"; 

when "11111111110111111111111111111111" => <output> <= "001010"; 

when "11111111111011111111111111111111" => <output> <= "001011"; 

when "11111111111101111111111111111111" => <output> <= "001100"; 

when "11111111111110111111111111111111" => <output> <= "001101"; 

when "11111111111111011111111111111111" => <output> <= "001110"; 

when "11111111111111101111111111111111" => <output> <= "001111"; 

when "11111111111111110111111111111111" => <output> <= "010000"; 

when "11111111111111111011111111111111" => <output> <= "010001"; 

when "11111111111111111101111111111111" => <output> <= "010010"; 

when "11111111111111111110111111111111" => <output> <= "010011"; 

when "11111111111111111111011111111111" => <output> <= "010100"; 

when "11111111111111111111101111111111" => <output> <= "010101"; 

when "11111111111111111111110111111111" => <output> <= "010110"; 

when "11111111111111111111111011111111" => <output> <= "010111"; 

when "11111111111111111111111101111111" => <output> <= "011000"; 

when "11111111111111111111111110111111" => <output> <= "011001"; 

when "11111111111111111111111111011111" => <output> <= "011010"; 

when "11111111111111111111111111101111" => <output> <= "011011"; 

when "11111111111111111111111111110111" => <output> <= "011100"; 

when "11111111111111111111111111111011" => <output> <= "011101"; 

when "11111111111111111111111111111101" => <output> <= "011110"; 

when "11111111111111111111111111111110" => <output> <= "011111"; 

when others => <output> <= "100000"; 

end case; 

end if; 

 

The problem occurs because the ROM address is on 32 bits. 

 

During multiplexer and ROM inference, some of the code attempts to compute the maximum value of the case selector, which returns meaningless data in this configuration. 

 

You can work around this issue by setting the ROM_EXTRACT option to NO. Please refer to the XST User Guide for directions on setting this option: 

http://toolbox.xilinx.com/docsan/xilinx7/books/docs/xst/xst.pdf
 

The data corruption problem is fixed in ISE 8.2i.  

 

The issue of XST being able to infer a ROM in this condition is under investigation.

AR# 22741
Date Created 09/04/2007
Last Updated 05/19/2014
Status Archive
Type General Article