在网表VHDL中初始化内存

时间:2013-05-17 11:25:29

标签: vhdl synthesis

使用Synopsis DC工具合成处理器代码

现在我想使用.mem文件

初始化此设计中2个组件中包含的2个rams

如何使用我拥有的网表文件 - 合成的输出 - 来实现这一点 - 因为我想测试是否通过在处理器上再次测试相同的代码来完成合成

在没有合成之前,只需将.mem文件加载到那些rams然后测试它就更容易了

任何帮助

1 个答案:

答案 0 :(得分:2)

不要费心加载.mem文件;只需在VHDL中直接初始化存储器。

最简单的方法 - 如果它们是ROM--是将它们声明为常量数组。如果此声明位于单独的包中,则可以使用编译器或汇编程序创建的hex文件轻松编写其创建脚本。

这是一个让你入门的例子

package Memories is

type Address is natural range 0 to 2**8 - 1;
type Byte is std_logic_vector(7 downto 0);

type Memory is array(Address) of Byte;

-- Positional association is convenient if you are filling the whole memory
-- constant ROM1 : Memory := (X"00", X"11", X"22", and so on);
-- I'm not going to type out the lot!

-- Named association is better for a simple test program
constant ROM2 : memory := (
   0     => X"C3",
   1     => X"38",
   2     => X"00",
  16#38# => X"C3",
  16#39# => X"00",
  16#3A# => X"00",
  others => X"FF"
);

end Memories;

如果它们是RAM,您可以从同一个常量数组中调用它们。

use Memories.all;
constant ROM : Memory := ROM2;
signal   RAM : Memory := ROM2;

这些构造甚至可以通过我在过去五年中使用的最原始的综合工具来正确处理,所以如果DC不能这样做,我会非常惊讶。

初始数据必须由综合工具保存,并以网络列表中的某种形式显示。如果您能理解该表单,则可以根据需要修改数据,但更新源代码并重新合成可能更容易。