18 UVM Scoreboard

UVM scoreboard是一个检查DUT功能的组件。它用analysis export从monitor接受transaction事务以进行检查。

uvm_scoreboard class declaration:

virtual class uvm_scoreboard extends uvm_component

User-defined scoreboard class declaration:

 用户定义的scoreboard是从 uvm_scoreboard 扩展而来的,而 uvm_scoreboard 又派生自 uvm_component。

class <scoreboard_name> extends uvm_scoreboard;

1 uvm_scoreboard class hierarchy

3 Scoreboard Usage

  1. 使用analysis export从monitor接收transaction以进行检查。
  2. scoreboard有一个参考模型reference model可以与design行为进行比较。reference model也称为预测器predictor,它实现design行为,以便scoreboard可以将 DUT 结果与相同驱动刺激的参考模型reference model结果进行比较。

3 How to write scoreboard code in UVM?

  1. 创建一个从 uvm_scoreboard 扩展的用户定义的scoreboard类,并将其注册到工厂中。
  2. 声明analysis export以从monitor接收sequence item或transaction。
  3. 编写标准 new() 函数。由于记分板是一个 uvm_component。new() 函数有两个参数:字符串名称name和 uvm_component 父类parent。
  4. 实现 build_phase 并创建 TLM analysis export实例。
  5. 实现一个 write 方法来接收来自monitor的事务。
  6. 实现run_phase 以在整个仿真时间内检查 DUT 功能。

3.1 Scoreboard Example

class scoreboard extends uvm_scoreboard;uvm_analysis_imp #(seq_item, scoreboard) item_collect_export;seq_item item_q[$];`uvm_component_utils(scoreboard)function new(string name = "scoreboard", uvm_component parent = null);super.new(name, parent);item_collect_export = new("item_collect_export", this);endfunctionfunction void build_phase(uvm_phase phase);super.build_phase(phase);endfunctionfunction void write(seq_item req);`uvm_info(get_type_name, $sformatf("Received transaction = %s", req), UVM_LOW);item_q.push_back(req);endfunctiontask run_phase (uvm_phase phase);seq_item sb_item;forever beginwait(item_q.size > 0);if(item_q.size > 0) beginsb_item = item_q.pop_front();// Checking comparing logic...        endendendtask
endclass

4 UVM Scoreboad types

根据设计功能,记分板可以通过两种方式实现。

  1. in-order scoreboard
  2. out-of-order scoreboard

4.1 In-order scoreboard

有序记分板(in-order scoreboard)对于输出顺序与stimuli激励相同的设计很有用。比较器将以相同的顺序比较预期输出流和实际输出流。他们将独立抵达。因此,评估必须阻塞,直到预期transaction和实际transaction都存在。

要实现此类scoreboard,更简单的方法是实现 TLM analysis FIFO。有关更多详细信息,请访问TLM analysis FIFO部分。在下面的示例中,有两个monitor,其分析端口连接到记分板以提供输入和输出事务。 

class inorder_sb extends uvm_scoreboard;`uvm_component_utils(inorder_sb)uvm_analysis_export #(txn) in_export, out_export;uvm_tlm_analysis_fifo #(txn) in_fifo, out_fifo;function new (string name = "inorder_sb" , uvm_component parent = null) ;super.new(name, parent);endfunctionfunction void build_phase (uvm_phase phase);in_fifo    = new("in_fifo", this);out_fifo   = new("out_fifo", this);in_export  = new("in_export", this);out_export = new("out_export", this);endfunctionfunction void connect_phase (uvm_phase phase);in_export.connect(in_fifo.analysis_export);out_export.connect(out_fifo.analysis_export);endfunctiontask run_phase( uvm_phase phase);txn in_txn;txn exp_txn, act_txn;forever beginin_fifo.get(in_txn);process_data(in_txn, exp_txn); out_fifo.get(act_txn);if (!exp_txn.compare(act_txn)) begin`uvm_error(get_full_name(), $sformat("%s does not match %s", exp_txn.sprint(), act_txn.sprint()), UVM_LOW);endendendtask// Reference model task process_data(input txn in_txn, output txn exp_txn);// Generate expected txn for driven stimulus......endtask
endclass

4.2 Out-of-order scoreboard

无序记分板out-of-order scoreboard对于输出顺序与驱动输入激励stimuli不同的设计很有用。基于输入激励参考模型将生成 DUT 的预期结果,并且实际输出预计以任何顺序出现。因此,需要存储从输入激励生成的此类不匹配事务,直到从待比较的 DUT 接收到相应的输出为止。为了存储此类事务,关联数组被广泛使用。根据索引值,transactions存储在预期和实际关联数组中。当匹配的数组索引发生比较时,关联数组中的条目将被删除。

class txn extends uvm_sequence_item;int id;  // other class properties//...
endclassclass out_of_order_sb extends uvm_scoreboard;`uvm_component_utils(out_of_order_sb)uvm_analysis_export #(txn) in_export, out_export;uvm_tlm_analysis_fifo #(txn) in_fifo, out_fifo;// associative array of class type as txn and indexed by inttxn expected_out_array[int];txn actual_out_array[int];// Store idx in separate queues.int expected_out_q[$], actaul_out_q[$];function new (string name = "out_of_order_sb" , uvm_component parent = null) ;super.new(name, parent);endfunctionfunction void build_phase (uvm_phase phase);in_fifo    = new("in_fifo", this);out_fifo   = new("out_fifo", this);in_export  = new("in_export", this);out_export = new("out_export", this);endfunctionfunction void connect_phase (uvm_phase phase);in_export.connect(in_fifo.analysis_export);out_export.connect(out_fifo.analysis_export);endfunctiontask run_phase( uvm_phase phase);txn in_txn, out_txn;forever beginfork      begin in_fifo.get(in_txn);process_data(in_txn);endbeginout_fifo.get(out_txn);actual_out_array[out_txn.id] = out_txn;actaul_out_q.push_back(out_txn.id);endjoincompare_data();endendtask// check_phase to check whether any entry is pending in queues.function void check_phase(uvm_phase phase);super. check_phase(phase);if(expected_out_q.size() != 0) `uvm_info (get_full_name(), $sformatf("expected_out_q size = %0d", expected_out_q.size()), UVM_LOW);if(actaul_out_q.size() != 0) `uvm_info (get_full_name(), $sformatf("actaul_out_q size = %0d", actaul_out_q.size()), UVM_LOW);endfunctiontask process_data(txn in_txn);txn exp_out_txn;// Using reference models, generate output for input stimulus.// store expected output (exp_out_txn) in expected_out_array......expected_out_array[in_txn.id] = exp_out_txn;expected_out_q.push_back(in_txn.id);endtasktask compare_data();int idx;txn exp_txn, act_txn;if(expected_out_q.size() > && actaul_out_q.size() > 0) beginidx = expected_out_q.pop_front();// Look for idx in actual_out_array to see whether the output has been received for a driven stimulus or not.if(actual_out_array.exists(idx)) begin exp_txn = expected_out_array[idx];act_txn = actual_out_array[idx];if(!exp_txn.compare(act_txn)) begin`uvm_error(get_full_name(), $sformat("%s does not match %s", exp_txn.sprint(), act_txn.sprint()), UVM_LOW);endelse beginexpected_out_array.delete(idx);actual_out_array.delete(idx);endendelse expected_out_q.push_back(idx); // exp_idx is not found in actual_out_array.endendtask
endclass

 

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

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

相关文章

非对称加密与对称加密的区别是什么?

在数据通信中&#xff0c;加密技术是防止数据被未授权的人访问的关键措施之一。而对称加密和非对称加密是两种最常见的加密技术&#xff0c;它们被广泛应用于数据安全领域&#xff0c;并且可以组合起来以达到更好的加密效果。本文将探讨这两种技术的区别&#xff0c;以及它们在…

OpenHarmony 快速集成轻量级存储(dataPreferences)工具类

OpenHarmony中也有类似于Android的SharedPreferences的轻量级存储&#xff0c;名字叫dataPreferences&#xff0c;这里省略介绍&#xff0c;直接放工具类 一.初始化 首先在EntryAbility中对dataPreferences进行初始化操作&#xff0c;初始化的代码如下&#xff1a; import d…

基于Java+SpringMvc+Vue求职招聘系统详细设计实现

基于JavaSpringMvcVue求职招聘系统详细设计实现 &#x1f345; 作者主页 专业程序开发 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringMvcVue求职招聘系统详细设计实现一、前言介…

Nacos注册及使用

一、简介 Nacos是阿里云开源的一个服务发现、配置管理和服务鉴权平台&#xff0c;它提供了一种更简单、更便捷、更开放的方式来管理服务&#xff0c;帮助开发者快速实现服务的发现、配置的管理、服务的鉴权等功能。Nacos可以帮助开发者轻松管理微服务应用中的服务提供者、服务…

啊?这也算事务?!

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

GBASE南大通用-GBase 8s数据库日志模式及切换

一、 GBase 8s数据库共有以下 4 种日志模式&#xff1a;无日志模式、缓冲日志模式、无缓冲日志模式、ANSI 模式。详细介绍如下&#xff1a; 1、无日志模式&#xff08;Non logging&#xff09;&#xff1a; 采用无日志模式时&#xff0c;所有 DML 操作都不会被记录到日志中&…

关于表格太大了jupyter无法单次处理的问题

记录下自己的心路历程…耗时耗精力 我用的数据库单个表格就很大&#xff0c;一个表格有30多G&#xff0c;jupyter无法处理这么大的表格&#xff0c;会直接把电脑的进程全部结束掉&#xff0c;结束掉要是能运行成功倒也行啊&#xff0c;然鹅…给我报错说处理不了&#xff0c;罢工…

代码随想录刷题 | Day1

今日学习目标 一、基础 数组 array类 模板类vector 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的 而且大家如果使用C的话&…

儿童学python语言能做什么,儿童学python哪个机构好

这篇文章主要介绍了儿童学python哪个线上机构好&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 少儿编程python 文章目录 前言 CSP-J与CSP-S少儿编程证书含金量排名&#xff0…

linux实用技巧:ubuntu18.04安装samba服务器实现局域网文件共享

Ubuntu安装配置Samba服务与Win10共享文件 Chapter1 Ubuntu18.04安装配置Samba服务与Win10共享文件一、什么是Samba二、安装Samba1、查看是否有安装samba2、安装samba 三、配置Samba服务1、创建共享目录&#xff08;以samba_workspaces为例&#xff09;2、为samba设置登录用户3、…

Python装饰器的专业解释

装饰器&#xff0c;其实是用到了闭包的原理来进行操作的。 单个装饰器&#xff1a; 以下是一个简单的例子&#xff1a; def outer(func):print("OUTER enter ...")def wrapper(*args, **kwargs):print("调用之前......")result func(*args, **kwargs)p…

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 国赛选手带你看 Elasticache Serverless

抛砖引玉 讲一下作者背景&#xff0c;曾经参加过国内世界技能大赛云计算的选拔&#xff0c;那么在竞赛中包含两类&#xff0c;一类是架构类竞赛&#xff0c;另一类就是 TroubleShooting 竞赛&#xff0c;对应的分别为亚马逊云科技 GameDay 和亚马逊云科技 Jam&#xff0c;想必…

【数学建模美赛M奖速成系列】Matplotlib绘图技巧(三)

Matplotlib绘图技巧&#xff08;三&#xff09; 写在前面7. 雷达图7.1 圆形雷达图7.2 多边形雷达图 8. 极坐标图 subplot9. 折线图 plot10. 灰度图 meshgrid11. 热力图11.1 自定义colormap 12. 箱线图 boxplot 写在前面 终于更新完Matplotlib绘图技巧的全部内容&#xff0c;有…

php 8.4 xdebug扩展编译安装方法

最新版php8.4 xdebug扩展只能通过编译方式安装, pecl是安装不了的, 编译方法如下 下载最新版xdebug git clone https://github.com/xdebug/xdebug.git 却换入xdebug目录执行编译安装xdebug cd xdebug phpize./configure --enable-xdebugmakemake install3. 配置启用xdebug 这…

JavaScript中实现页面跳转的几种常用方法

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在JavaScript中实现页面跳转的几种常用方法以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题…

Linux:jumpserver资产管理,分配 (4)

jumpserver可以去管理&#xff0c;Linux&#xff0c;Windows和Windows server&#xff0c;数据库&#xff0c;华为,思科等…网络设备 我这里准备了 三个 分别为 centos7 win10 mysql 在jumpserver上等登录的话&#xff0c;还需要他们的用户去登录&#xff0c;这里等会我就一…

1panel使用指南(一)面板安装

一、1panel简介 1Panel是杭州飞致云信息科技有限公司推出的产品 [1]&#xff0c;帮助用户实现快速建站。 [2]是一款现代化、开源的Linux服务器运维管理面板&#xff0c;于2023年3月推出&#xff0c;深度集成WordPress和Halo&#xff0c;一键完成域名绑定、SSL证书配置等操作&a…

SSH远程登陆服务器

截取自文章&#xff1a;SSH简介及两种远程登录的方法_ssh -CSDN博客 SSH的安装 SSH分为客户端 openssh-client 和服务器 openssh-server&#xff0c;可以利用以下命令确认电脑上是否安装了客户端和服务器。 dpkg -l | grep ssh 如果只是想远程登陆别的机器只需要安装客户端&…

Eureka服务注册与发现

1. Eureka简介 Eureka采用了CS的设计架构&#xff0c;Eureka Server 作为服务注册功能的服务器&#xff0c;它是服务注册中心。而系统中的其他微服务&#xff0c;使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系…

【软件工程】漫谈增量过程模型:软件开发的逐步之道

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 增量过程模型&#xff08;Incremental Process Model&#xff09; 主要特点和阶段&#xff1a; 优点&#xff1…