我对Xilinx ISE块ram推断的稳健性有疑问。
我的机器上没有安装xilinx ise(今天),但我通常使用专用编码完美地推断出块塞,基本上依赖于:
type ram_type is array(2**ADDR_WIDTH-1 downto 0) of std_logic_vector(DATA_WIDTH-1 downto 0);
我的问题是:你能告诉我ISE是否会用
推断出一个正确的阻塞ramsigned(DATA_WIDTH-1 downto 0)` instead of `std_logic_vector(DATA_WIDTH-1 downto 0)
甚至更多(在一个包中):
subtype signed8 is signed(7 downto 0)
然后
type ram_type is array(2**ADDR_WIDTH-1 downto 0) of signed8;
我知道合成器有时很敏感...
答案 0 :(得分:5)
我自己没有测试过,但是“signed”类型是从std_logic类型派生的,所以我不明白为什么这不起作用。
假设您正在使用XST进行综合,XST用户指南是一个很好的开始,可以看到Xilinx正式声明XST将识别块公羊推理的内容。 XST User Guide for 12.4 (pdf)
答案 1 :(得分:5)
这是一般性评论,并非针对您的问题。试图假设第二次猜测合成工具效率不高。结果可能因工具版本以及设计和实现的上下文(不同的开关,优化目标,目标体系结构等)而异.ISE / XST是免费的...下载并尝试您的代码。然后你可以更有意义地问这个问题......“为什么XST版本X.Y在这些条件下不能推断Block RAM?”然后我们还可以讨论XST是否具有正确和预期的行为。
答案 2 :(得分:3)
除了Josh建议的链接(详细介绍XST的RAM实现)之外,这是Xilinx网站上的另一个文档,它解释了不同的RAM实现及其权衡(第76页):
http://www.xilinx.com/support/documentation/sw_manuals/xilinx12_4/sim.pdf
作为旁注,我使用了“阵列”方法,并且适用于小型Block RAM。但是,我不得不说我尝试使用它来生成一个比我的Spartan-6中的1块BlockRAM大得多的内存模块,它无法推断它(XST试图将其实现为分布式RAM)。我通过直接实例化BlockRAM宏Xilinx的提供并通过创建适当的内存解码模块来选择/写入/读取内存模块中适当的单独BlockRAM来解决问题。