1、前言

Vivado在生成memory的时候,有个Operating Mode选项。

本篇将专门分析这些工作模式的含义。

2、具体含义

官方解释如下:

“WRITE_FIRST” 模式,写操作时,输出端口会将当前写的数据输出。(ASIC中又称“write through”,或AWT,Async)
“READ_FIRST” 模式,写操作时,输出端口会将当前写地址的原数据输出。
“NO_CHANGE”模式,写操作时,输出端口会保持原值不变。只有在读操作的过程中输出端口才会变化。

不好理解没关系,下面列出图示和时序波形:

  • “WRITE_FIRST” 模式(ASIC中又称“write through”)
  • 写入的数据一边写到RAM内核,一边输出到端口。

  • “READ_FIRST” 模式
  • 写入的数据写到RAM内核,写地址指向的RAM数据输出到端口。

  • “READ_FIRST” 模式
  • 写入的数据写到RAM内核。输出端口的数据(实际上有个寄存器)保持不变。

下面列出对应的代码,有人习惯从RTL代码上理解。此代码是可以被Vivado工具直接识别的。

  • “WRITE_FIRST”代码,可综合
  1. //write port
  2. always @(posedge clk) begin
  3. if(en && we)
  4. RAM[addr] <= di;
  5. end
  6. //read port
  7. always @(posedge clk) begin
  8. if(en)
  9. if(we)
  10. dout <= di;
  11. else
  12. dout <= RAM[addr];
  13. end
  • “READ_FIRST”代码,可综合
  1. //write port
  2. always @(posedge clk) begin
  3. if(en && we)
  4. RAM[addr] <= di;
  5. end
  6. //read port
  7. always @(posedge clk) begin
  8. if(en)
  9. dout <= RAM[addr];
  10. end
  • “NO_CHANGE”代码,可综合
  1. //write port
  2. always @(posedge clk) begin
  3. if(en && we)
  4. RAM[addr] <= di;
  5. end
  6. //read port
  7. always @(posedge clk) begin
  8. if(en && !we)
  9. dout <= RAM[addr];
  10. end

其实,RTL还是更好理解一些的。

注意,http://www.elecfans.com/d/887964.html这篇文章的RTL部分“READ_FIRST” 代码和“NO_CHANGE”代码写的有问题。

3、应用和背景

在IC设计领域,FPGA主要用来做AISC的原型验证,即在FPGA上要实现一个与ASIC完全一致的设计,以此加速仿真,方便快速找到AISC设计的问题。

分享两个故事:

一个故事发生在前东家,有次生成FPGA的ram时,错把Operation Mode选成了“READ_FIRST” ,而恰好暴露出来一个之前没验证到的bug。为什么会这样呢?

Bug是这样的,这位designer把当前cycle写入ram的值,下一cycle直接在读接口上采样并使用了,这实际是利用了“WRITE_FIRST”(ASIC中叫“write through”)的特性。

在设计中,这样的操作是不允许的,虽然这样可以省掉一个read cycle,但这种设计的通用性很差,一旦更换ram,就会出问题。当时的项目就是迁移到新工艺节点,ram由原来的“write through”(对应FPGA的“WRITE_FIRST”)更新到了“no write through”(对应FPGA的“NO_CHANGE”),这样此designer的设计出问题了。

为什么ASIC仿真没有发现这个问题呢?

IC公司在ASIC仿真时为了加速,一般都是用自己写的ram sim model来做仿真模型的。工艺节点升级了,ram行为也由write through变成了no write through模式,而ram sim model却没有更新。因此,ASIC仿真并没有暴露出来这个问题。

幸亏这个bug在RTL freeze前暴露出来了,若是没有检查出来而流片了,那后果不堪设想。

另一个故事发生在现公司,遇到的问题也是类似原因。

Bug是这样的,一位designer设计时没有考虑好读写端口的配合,导致某种场景下会出现读的数据没来及取走,就已经向这个地址覆盖了新的数据的情况,且这种情况只会冲刷一个cycle

若ram是write through模式,则会丢失一个数据;若是no write through模式,则恰好利用了读端口的保持特性规避了丢数据的问题。

本质上讲,这样的设计也是错误的,肯定要改设计,只不过项目已经进展到RTL freeze阶段,只能靠这种方式来规避了。

4、总结

上述提到的两处bug,都是因为设计者(包括写ram model的验证者)不了解ram的特性导致的。

  • 建议要用脚本语言来生成FPGA、ASIC的ram,用GUI生成则很容易出错,且不好检查。
  • 建议要用FPGA、ASIC的ram工具生成的ram model来做仿真,不要手写ram model。
  • 设计者要用标准的读写时序进行设计,必须避免“利用端口特性的不规则设计”,

FPGA下RAM的工作模式相关推荐

  1. vsftpd 的工作模式

    首先,讲下FTP的工作模式,FTP般有2个通道分别为: 控制通道:管理用户登录等,常用端口号:TCP的21:客户端主动与服务器建立连接 数据通道:用户传输数据时所要用到的,如,浏览目录,上传.下载等: ...

  2. 查看无线网卡工作模式

    查看无线网卡工作模式 查看无线网卡工作模式,一般情况下,无线网卡有四种工作模式,分别是Managed模式.Master模式.Ad hoc模式和Monitor模式.大学霸IT达人查看无线网卡工作模式.默 ...

  3. linux查看无线网卡频率,查看无线网卡工作模式

    一般情况下,无线网卡有四种工作模式,分别是Managed模式.Master模式.Ad hoc模式和Monitor模式.默认情况下,无线网卡工作模式为Managed,可以用来连接到无线网络.当用户实施无 ...

  4. 防火墙区域及工作模式

    域(zone)是防火墙上的重要概念,防火墙通常放置在网络的边界,路由器通过接口来连接不同网段,防火墙则通过域来表示不同的网络. 安全策略:通过将接口加入域并且在安全区域之间启动安全检查,从而对流经不同 ...

  5. (133)FPGA面试题-Xilinx FPGA Block RAM的三种写模式是什么?

    1.1 FPGA面试题-Xilinx FPGA Block RAM的三种写模式是什么? 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Xilinx FP ...

  6. STM32 烧录程序后上电不工作,但调试模式下可正常工作的解决办法

    学习STM32的时候遇到的小问题: 用CubeMX生成初始代码,程序内容只包括呼吸灯工作和一个中断调用printf重定向函数向串口发送内容: 在STM32F103C8T6最小系统板烧录程序后上电不工作 ...

  7. 网络穿透与音视频技术(2)——NAT的概念及工作模式(下)

    (接上文<网络穿透与音视频技术(1)--NAT的概念及工作模式(上)>) 3.四种NAT映射实现方式 上文中我们已经提到三种NAT映射模式,它们是静态映射(Static NAT).动态映射 ...

  8. BUCK在轻载下的工作模式

    在上一篇文章电源系列之BUCK电感工作模式中,我们详细介绍了BUCK电源电感的两种工作模式CCM和DCM,及其各模式下各点波形的不同之处.本篇将介绍在负载电流继续减小时,电源工作模式有哪些,以及各有什 ...

  9. 光伏储能并网发电模型,根据储能电池SOC的工作区间,光伏有MPPT、恒功率输出两种控制方式,在电池健康工况下光伏处于MPPT模式

    光伏储能并网发电模型,根据储能电池SOC的工作区间,光伏有MPPT.恒功率输出两种控制方式,在电池健康工况下光伏处于MPPT模式,在电池处于极限工况下,光伏处于恒功率模式,通过boost连接到公共点, ...

  10. linux文件编辑器的三种模式,Linux中文本编辑器三种工作模式切换及vi编辑器三种工作模式下命令详解...

    文本编辑器的作用 创建或修改文本文件 维护Linux系统中的各种配置文件 Linux中最常用的文本编辑器 Linux中最常用的文本编辑器 vi:类UNIX操作系统的默认文本编辑器 vim:vim时vi ...

最新文章

  1. Myeclipse中项目没有代码错误提示,jsp页面无编译迹象?如何解决
  2. easymailobjects php,用easymailobject组件处理exchange邮件源代码(6)_asp实例
  3. shell,自动挂载磁盘
  4. clang编译c语言开o优化,针对gcc或clang的LTO可以跨C和C方法进行优化
  5. angelica类似_亲爱的当归(Angelica)是第一个让我哭泣的VR体验
  6. 如何导入数据模板到MVC
  7. java 数据结构详解,数组,集合,HashMap
  8. android 库编译报错,Android Studio编译项目报错
  9. SharePoint 创建 Lookup 类型的Site Column解决跨站问题
  10. 【深入理解JVM】引用,句柄,指针分别是什么?
  11. C++函数指针和仿函数【转】
  12. php如何无水印解析快手,快手短视频无水印解析过程及代码
  13. Win32 Application和Win32 Console Application
  14. 肿瘤 材料 计算机模拟,PeerJ: 计算机模拟揭示癌症多样性
  15. ArcGIS数据生产与精细化制图之中国年降水量分布图的制作(转载)
  16. 第7-5课:格式化文件读写与 PCX 图像文件
  17. ping无盘服务器值高,服务器PING值过高的原因
  18. crash工具分析sysdump使用
  19. 线性代数学习笔记(二十九)——方程组解的结构(一)
  20. 分享怎么才能防止域名被劫持

热门文章

  1. 其它——Siege压力测试工具使用
  2. Java数据通讯中使用Googgle Protobuf 序列化与反序列化
  3. 数据收发过程中的网络设备状态
  4. [转载]论原著中白飞飞和朱七七两大奇女子
  5. 读取excel数据批量填充world
  6. ubuntu18.04安装evo测评工具踩坑
  7. 原生js模拟微信聊天记录
  8. 服务器被入侵了怎么办?
  9. VBA 工作簿和工作表的简单操作
  10. C# 使用NPOI.XSSF对Excel进行操作