本系列文章为平时对FPGA手册的学习总结,希望能帮助大家理解手册,学会IP的使用。手册为网络收集,下载链接:UG902_安路科技PH1A系列FPGA ERAM用户手册

写在前面:不吐不快,安路的这份手册是我见过最烂的器件手册,难想象这是经过评审的正式文档,到处都是信号/参数说明缺失,图/表对应不上,描述有歧义等。官网骗我注册账号,结果还是不给下载手册,明明手册网上已经满天飞了还恶心人。

1. ERAM SLICE 架构

安路的ERAM其实等价于紫光的DRM,Xilinx的BRAM,Altera的M20K等资源,实际上都是嵌入式块存储器。容量比较奇怪,为固定的20K,不像紫光/Xilinx区分18K/36K。应该是对标Altera的设计。

该系列的ERAM,一个SLICE包含了2个ERAM,总容量为40K,但是可以独立使用,也可以通过硬走线级联使用,地址级联是指通过硬件内部的专用互连(硬走线,图中的Routing)将多个BRAM块组合起来,以形成一个更大容量的存储器,而无需依赖外部逻辑(软逻辑,如LUT或寄存器)进行拼接。如下图1-1所示,图中的Addr_tt,Addr_fb分别是指给上面的SLICE使用的级联地址,和从下面SLICE传入的级联地址。

图1-2说明了级联地址的细节,图中addr_x_fb指的是从其他ERAM过来的级联地址,pib只是从用户侧过来的级联地址,通过mux可以控制ERAM是级联模式还是独立模式。假如是级联模式,那么所有ERAM都有相同的地址输入addr_x_fb[13:4],一共10bit;另外有4bit可以不同,用于byteen扩展,即字节使能功能。我的理解是,这4bit和用户侧的连接与其他bit不同,这4bit在外部可以复用为字节使能控制端口。

byteen扩展第一次出现,你文档里面不解释吗?

级联RAM,为什么会出现地址不相同的情况?啊?例如外部地址11bit,2个ERAM不是共用10bit地址线,1bit作为片选吗?什么情况下另外4bit可以不同?什么都没说明白!

图1-2 ERAM A/B 口地址级联示意

你就说手册上的图和文字描述写成这样是让人看懂的吗?当然用户其实不会感知到这些内部细节,安路没有提供和紫光一样的底层原语让用户自己实现级联拼接,直接是一个封装好的LOGIC原语帮你做了拼接。

1.1 ERAM20K 功能

ERAM20K 每块容量 20Kbits,可实现:

  • 单口 RAM/ROM (SP)

  • 双口 RAM (TDP)

  • 简单双口 RAM(SDP)

SP同一时刻只能读或者写;SDP分为AB两个口,A口只能写,B口只能读,可以同时操作;TDP也分为AB两个口,二者完全独立等价,都可以进行读操作或者写操作,但同端口同一时间只能写或者读。读写冲突的场景后续有说明。

ERAM20K 模块支持的功能特色有:

  • A/B 口时钟独立 (SP模式只有一个时钟,SDP和TDP分AB口,两个口的时钟可以是异步。)

  • 可单独配置 A/B 口数据位宽,真双口从 x1 到 x20,支持 x40 简单双口(一写一读),具体对应的位宽组合见后续的表格。

  • 写操作时带有字节使能(Byte Enable)控制

  • 输出寄存器可选择,指内部寄存器,不消耗额外FF资源。

  • 支持 RAM/ROM 模式下数据初始化(通过初始化文件在配置过程中对 ERAM20K 数据初始化),仅支持一次上电时刻初始化一次。

  • 支持多种写操作模式。只写(Write Disable Read),先读后写(Read Before Write),写穿通(Write Before Read)三种模式。 并非SP、SDP、TDP都支持上述模式,每种支持范围不同,具体见后续描述。

来,我们看看这个表格是人写出来的吗?

  1. 为什么单口和真双口支持的位宽都是x1 x5等格式,但是简单双口是1~40?实际上ERAM底层只支持x1 x5等位宽,只是用户可以选择某些bit位不使用而已,那你的表述最少要统一吧?

  2. 第二行 配置(深度x位宽)处,明明下面写了是真双口的支持情况,右边又要写一个512x40的位宽组合再标注说是简单双口的,难道单口不支持512x40吗?单口不支持ECC吗? 瞎写,生怕别人看明白。SP是支持ECC的哈。

  3. 请问字节使能处,“有且必须”是什么意思?谁看得懂这个人想表达什么意思?用ERAM必须使用字节使能吗?其实是想说只支持下面的两种位宽深度组合下使用字节使能功能,并且10bit作为1个字节。

  4. 单口模式,右边x40为什么标注(AB口组合)?难道简单双口不是AB口组合?为什么不统一说明清楚40bit是AB口组合实现呢?(后面的章节也是同样的问题)

然后我再重点说一下文档中的注的两点说明:

  1. ERAM的输入地址、数据需要和输入时钟采用同步设计,否则可能造成ERAM内容异常翻转

假设SDP RAM,有add_w,clk_w,data_in等信号,add_w,data_in一定要是clk_w时钟域上的,不然工具不会分析这几条路径等时序分析,很可能无法满足建立保持时间,最后导致ERAM内部数据被修改。当然,如果非要这么写工具会报告CRITICAL_WARNING,也是能综合布线出来的。

有人可能有疑问,如果我虽然是异步时钟,但是满足multi-cycle条件,在写入读取的时候已经保持稳定了是否还有问题。答案是仍然可能有问题,除非在使用的时候将数据和地址等输入寄存器使能关闭了,直到数据稳定再打开。否则即使是读操作,也会导致数据被更改,具体原因等下次分析。

  1. 输出复位/置位功能需要配合oce信号才能生效

这里指的复位和置位都不是指RAM内部数据,而是ERAM内部的内部输出寄存器,复位/置位之后会重新被RAM的输出数据刷新。在操作这个内部输出寄存器的时候,需要保证oce信号,即寄存器时钟使能信号有效。

1.1 ERAM20K 接口

手册里面展示的是20bit*1K的接口图,你倒是在哪里说明一下啊?直接在表格里面写死了各个接口的位宽,那不是和前面的描述都冲突了吗?

这里和其他厂商有区别的点是ECC注错的方式,ecc_sbiterrinj 和 ecc_dbiterrinj 信号均需要拉高才表示2bit注错。那如果ecc_dbiterrinj 拉高算单bit注错吗?两个端口有优先级吗?实际上两个注错单口是等价的,使用任意端口都可以单bit注错。

2. ERAM20K 工作模式

2.1 位宽组合

下表展示的是ERAM20K支持的组合位宽

SDP模式支持的位宽组合包含所有TDP的位宽组合,并且增加了表2-1中展示的40bit位宽,全部按照TDP的格式画个完整的表会死吗?SP模式40bit模式下,AB两个端口都用做了读写,相当于每个口读写20bit做拼接,SDP模式类似。

2.2 ECC功能

硬ECC功能仅支持SDP模式,SP模式不支持??这不扯淡吗?两个都支持!

2.3 字节使能

字节使能功能,这里就是说明了一下addr_a[3:0]内部有复用电路,当开启字节使能时,外部的地址线使用的是addr_a[13:4],addr_a[3:0]变成了byteena[3:0]。你看看这个dia_extra信号在哪里有解释吗?哪个示意图有说明吗?真脑残,还注:用户无需考虑数据为组合方式,意思是用户直接低10bit作为1字节,高10bit为1字节是吗?直接这样描述都比你放个表格清楚。

2.4 不同写模式

PH1A 系列的 ERAM20K 支持多种写操作模式,在单口 RAM 或真双口 RAM 模式下,允许用户在写入数据的同时,读出同一地址的数据到输出端口。其中只写模式、写穿通模式和先读后写模式只针对 dia/doa或者 dib/dob 独立使用。

这里注意一下,写模式各个厂家虽然有各自的名称,等价到Xilinx上就是NO_CHANGE,WRITE_FIRST和READ_FIRST,单口的时序图都是一样的,但是Xilinx是各种模式都支持写模式配置,但是国产器件支持范围不同。再者,Xilinx的写模式不仅表现在单口上,还表现在AB口读写冲突的场景下,例如SDP在同步时钟下,设置为READ_FIRST能够在A写B读时B口返回旧数据。显然这里安路是不支持的。

上表展示了不同的模式组合,明明写了TDP(DP)是支持Read Before Write的写模式的,结果又在这里写禁用该模式。

最终确认,SP支持三种写模式,TDP支持Write Disable Read和 Write Before Read,SDP仅支持Write Disable Read。

你这写文档的真是菜狗!

这里的端口配置是不是又和最前面矛盾了?都说是1~20/40嘛。

2.5读写冲突说明

这里总而言之就是不能同时写一个地址,其他场景能保证写入成功。Xilinx的说明如下:

Asynchronous

Clocking Asynchronous clocking is the more general case, where the active edges of both clocks do not occur simultaneously:

• There are no timing restrictions when both ports perform a read operation.

• When one port performs a write operation, the other port must not read or write access the same memory location. Therefore, the READ_FIRST mode should be avoided in true asynchronous applications, because there is no guarantee that the old data will be read (in both TDP and SDP modes). The WRITE_FIRST mode is the recommended mode when asynchronous clocks might cause simultaneous read/write operations on the same port address. The simulation model produces an error if this condition is violated. If this restriction is ignored, a read or write operation produces unpredictable results. There is, however, no risk of physical damage to the device. If a read and write operation is performed, then the write stores valid data at the write location.

Synchronous Clocking

Synchronous clocking is the special case, where the active edges of both port clocks occur simultaneously:

• Synchronous clocking is defined as both clock input pins being driven by the same clock.

• There are no timing restrictions when both ports perform a read operation.

• When one port performs a write operation, the other port must not write into the same location, unless both ports write identical data.

• When one port performs a write operation, the write operation succeeds; the other port can reliably read data from the same location if the write port is in READ_FIRST mode. DATA_OUT on both ports then reflects the previously stored data. If the write port is in either WRITE_FIRST or in NO_CHANGE mode, then the DATA_OUT on the read port would become invalid (unreliable). The mode setting of the read-port does not affect this operation.

简而言之就是,异步模式只能保证写入成功,读出数据不确定。同步模式只有在READ_FIRST模式下能够保证读出数据可靠,为旧数据,其他模式只能保证写入成功。

紫光器件没有读写冲突的预期说明,不支持读写冲突!!!但是实际测试是可以写入成功的。

后话:这份手册说明是我见过最差劲的,这么丢人的东西怎么好意思发出来。