Vivado合成中的UltraRAM推断

Vivado合成中的UltraRAM推断

UltraRAM原语概述

UltraRAM是AMD的UltraScale+设备中提供的一种新的专用内存基元。这是一个大型存储器,设计用于级联非常大的RAM块。了解更多有关信息,请参阅《UltraScale体系结构内存资源用户指南》(UG573)。

UltraRAM原语的描述

UltraRAM原语是一个具有单个时钟的双端口存储器。配置单个基元如4K x 72。UltraRAM有两个端口,可以访问所有4K的RAM。这允许单端口、简单的双端口和真正的双端口行为。还有多条管道为基元的每个端口注册。UltraRAM有一个时钟、全局启用和输出寄存器复位、写入使能和字节写入使能支持控制信号具有一个时钟、一个全局启用、输出寄存器重置、写入启用和字节写入启用支持。

UltraRAM和块RAM之间的区别

UltraRAM和块RAM之间有一些值得注意的差异,如下所示:

•UltraRAM只有一个时钟,因此虽然支持真正的双端口操作,但两个端口都支持彼此同步。

•UltraRAM的纵横比不像块RAM那样可配置,它总是配置为4 K x 72。

•输出寄存器上的重置只能重置为0。

•写入模式(read_first、write_first和no_change)在此基元中不存在。

常规UltraRAM的行为类似于no_change;但是,如果您描述read_first或write_first在RTL中,Vivado合成创建了正确的逻辑。

•最后,RAM的INIT不存在,UltraRAM在0条件下通电。

使用UltraRAM推理

有三种方法可以获得UltraRAM基元,如下所示:

•直接实例化:为您提供最多的控制,但最难执行。

•XPM流:允许您指定所需的RAM类型以及行为,但提供无法访问RTL。

•推断RAM:介于两者之间,相对容易,并为用户提供更多控制关于如何创建RAM。

用于控制UltraRAM的属性

控制Vivado合成中的UltraRAM需要两个属性:RAM_STYLE和CASCADE_HEIGHT。

冲压样式

RAM_STYLE属性具有一个名为ultra的值。默认情况下,Vivado综合使用启发式以确定要推断的RAM类型,URAM、块RAM或LUTRAM。如果要强制将RAM转换为UltraRAM,可以使用RAM_STYLE属性告诉Vivado合成来推断URAM基元。

RAM_STYLE中提供了更多信息。

RAM_STYLE Verilog Example
(* ram_style = "ultra" *) reg [data_size-1:0] myram [2**addr_size-1:0];
RAM_STYLE VHDL Example
attribute ram_style : string;
attribute ram_style of myram : signal is "ultra";

CASCADE_HEIGHT

当将多个UltraRAM(URAM)级联在一起以创建更大的RAM时,Vivado合成将链的高度限制为8,以提供放置和布线工具的灵活性。要更改此限制,可以使用CASCADE_HEIGHT属性来更改默认行为。

注意:此选项仅适用于UltraScale体系结构块RAM和URAM。

CASCADE_HEIGHT Verilog Example
(* cascade_height = 16 *) reg [data_size-1:0] myram [2**addr_size-1:0];
CASCADE_HEIGHT VHDL Example
attribute cascade_height : integer;
attribute cascade_height of my_ram signal is 16;

除了只影响放置它们的特定RAM的属性外,还有也是影响设计中的所有RAM的全局设置。“合成设置”菜单具有-max_uram_cascade_height设置。默认值是-1,这意味着Vivado合成工具决定了最佳的行动方案,但这可以被其他值覆盖。如果全球环境和CASCADE_HEIGHT属性,该属性用于该特定RAM。

推理能力

Vivado Synthesis工具可以使用UltraRAM基元执行多种类型的内存。对于示例,请参阅编码指南。

•在单端口内存中,读取内存的同一端口也会向其写入支持块RAM的写入模式,但应该注意的是,UltraRAM本身其作用类似于NO_CHANGE存储器。如果在中描述了WRITE_FIRST或READ_FIRST行为RTL,创建的UltraRAM设置为简单双端口模式。

•在一个简单的双端口存储器中,一个端口从RAM读取,另一个端口向RAM写入。Vivado合成可以将这些存储器推断为UltraRAM。

提示:一个规定是两个端口必须具有相同的时钟。

•在真双端口模式下,两个端口都可以对内存进行读取和写入。在此模式下,仅则支持NO_ CHANGE模式。

小心!模拟真正的双端口RAM时也应小心。在以前的版本中块RAM,存在由仿真模型处理的地址冲突;与UltraRAM,它是不同的。在UltraRAM中,端口A总是出现在端口B之前。如果端口A具有写入和端口B是从该地址读取的,内存被写入和读取,但如果端口a具有读取和端口B已写入,在读取过程中会看到旧值。

小心!确保在true的同一时钟周期内永远不要读写同一地址双端口存储器,因为RTL和合成后模拟可能不同。

对于简单双端口存储器和真正的双端口存储器,时钟必须是两个端口都相同。除了不同风格的RAM,UltraRAM还有一些其他功能这是可以推断的。RAM有一个全局启用信号,该信号位于写入启用之前。它有标准写入启用和字节写入启用支持。数据输出也有一个类似的重置前一块RAM;但是,在这种情况下,无法设置SRVAL。仅重置的支持0。

RAM管道化

UltraRAM(URAM)支持将寄存器流水线传输到RAM中当使用多个UltraRAM来创建非常大的RAM时非常有用。为了完全流水线化RAM,您必须在RTL的RAM输出中添加额外的寄存器。计算管道数量寄存器,将RAM矩阵中的行和列的数量加在一起。

注意:该工具不会为您创建管道寄存器;它们必须在Vivado的RTL代码中合成以利用它们。

合成日志文件有一个关于URAM以及使用多少行和列的部分创建RAM矩阵。您可以使用此部分在RTL中添加流水线寄存器。要自己计算矩阵的行数和列数,请记住UltraRAM配置为4 K x 72。要计算行数,请使用RTL中的RAM地址空间,然后除以4 K。如果该数字高于CASCADE_HEIGHT指定的数字,删除多余的RAM,并在日志中的新列上启动它们。

创建管道示例1:8K x 72

在这个例子中,8K除以4K是2,所以有2行。如果设置了CASCADE_HEIGHT大于2,它是一个2x1矩阵。应该有三个流水线级添加到的输出RAM(2+1)。

创建管道示例2:8K x 80

在这个例子中,8K除以4K是2,所以有两行。数据空间无关紧要对于此计算,因此矩阵将是两行一列,从而产生三条流水线再次注册。

注意:整个矩阵是为了获得创建RAM所需的额外8位数据空间而复制的,但是这与流水线寄存器的计算无关。

创建管道示例3:16K x 70 CASCADE_HEIGHT设置为3

在这个例子中,16K除以4K是4;但是,由于CASCADE_HEIGHT为3,因此将是一个3 x 2矩阵。这将导致可以使用5个流水线寄存器。

你可能感兴趣的:(fpga开发)