手撕distributed ram类型同步FIFO
同步fifo设计的核心在于full与empty信号的控制,今天看网上发布的部分verilog代码,虽然可以完成读写操作,但是存在部分问题,就是最后一个数据的读取问题,该问题的导致是因为full与empty信号的控制失误。
Target
设计一个小型distributed FIFO(数据位宽8,地址位宽4,深度16),类型为FWFT(即读数据与读取信号同周期输出),该FIFO使用FPGA内部的LUT资源,不使用FPGA内部的Block memory资源(因为比较小,所以不使用容量较大的BRAM)。
此外,为了练习VCS、VERDI软件操作,熟悉波形dump、Coverage check,对代码进行检测。
对代码进行波形加载、对覆盖率进行检测,使用Verdi进行debug
DVE记录波形
在编译时打开vcdpluson选项($vcdpluson()),在编译脚本中设置生成的vpd文件名。
vpd是Synopsys公司VCS DVE支持的波形文件,可以使用$vcdpluson()产生。
在指令中设置生成的vpd文件名:
VPD_NAME=+vpdname+${OUTPUT}.vpd
在编译时打开-debug_all选项,同时打开VPD_NAME开关,存储编译生成的.vpd波形文件,其实此时生成的.vpd文件仅为一个空文件。
在运行仿真即运行生成的二进制可执行文件时,打开VPD_NAME选项,此时生成的.vpd文件中包含波形信息。
打开vpd文件有两种方式:
第一种:先打开dve(dve &),之后在dve中打开.vpd文件
第二种:直接打开,dve -vpd ${OUTPUT}.vpd &
覆盖率检测
代码质量的标准,在编译时打开行、状态、条件、翻转、分支统计选项,并设置保存覆盖率统计文件的文件夹,还可以设置包含覆盖覆盖率信息的文件名:
CM=-cmline+fsm+cond+tgl+tgl
CM_DIR=-cm_dir{OUTPUT}.vdb
CM_NAME=-cm_nameBaseFPGA
上述语句分别设置覆盖率文件的统计信息、文件目录、文件名
在编译和运行时打开上述选项,之后通过DVE查看覆盖率信息:
dve -covdir{OUTPUT}.vdb &
Verdi波形加载
verdi波形加载需要使用.fsdb文件,生成.fsdb文件有两种方式.
一种是在.v文件中嵌入函数:
$fsdbDumpfile(“xxx.fsdb”); //指定生成的fsdb文件名字
$fsdbDumpvars(0,top); //指定Dump波形层次,需要注意top没有.v后缀
另一种方式是调用-ucil/tcl接口,在脚本中进行设置:
在编译时打开Verdi偏移选项,在仿真时调用ucli接口对波形进行Dump。
需要注意的是在仿真时需要设置+fsdb+autoflush即自动将波形转存到.fsdb文件中。
- PostgreSQL并行查询是个什么“鬼"?
- 想弄一台简单的区块链服务器?来这里看看!!
- NNabla:索尼开源的一款神经网络框架
- 黑客与C语言
- 浅谈分布式事务
- 漫谈千亿级数据优化实践:一次数据优化实录
- Facebook开源游戏平台ELF:一个用于实时战略游戏研究的轻量级平台
- 用不到50行的Python代码构建最小的区块链
- 学习笔记CB002:词干提取、词性标注、中文切词、文档分类
- 深入浅出 Retrofit,这么牛逼的框架你们还不来看看?
- 用Python从零开始构建反向传播算法
- 备战CDA数据分析竞赛!Kaggle赛题大揭秘
- 如何用Python将时间序列转换为监督学习问题
- Spring MVC的配置和使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法