同步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文件名:
代码语言:javascript复制VPD_NAME= vpdname ${OUTPUT}.vpd
在编译时打开-debug_all选项,同时打开VPD_NAME开关,存储编译生成的.vpd波形文件,其实此时生成的.vpd文件仅为一个空文件。
在运行仿真即运行生成的二进制可执行文件时,打开VPD_NAME选项,此时生成的.vpd文件中包含波形信息。
打开vpd文件有两种方式:
第一种:先打开dve(dve &),之后在dve中打开.vpd文件
第二种:直接打开,dve -vpd ${OUTPUT}.vpd &
覆盖率检测
代码质量的标准,在编译时打开行、状态、条件、翻转、分支统计选项,并设置保存覆盖率统计文件的文件夹,还可以设置包含覆盖覆盖率信息的文件名:
代码语言:javascript复制CM=-cmline fsm cond tgl tgl
CM_DIR=-cm_dir{OUTPUT}.vdb
CM_NAME=-cm_nameBaseFPGA
上述语句分别设置覆盖率文件的统计信息、文件目录、文件名
在编译和运行时打开上述选项,之后通过DVE查看覆盖率信息:
代码语言:javascript复制dve -covdir{OUTPUT}.vdb &
Verdi波形加载
verdi波形加载需要使用.fsdb文件,生成.fsdb文件有两种方式.
一种是在.v文件中嵌入函数:
代码语言:javascript复制$fsdbDumpfile(“xxx.fsdb”); //指定生成的fsdb文件名字
$fsdbDumpvars(0,top); //指定Dump波形层次,需要注意top没有.v后缀
另一种方式是调用-ucil/tcl接口,在脚本中进行设置:
在编译时打开Verdi偏移选项,在仿真时调用ucli接口对波形进行Dump。
需要注意的是在仿真时需要设置 fsdb autoflush即自动将波形转存到.fsdb文件中。