《从零开始,搭建一个简单的UVM验证平台》实操

2024-05-09 01:44

本文主要是介绍《从零开始,搭建一个简单的UVM验证平台》实操,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近的工作中需要用UVM平台去仿真软件同事写的C程序,虽然只要用EDA同事已经搭好的UVM平台稍微改改就行,但对于我这种从未接触过UVM甚至都没用过System Verilog的纯FPGA工程师来说还是很有难度的,因为我对这方面一点概念都没有。

基于此,想着边用边学,就在网上找了一些资料学习。看到了下面这篇文章:

从零开始,搭建一个简单的UVM验证平台(一)

看着还是挺简单的,但亲自动手去做一遍,还是费了很大功夫的。虽然这个博客里提供了大部分代码,但并没有写一步步地怎么做。另外,特别注意,这个博客系列文章里的代码有一些小问题,会导致结果出不来,我就遇到了好几个坑。

下面就记录下,我一步步的过程,并附上所以源码和相应的截图。

第1步:把这几个模块代码拷贝下来

dut.v

module dut(input             clk           , input             rstn          ,input      [7:0]  data_i        ,input             data_i_valid  ,output reg [7:0]  data_o        ,output reg        data_o_valid
);always @(posedge clk)beginif(!rstn)begindata_o       <= 8'd0;data_o_valid <= 1'b0;endelse begindata_o       <= data_i;data_o_valid <= data_i_valid;end
endendmodule 

my_driver.sv

//`ifndef _MY_DRIVER
//`define _MY_DRIVER`include "uvm_macros.svh"
import uvm_pkg::*;class my_driver extends uvm_driver;`uvm_component_utils(my_driver); // 注册function new(string name = "my_driver", uvm_component parent = null);super.new(name, parent);`uvm_info("my_driver", "new is called.", UVM_LOW)endfunctionextern virtual task main_phase(uvm_phase phase); 
endclasstask my_driver::main_phase(uvm_phase phase);phase.raise_objection(this);`uvm_info("my_driver", "main phase is called.", UVM_LOW);top_tb.data_i       <= 8'd0;top_tb.data_i_valid <= 1'b0;while(!top_tb.rstn)@(posedge top_tb.clk);for(int i = 0; i < 256; i = i+1)begin@(posedge top_tb.clk)top_tb.data_i <= $urandom_range(0,255);top_tb.data_i_valid <= 1'b1;`uvm_info("my_driver", "data is drived.", UVM_LOW) end@(posedge top_tb.clk);top_tb.data_i_valid <= 1'b0;phase.drop_objection(this);
endtask//`endif

top_tb.sv

`timescale 1ns/1ps
`include "uvm_macros.svh" //这是UVM中的一个文件,包含了众多宏定义import uvm_pkg::*;        //只有导入了这个库,编译器在编译my_driver.sv文件时才会认识其中继承的uvm_driver等类名//`include "my_driver.sv"module top_tb;reg clk,rstn;
reg  [7:0] data_i;
reg  data_i_valid;
wire [7:0] data_o;
wire data_o_valid;dut my_dut(.clk            (clk   )        ,.rstn           (rstn  )        ,.data_i         (data_i)        ,.data_o         (data_o)        ,.data_i_valid   (data_i_valid)  ,.data_o_valid   (data_o_valid)
);//initial begin
//  my_driver drv; // instance
//  drv = new("drv", null);
//  drv.main_phase(null);
//  $finish();
//endinitial beginrun_test("my_driver");
end initial beginclk = 0;forever begin#100 clk = ~clk;end
endinitial beginrstn = 1'b0;#1000rstn = 1'b1;
endinitial begin$fsdbDumpfile("tb.fsdb");$fsdbDumpvars;
endendmodule

第2步:产生filelist

find ./ -name "*.*v" > filelist.f

第3步:产生makefile

这个makefile,我是在网上找了一些资料作为参考,写了个简单能用的。

#--------------------------------------------------------------------------------------
all  : clean vcs
#--------------------------------------------------------------------------------------
vcs   :vcs   	  -f filelist.f \-ntb_opts uvm \-timescale=1ns/1ps \-full64 -R  +vc  +v2k  -sverilog \-debug_access \-kdb \-l simv.log &
#--------------------------------------------------------------------------------------
verdi  :verdi -f filelist.f -ssf tb.fsdb &
#--------------------------------------------------------------------------------------
clean  :rm  -rf  *~  core  csrc  simv*  vc_hdrs.h  ucli.key  urg* *.log  novas.* *.fsdb*  rm  -rf  64* DVEfiles *.vpd  verdiLog verdi_config_file
#---------------------------------------------------------------------------------------

第4步:编译

所有文件如上图所示,在当前路径下执行如下命令进行编译:

make all或者make vcs

第5步:查看结果

编译结果如下图所示:

也可以打开simv.log查看编译结果,还可以用make verdi查看波形。


附:问题记录

我现在学到了第三篇,也就是下面这篇博客,遇到了几个问题,卡了我好几天才找到原因,也一并记录在此,方便后来人!

从零开始,搭建一个简单的UVM验证平台(三)

第一个问题

第二个问题,这个是巨坑啊,编译的时候发现会卡住,一直找不到原因,差点让我UVM从入门到放弃,花了几天的时间各种找资料各种加log才定位到这里。啊。。。超级想骂人!!!

这篇关于《从零开始,搭建一个简单的UVM验证平台》实操的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972041

相关文章

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则