文章UVM and C – Perfect Together的解读与思考

2023-05-16

解读UVM and C – Perfect Together

文章获取方式:路科验证--->资源--->DVCon2018-USA.zip--->08_3

http://rockeric.com/resource/paper/

 

文章主要内容:使用DPI-C集成UVM bench和C code时,遇到的最大问题在于:域。DPI-C的域可以是module实例,interface实例或全局根域(the global root scope)。UVM bench没有这种域,它是基于动态类的,而不是基于静态实例的,但C是基于静态的。

 

文章详细介绍了如何实现从图1=>图2=>图3

The SystemVerilog Interface

Interface是兼有“软硬件”的特性,即interface可以实例化,使用virtual interface可以在UVM bench中使用interface。因此选择interface作为DPI-C的域最为合适。

Interface中定义了SV一侧export到C一侧的方法,sv_hello和sv_start_sequenceC。其中,声明了 sequencer句柄,再使用动态转换,然后调用sequencer内的同名方法。

 

The UVM Agent

  

其中,这2行代码很重要。

这样,interface和sequencer之间就建立了联系。第一句,interface中的uvm_sequencer_base类型的sqr被初始化,才能在interface中调用sequencer内的方法。第二句,sequencer中的interface被初始化,可以在sequencer中通过DPI-C调用C一侧的方法。

 

The UVM Sequencer

任务c_start_thread()是通过DPI-C调用C一侧的方法,使用fork-join并行4个线程。任务sv_start_sequenceC是由C code调用,启动sequence后把结果输出到C一侧。

 

The UVM Sequence

上图,sequenceA中,通过interface调用C一侧的方法,c_hello和c_datatype_array_of_10_int。

 

 

Threaded Code

 

在sequencer的任务c_start_threads()中,4个线程并行执行,但是每次只执行1个线程。当1个线程启动时,它就得到了控制权,而另一个线程得到控制权的方法是:当前线程将控制权放弃或者“让步”。“让步”的形式表现为执行#delay, wait() , a @(posedge clk)等时间语句。正是因为有这种“让步”行为,才能让4个线程看似并行执行。

 

C code中的“jj”是一个全局变量,但不是一个安全的变量。4个线程并行执行过程中,“jj”的值会被不同的线程改变,这不是我们所期望的。

左边是“让步”控制权,右边是放弃控制权。

图中,紫红色表示C code一侧启动的sequenceC,紫色和蓝色分别是SV一侧启动的sequenceA,sequenceB。

在同一个sequencer上,挂载了sequenceA,sequenceB,sequenceC,使用并行语句,出现“让步”行为,如波形图所示。

 

C code在其他场景下使用:

Stimulus Generator:数据由C一侧产生,通过DPI-C送到SV一侧。

Data checker:在C一侧产生预测数据,将监测到的DUT输出送到C一侧进行对比。

Bus transfer generator:C一侧发送总线读写请求。

 

总结

这篇文章详细描述了将interface作为域,通过DPI-C集成UVM和C的例子。将interface作为域可以 消除集成和连接问题,最重要的是它兼有“软硬件”的特性。

 

思考:

A. interface前加virtual和不加的区别?

Interface是“硬件”特性,类似于module可以例化;virtual interface是“软件”特性,在UVM bench中是指向例化interface的指针。因此,interface才有“软硬件”的特性。

B. 除了interface外,还有哪些地方可以作为域?

    1.Module

Import:将DPI-C的实现放在C的class里,声明并例化C class,封装C指针的调用,在SV一侧的组件(run_phase/main_phase)中直接调用封装后的task/function。

Export:在module中似乎没法调用。

    2.Package

将DPI-C的实现(import和export)放在UVM的class里,再把这个class放在package中,在UVM bench里创建这个class,使用句柄调用DPI-C的task/function。

C. 并行线程的本质?

使用fork-join(join_none)执行并行线程,其本质是当前线程在执行#delay, wait() , a @(posedge clk)等时间语句时,将控制权交给其他线程,使得所有线程看似并行执行。

D. 全局变量和局部变量的使用区别?

文中的例子表明,在执行并行线程时,并行线程涉及到的全局变量是不安全的,需要使用局部变量。

E. Sequencer的仲裁

文中的例子表明,多个sequence(有继承关系)挂载到同一个sequencer上,sequencer需要仲裁。仲裁mode默认是SEQ_ARB_FIFO,可以在test层用函数set_arbitration改变仲裁mode。

注:以上思考完全是个人理解,如有错,欢迎留言!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文章UVM and C – Perfect Together的解读与思考 的相关文章

随机推荐

  • 用户不在sudoers文件中的解决方法&…

    在使用Linux系统过程中 xff0c 通常情况下 xff0c 我们都会使用普通用户进行日常操作 xff0c 而root用户只有在权限分配及系统设置时才会使用 xff0c 而root用户 的密码也不可能公开 普通用户执行到系统程序时 xff
  • Proxmox VE与常见的虚拟化平台比较

    1 Proxmox VE的简要介绍 Proxmox VE的简要介绍 根据Proxmox VE的官网介绍 xff0c Proxmox Virtual Environment xff08 简称Prxomox VE或PVE xff09 由位于奥地
  • Proxmox VE与常见的私有云方案比较(中)

    2 2 SmartX私有云解决方案 SmartX这家公司挺有意思的 xff0c SmartX 是番文的叫法 xff0c 这家公司好像不愿意或者是有意不让人知道他的中文名称叫啥 xff0c 不知道这是不是传说中的卑于内而媚于外 你翻遍了Sma
  • Proxmox VE 7.0的高级安装及系统盘分区-ZFS(中)

    2 2 ZFS文件系统安装方式 从Proxmox VE 3 4开始 xff0c Proxmox VE增加了ZFS文件系统作为可选的文件系统和根文件系统 Proxmox VE官方提供的ISO镜像已经集成了ZFS所需的软件包 xff0c 用户无
  • Proxmox VE逻辑卷管理LVM详解(1-4)

    Proxmox VE基于Debian Linux操作系统 xff0c 也就是说Linux操作系统的逻辑卷管理LVM在Proxmox VE也是适用的 当我们在使用Proxmox VE的时候 xff0c 如果发现某个分区的容量不够用了 xff0
  • KVM虚拟化解决方案系列之KVM部署篇(4-4)

    5 2 Ubuntu上安装虚拟机 Ubuntu上安装虚拟机的过程与CentOS上类似 xff0c 这里我也简单讲一下 第一步 xff0c 创建虚机镜像文件 使用命令 qemu img 创建一个空白的虚拟机镜像 xff0c 格式为qcow2
  • KVM虚拟化解决方案系列之KVM管理工具-绪论篇

    我们在 KVM虚拟化解决方案系列之KVM架构篇 有讲到两个重要的内容 xff0c 一个内容是 要实现一个可运行 可运维的KVM虚拟化解决方案 xff0c 需要解决两个问题 xff0c 第一个是虚拟化技术实现问题 xff0c 第二个是集群虚拟
  • KVM虚拟化解决方案系列之KVM管理工具-libvirt介绍篇

    KVM作为后起之秀 xff0c 在公有云Hytervisor市场中占主宰地位 xff0c 如一大批基于OpenStack二次开发的云厂商 而老牌的商业VMware则在私有云Hytervisor市场中占主宰地位 xff0c 仍然是各大中小企业
  • (状态压缩) 炮兵阵地(P1185)

    题意 xff1a 在一个二维方格中 xff0c 安置大炮 有平原有高山 xff0c 只有平原可以安 大炮的射程是四个方向 xff0c 距离为2格 求 xff1a 最多能安多少个大炮 方法 xff1a 对于每一行的一种状态用一个整数表示 xf
  • 隐藏UITabBarController的tabBar

    隐藏UITabBarController的tabBar的时候 xff0c 如果不做处理那么下方会多处49pix的白条或者其他颜色的条 xff0c 解决这个问题的方法如下 void setTabBarHidden BOOL hidden se
  • 在线编译多文件c++,c,python等

    在线编译 最近在找在线编译c 43 43 的网站 网上有很多 大多数都是单个文件编译运行 无法建立工程 今天 发现一个比较好的网站 可以直接拉取git的代码进行调试 支持打断点单步调试 支持一键commit等 有些功能还没有试 1 网址 h
  • gtest教程(记录小白从0学习gtest的过程)

    gtest使用教程 1 简介 之前对gtest一无所知 最近 找了些相关的资料 学习了下 这里主要记录了学习过程和相关知识点 什么是gtest gtest测试框架是在不同平台上 xff08 Linux xff0c Mac OS X xff0
  • blender摄像机怎么绕物体旋转

    1 添加物体和摄像机运动路径 贝塞尔圆 2 添加摄像机3 摄像机清零 alt 43 G alt 43 r alt 43 s 4 相机 添加跟随路径 标准跟随
  • steam++下载(最新,2023年)

    steam 43 43 改名字了 下载 https steampp net
  • Arduino+Esp32-wroom32E开发环境搭建(2023)

    这两天开始在Arduino下安装esp32 xff0c 经历了从自动安装到手动安装的过程 自动安装 xff0c 三个字评价 xff1a 太慢了 xff0c 然后还每次100 失败 xff0c 无语 然后开始手动安装 最后成功了 1 ardu
  • gtest 死亡测试

    1 死亡测试 在许多应用程序中 xff0c 如果不满足条件 xff0c 断言可能会导致应用程序失败 这些一致性检查确保程序处于已知的良好状态 xff0c 在某些程序状态损坏后尽早失败 如果断言检查了错误的条件 xff0c 则程序可能会在错误
  • 编译动态库

    静态库命令 ar rcs span class token operator span span class token punctuation span o libxxx span class token punctuation span
  • c/c++ backtrace打印函数调用栈

    效果 解析动态库libtest so和可执行文件m 打印原始栈 include lt execinfo h gt span class token keyword void span span class token operator sp
  • windows自动更新变成灰色不能选择的原因

    现象 发现我的电脑 属性 自动更新里面所有的按钮都已经是灰色的了 xff0c 而且每次开机都会自动运行自动更新 xff0c 关闭进程也无法停止 xff0c 几秒钟后又会开始更新 xff0c 而且更新后会要求重新启动 解决 xff1a 控制面
  • 文章UVM and C – Perfect Together的解读与思考

    解读UVM and C Perfect Together 文章获取方式 xff1a 路科验证 gt 资源 gt DVCon2018 USA zip gt 08 3 http rockeric com resource paper 文章主要内