异步FIFO项目 UVM验证

news2024/11/26 22:42:50

文章目录

    • 前言
    • 一、异步FIFO仿真过程
      • 1、异步FIFO设计
      • 2、UVM验证
    • 二、脚本文件编写
    • 三、编译错误

前言

2022.11.15 记录自己开始使用UVM仿真异步FIFO项目


一、异步FIFO仿真过程

1、异步FIFO设计

首先对编写的异步FIFO设计代码进行验证,写了一个test.v文件
(1)设置读写时钟相同

  • 先连续写16个数,再连续把16个数读出来

在这里插入图片描述
把写指针同步到读时钟域需要两个周期,当读写指针不相同时,下一个周期拉低
产生了“虚空”现象
在这里插入图片描述
因为读完之后,读指针又回到了0的位置,而0位置处的值就是24。
当又开始写时,0位置处值为c5
在这里插入图片描述

  • 先写8个数据进去,开始读,然后边写边读

在这里插入图片描述
(2)写快读慢
同样数据是正确的

2、UVM验证

仿真之前先输入log -r /*,可以确保TB层次下所有信号都可以保存到数据库以供查看任何信号的波形。
1、仿真命令如下,仿真后可以看到如下信息,包括树形结构等

vsim -novopt -classdebug work.top_tb

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、显示变量名称,点击如图所示按钮
在这里插入图片描述

二、脚本文件编写

一般来说,使用图形化界面操作较为麻烦,通常用脚本代替

1、如下面所示的最简单的脚本文件sim.do文件
TCL脚本

cd D:/uvm_test    //通过cd命令切换到当前存放.sv代码的文件夹
vlib work         //建立一个work工作区文件夹
set UVM_HOME C:/questasim64_10.6c/verilog_src/uvm-1.1d   //设置UVM库的路径
set WORK_HOME D:/uvm_test       //设置工作文件夹
set UVM_DPI_HOME C:/questasim64_10.6c/uvm-1.1d/win64 //设置DPI的路径
vlog +incdir+$UVM_HOME/src  -L mtiAvm -L mtiOvm -L mtiUvm -L mtiUPF $UVM_HOME/src/uvm_pkg.sv  $WORK_HOME/dut.sv top_tb.sv    //编译verilog代码
vsim -novopt -c -sv_lib UVM_DPI_HOME/uvm_dpi  work.top_tb   //启动仿真
view wave *  //添加所有顶层模块的仿真波形
run -all  //运行仿真

再去执行这个do文件(两种方式)

vsim -do sim.do  //写入bat文件,批处理文件,直接双击这个文件,就可以进行仿真出结果。新建txt,修改文件后缀名为.bat即可
do sim.do   //命令行的执行方式,切换到路径,再直接使用do命令

下面这部分代码也类似

set TB   "tb_top"  
set INCDIR "+incdir+../design" 
set VCOMP "vlog -cover bst -timescale=1ns/1ps -l comp.log $INCDIR"

# clean the environment and remove trash files
set delfiles [glob work *.log *.ucdb sim.list] 
file delete -force {*}$delfiles
 
# compile the design and dut with a filelist
vlib work
eval $VCOMP     ../src/designfile1.v
eval $VCOMP     ../src/designfile2.v
eval $VCOMP     ../src/designfile3.v
eval $VCOMP -sv  ./dut_pkg1.sv
eval $VCOMP -sv  ./$TB.sv
 
# run a test
set TEST chnl_burst_test
set SEED [expr int(rand() * 100)]
vsim work.tb -sv_seed $SEED -l sim.log +TESTNAME=$TEST
run -all

2、makefile脚本进行VCS仿真

all: com sim run_dve  //定义all指令
com:       //编译
	vcs -sverilog -debug_all -timescale=1ns/1ns -f file.list -l com.log
sim:       //仿真
	./simv -l sim.log
run_dve:   //后台打开仿真波形
	dve -vpd vcdplus.vpd &
clean:     //清除仿真生成的文件
	rm -rf *.vpd csrc *.log *.key *.vdb simv* DVE*

三、编译错误

1、编译sv文件时报错(2022-11-27)

vlog -work work -vopt -sv -stats=none D:/practice/base_test.sv
QuestaSim-64 vlog 10.6c Compiler 2017.07 Jul 26 2017
** Error: (vlog-13069) D:/practice/base_test.sv(4): near "uvm_test": syntax error, unexpected IDENTIFIER.
** Error: D:/practice/base_test.sv(4): Error in class extension specification.

解决方法:在文件开头加入UVM库文件
但是我在头文件里面添加这些,然后每个分开的文件也要加这个,是不是有简单的方法?
更新: 可以分开做成package,比如agent里面的各组件打包,env、model分开打包,再去包含。这样在每个子文件的开头就不需要都去写下面两行代码,也不需要根据它使用了哪些类,然后去include这些文件。(2023-2-13)

`include "uvm_macros.svh"
import uvm_pkg::*;   //vcs里需要先编译,Questa则已经编译到库里

更新:不是添加上面两个文件,而是在每个文件中添加涉及到除自身之外的模块!例如最后的case0中就用到了如下这些文件
(不确定是不是正确,这样做了之后没报错,但是总感觉很麻烦,不能直接在最顶层全部包含这些文件,然后每个子文件自己去调用吗)

`include "my_virtual_sequencer.sv"
`include "write_fifo_seq.sv"
`include "read_fifo_seq.sv"
`include "base_test.sv"

2、编译设计的.v文件时报错(2023-2-13)
在设计文件中,为了修改fifo memory更加方便,因此把参数定义在了defines.v文件,包括存储宽度、深度、读写时钟频率,然后在其他文件中要用到这个参数就使用 'WIDTH来代替(前面的符号是一个顿号)。
把设计文件放到一起编译时,报错

(vlog-2163) Macro `ADDRSIZE is undefined.

解决方法: 在每个文件的开头加入include "defines.v",这样就能索引到defines中定义的参数。有时候再出现类似问题,可能是要把其换成绝对路径

3、编译是有警告,仿真是有这个错误(2023-2-13)
在testbench中有如下代码

initial begin
        $fsdbDumpfile("Wave.fsdb");  //FSDB Dumper 指定波形文件名称
        $fsdbDumpvars;   //指定某个模块下的多少信号,把这些信号输出为波形
end

原因好像是没有FSDB Dumper这个库,需要添加环境变量。或者是在vcs/verdi中使用这些代码

[TOFD] - System task or function '$fsdbDumpvars' is not defined.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/993010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker概念、安装与卸载

第一章 docker概念 Docker 是一个开源的应用容器引擎。 Docker 诞生于2013年初,基于 Go 语言实现,dotCloud 公司出品,后改名为 Docker Inc。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发…

Python的命名空间和作用域

所谓作用域就是指变量名/对象名在多大范围内是可见的/有效的,一个变量名既不能作用域太大,这样会引发广泛的命名冲突,也不能太小,这样很难实现变量的共享,所以一般都有多层次的作用域。一个层次的作用域,在…

WebGL 同时使用多幅纹理

目录 前言 ​编辑 示例代码 颜色矢量的分量乘法来计算两个纹素最终的片元颜色 注册事件响应函数:loadTexture(),最后一个参数是纹理单元编号。 请求浏览器加载图像: 配置纹理:loadTexture&#xff0…

linux 安装Docker

# 1、yum 包更新到最新 yum update # 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manager --add-repo h…

基于SSM的汽车养护管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

谈论浏览器内核

浏览器内核是指浏览器使用的渲染引擎,用于解析并显示网页的内容。主要有以下几种浏览器内核: Trident(IE内核):由Microsoft开发,被用于Internet Explorer浏览器。目前已经被Edge取代。 Gecko:…

并发内存池(C++)

项目简介 这个项目是实现了一个高效的并发内存池。它的原型的goggle的一个开源项目tcmalloc,即thread-cache malloc(线程缓存的malloc),实现了高效多线程的内存管理,可实现对系统提供的内存分配函数malloc和free的替代…

调教 文心一言 生成 AI绘画 提示词(Midjourney)

文章目录 第一步第二步第三步第四步第五步第六步第七步第八步 文心一言支持连续对话 我瞎玩的非专业哈哈 第一步 你好,今天我们要用扩散模型创建图像。我会给你提供一些信息。行吗? 第二步 这是Midjourney的工作原理:Midjourney是另一个基于ai的工具,能…

web学习 之了解

本文的学习资源来自b站

Dos窗口设置环境变量的方法

1.Win R 打开运行窗口输入:cmd 2.在窗口中输入:set path%path%;[配置的绝对路径] 温馨提示:替换路径的时候记得将[配置的绝对路径]全部替换~

啪啪打脸,中国移动紧急回应,继续销售iPhone

针对近期媒体平台纷纷传出三大运营商停售iPhone的消息,日前中国移动紧急回应多家媒体的报道指将会继续与苹果合作销售iPhone,并且最新款的iPhone15也将同步发售,显然这是对那群特殊人群的有力回击。 iPhone已成为中国高端消费者的优先选择&am…

【杂】环形时钟配色笔记

配色网站笔记 coolorsflatuicolorscolordrophttps://www.webdesignrankings.com/resources/lolcolors/ 配色2

Python之设计模式

一、设计模式_工厂模式实现 设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计模式有很多种,比较流行的是:GOF(Goup Of Four)23种设计模式。当然,我们没有必要全部学…

kafka实战报错解决问题

需求 在一个在线商城中,用户下单后需要进行订单的处理。为了提高订单处理的效率和可靠性,我们使用Kafka来实现订单消息的异步处理。当用户下单后,订单信息会被发送到Kafka的一个Topic中,然后订单处理系统会从该Topic中消费订单消…

企业架构LNMP学习笔记29

Nginx负载均衡配置: 架构分析: 1)用户访问请求Nginx负载均衡服务器; 2)Nginx负载均衡服务器再分发请求到Web服务器。 实际配置负载均衡,只需修改作为负载均衡服务器的Nginx即可,当前架构中的…

Mapper传递参数的方法

目录 方法1&#xff1a;顺序传参法 方法2&#xff1a;Param注解传参法 方法3&#xff1a;Map传参法 方法4&#xff1a;Java Bean传参法 方法1&#xff1a;顺序传参法 public User selectUser(String name, int deptId);<select id"selectUser" resultMap&quo…

一篇文章教会你什么是高度平衡二叉搜索(AVL)树

高度平衡二叉搜索树 AVL树的概念1.操作2.删除3.搜索4.实现描述 AVL树的实现1.AVL树节点的定义2.AVL树的插入3.AVL树的旋转3.1 新节点插入较高右子树的右侧---右右:左单旋3.2 新节点插入较高左子树的左侧---左左:右单旋3.3 新节点插入较高左子树的右侧---左右&#xff1a;先左单…

【牛客面试必刷TOP101】Day3.BM10两个链表的第一个公共结点和BM13判断一个链表是否为回文结构

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

机器学习入门教学——决策树

1、简介 决策树算法是一种归纳分类算法&#xff0c;它通过对训练集的学习&#xff0c;挖掘出有用的规则&#xff0c;用于对新数据进行预测。决策树算法属于监督学习方法。决策树归纳的基本算法是贪心算法&#xff0c;自顶向下来构建决策树。 贪心算法&#xff1a;在每一步选择…

LeetCode-80. 删除有序数组中的重复项 II-⭐⭐

给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 提示&…