I2C项目问题总结

news2024/9/28 17:26:03

1、项目里面用到哪些接口?都是怎么用的?

项目里面用到了rkv_i2c_if、lvc_i2c_if、lvc_apb_if。rkv_i2c_if用来将DUT内部的intr中断信号、debug信号、ic_en使能信号、i2c和apb的时钟复位信号引出,在接口中声明了一个大位宽信号用来表示intr中断的所有信号,每一位代表一个中断信号,每个debug信号对应声明一个单独的信号,内部有wait_apb和wait_intr任务,wait_intr(id)任务等待对应id位的变化。get_intr(id)函数返回对应intr[id]位。lvc_i2c_if接口用来连接dut与外部i2c的IP(具体几个assign还未理解)。lvc_apb_if用来连接apb的IP。在tb中声明接口并连接,向底层通过config_db传递。env层接收到rkv_i2c_if接口都赋值到cfg配置中,并将带接口的cfg配置向下set传递给sbd_mst、sqr、cgm,在它们中就可以使用端口了。env层接收到的lvc_i2c_if接口set到cfg中的对应成员cfg中,各个成员cfg又通过config分别set到I2C的env的下一层。lvc_apb_if则从tb中直接set到apb_mst_agent中,其agent get到接口后再赋值给其monitor等组件。

2、验证环境中的配置是怎么传递和设置的?

rkv_i2c_config中包含了lvc_apb_config、lvc_i2c_system_config,在env中声一个rkv_i2c_config用来接收从test配置过来的cfg,并将其分别set给sbd_mst、sqr、cgm。在env中将rkv_i2c_config cfg中的成员配置信息分别配置使用,并set给apb_mst、i2c_mst、i2c_slv,在这个几个component中再进一步赋值给各个monitor,sequencer等。

默认7bit寻址、主机码3‘b000、从地址10‘b1100110011,deviceid为24'b0,标准速度模式等

3、覆盖率是怎么收集的?

rgm中有两个imp端口分别用来接收来自apb_master和i2c_slave的monitor监控到的总线的事务。声明了两个事件分别表示前门访问触发和后门访问触发。声明寄存器域模型、rkv_i2c_if虚接口、cfg配置信息。根据提取的功能点定义功能覆盖率,每个coverage都由sample函数来触发。通过imp端口的隐式调用的write_apb_master任务和write_i2c_slave任务来接收monitor监控到的总线的事务(其中只有在apb端的发来数据才有效,对于i2c端的数据不做处理,即write_i2c_slave任务内部为空),通过apb_master_monitor端传来事务的addr,利用cfg.default_map计算出是哪一个寄存器,并将这个寄存器作为触发前门访问事件的寄存器。该事件被触发后,延迟一段时间使寄存器模型的值已经被更新,然后根据触发事件的寄存器的名字来判断触发哪一个coverage的sample来收集相应寄存器里面数据的覆盖率(将相应寄存器的期望值传递过去)。

断言的覆盖率怎么写?在哪个模块实现?

断言分为立即断言与并行断言,立即断言放在不消耗时间的语句中,与时序无关,并行断言中要有时钟,与时序有关,并行断言只会在时钟边沿激活,变量的值是采样到的值。apb总线上的时序关系的验证用并行断言来验证,根据apb的时序关系写并行断言,且一般在接口中实现。

代码覆盖率、功能覆盖率?

代码覆盖率由工具自动收集,包括line_coverage(行)、condition_coverage(条件)、toggle_coverage(跳转)、branch_coverage(分支)、FSM_coverag(状态机)。

功能覆盖率主要验证是否符合设计说明书的功能要求主要有面向数据的覆盖率:coverage_geoup(覆盖组)、coverage_point(覆盖点)、cross_coverage(交叉覆盖)面向控制的覆盖率:检查行为序列(sequences of behaviors)是否已经发生.通过编写SVA来获得断言覆盖率(assertion coverage).

4、寄存器模型是怎么定义的?

每一个寄存器class都extends uvm_reg,定义好各个寄存器的域并做配置。然后定义一个ral_block_rkv_i2c extends uvm_reg_block,里面声明所有的寄存器(可以随机化的声明为rand)并做build配置。定义覆盖组,对几个寄存器偏移地址的访问。寄存器模型中有new方法,可以设置是否启动覆盖率的采集,有build函数,里面设置default_map,例化、配置寄存器并做赋值。添加后门访问路径,以regfile的形式添加各个寄存器的路径。里面还有sample方法启动覆盖率收集。

寄存器总线是什么?

寄存器总线就是apb总线,apb总线主要有paddr、pwrite、psel、penable、pready、prdata、pslverr,读操作的实现是将地址addr驱动到总线上,同时pwrite信号置0表示读,同时psel信号拉高表示选通,同时penable应该为低,等下一个时钟周期再将penable信号拉高,等待ready拉高表示传输成功,然后将总线上读取到的prdata信号取回。写操作的实现是将paddr、pwdata同时驱动到总线上,同时pwrite置1表示写同时sel置1表示选通,同时penable拉低,下一个周期再将其拉高。

寄存器模型是怎么实现读写的?

参考UVM的寄存器篇幅!

5、seq是和seqr是怎么写的?

rkv_i2c_virtual_sequencer里面从env中get到cfg配置信息,然后将cfg中的rgm和vif赋值给本地变量。

rkv_i2c_base_virtual_sequence先定义p_sequencer为rkv_i2c_virtual_sequencer,然后将p_sequence里面的rgm、vif、cfg赋值给本地变量。这里还有一个env,由于其子类seq中需要用到env中的重配置task,所以需要有一个env传进去,所以就在这里面声明一个env并通过$cast(env,p_sequencer.m_parent)的方法将env传进来。

 rkv_apb_base_sequence为apb端seq的基础。里面声明寄存器模型和所有需要用到的寄存器的域,里面有更新寄存器的任务,它被作为成员变量声明在rkv_i2c_base_virtual_sequence里面,所有声明的有关apb端的seq都要继承于它。apb端的element事务主要有配置的seq、中断清除seq、等待中断清除完成seq、读seq(会检查FIFO)、写seq(会检查FIFO)、等待FIFO为空seq、读seq(不检查FIFO)、写seq(不检查FIFO)、将RX_FIFO中数据读出seq、TX_ABRT中断源检查seq。

rkv_i2c_slave_base_sequence为i2c端seq的基础,里面声明控制ack和nack的参数,所有声明的有关i2c端的seq都要继承于它,它被作为成员变量声明在rkv_i2c_base_virtual_sequence里面,i2c端的element主要有读回应seq、写回应seq。

user_virtual_sequence为自己根据各个element为验证提取的功能点而写的seq,它继承与rkv_i2c_base_virtual_sequence,那么它就可以使用它父类中的所有的成员seq及继承与成员seq的所有element_seq。

test里面,各个user_virtual_sequence在env.sqr(rkv_i2c_virtual_sequencer)上start,内部element_squence在相应的sequencer上挂载。

6、I2C项目中的一个难点?

scoreboard中接收apb端数据的判断条件的设置。

在写scoreboard的时候,需要接收apb_master端的monitor从总线上监控到的apb_transfer,将监控到的事务通过调用端口的write_函数来存入FIFO中,但是读和写的事务的存入稍微有些不同。monitor监控到了总线上的事务,可以通过事务中的控制命令write是1还是0来判断是读还是写,如果是write,而且与寄存器模型中控制命令一致,且TX_FIFO未满(写事务中每写一个数据都会mirror此状态寄存器),那么可以事务放进FIFO。如果是read,事务同样还是会发送data(=0)数据到总线上,这个事务也会被monitor监控到并传递给scoreboard,而且这时候i2c端已经将数据传入,RX_FIFO中已经有数据,已经不是空了,正常来说,此时已经满足了if判断条件,但是,由于if中判断的是寄存器模型的值,此时寄存器模型的值和dut的值还不一样,dut中的状态寄存器中RX_FIFO已经不是空了,但是没有mirror操作将dut的值同步到寄存器模型中,所以,if中判断的寄存器模型的值还是表示是空的,判断不通过,不会被scoreboard存入FIFO,所以,apb端在发送读事务的时候,发送完所有的读事务以后,需要有一个mirror操作,将dut中的寄存器值的值更新到寄存器模型中,这样,在接下来apb端从cmd寄存器中读数据时候,monitor监控到事务数据才是实际上读到的需要放进scoreboard的FIFO中的数据。

(待补充。。。)

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

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

相关文章

分布式消息中间件RocketMQ的工作原理

RocketMQ 工作原理 消息的生产 消息的生产过程 ​ Producer可以将消息写入到某Broker中的某Queue中,其经历了如下过程: Producer发送消息之前,会先向NameServer发出获取消息Topic的路由信息的请求NameServer返回该Topic的路由表及Broker列…

kubernetes yaml文件|--dry-run导出yaml文件

kubernetes yaml文件|--dry-run导出yaml文件 YAML 语法格式:二 查看 api 资源版本标签三 写一个nignx.yaml文件demo四、编写service服务的资源清单详解k8s中的port五 用–dry-run命令生成yaml资源清单六 将现有的资源生成模板导出写yaml太累怎么办? YAML…

关于FLAME和SMPL模型

英文参考文献:https://medium.com/offnote-labs/3d-face-and-body-reconstruction-95f59ada1040 一个训练好的FLAME模型的输入是一个参数向量,包括形状参数、姿势参数和表情参数。这些参数分别控制人脸的身份特征、头部的旋转和平移、面部的表情变化。一…

算法设计与分析:线性规划问题和单纯形算法(作业-必做)(头歌实验)

第1关:单纯性算法解一般线性方程组 任务描述 本关任务:编写一个利用两阶段单纯性算法求一般线性规划的程序。 相关知识 单纯形算法的第1步:选出使目标函数增加的非基本变量作为入基变量。 查看单纯形表的第 1 行(也称之为z行…

UnityVR--Managers--对象池1

本篇中使用的API&#xff1a;gameObject.CompareTag("标签")、UnityEvent()事件管理、ObjectPool<GameObject>&#xff08;&#xff09;对象池 参照unity官方教程&#xff1a;Hi ObjectPool 目录 1. 应用场景 2. 对象池的原理 3. 查看资源消耗情况 4. 不使用…

mysql 备库延迟问题

备库延迟原因&#xff1a; log传送开销小&#xff0c;消费relay log 超时 备库性能不如主库 备库承担更多SQL分析 主库是多线程执行&#xff0c;备库是单线程执行解析relay log 处理方法&#xff1a; 主备使用相同的机器 备库关闭log实时落盘 增加从库数量&#xff0c;…

Sentinel-2数据下载及处理

数据下载网站&#xff1a;欧空局官网&#xff08;需注册并登录&#xff09; https://scihub.copernicus.eu/dhus/#/home 哨兵2 L1C数据波段信息 哨兵2 L1C数据时间&#xff1a;2015-06-23至now 由于数据量大&#xff0c;考虑服务器压力&#xff0c;哨兵2号数据直接下载的时间跨…

[web安全原理分析]-XXE漏洞入门

前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞&#xff0c;XXE漏洞发生在应用程序解析XML输入时&#xff0c;没有禁止外部实体的加载&#xff0c;导致可加载恶意外部文件&#xff0c;造成文件读取、命令执行、内网端口扫描、攻击内网网站、…

头歌计算机组成原理实验—运算器设计(10) 第10关:补码一位乘法器设计

第10关&#xff1a;补码一位乘法器设计 实验目的 学生掌握补码一位乘法运算的基本原理&#xff0c;熟练掌握 Logisim 寄存器电路的使用&#xff0c;能在 Logisim 平台中设计实现一个8*8 位的补码 Booth一位乘法器。 视频讲解 ####实验内容 在 alu.circ 文件中的补码一位乘法…

Linux基础——权限

1. Linux下的用户 在 Linux 操作系统中&#xff0c;有两种主要类型的用户账户&#xff0c;分别是普通用户账户和超级用户账户&#xff08;也称为 root 用户账户&#xff09;。 普通用户账户&#xff08;user&#xff09;是在 Linux 系统上创建的普通账户&#xff0c;可以用于日…

图片隐写(一)

文件隐藏 binwalk binwalk -e filename foremost foremost filename steghide & stegseek Install sudo apt-get install steghidestegseek Use steghide extract -sf filename -p passwordtime stegseek secret.file aaa.txt dd 文本隐藏 二进制文件末尾 or 文…

ffmpeg rtsp解析

一、 rtsp 协议说明 rtsp的协议层级 rtsp 属于应用层&#xff0c; 使用tcp传输&#xff0c;主要是传递服务器的一些信息&#xff0c;实现流连接。播放 暂停 销毁等控制 rtp 实现音视频数据包的发送&#xff0c;通过RTSP等协议的SDP信息协商好了RTP数据包的发送目的和传输方式…

UNIX网络编程卷一 学习笔记 第十四章 高级I/O函数

有3种方式可在涉及套接字的IO操作上设置超时方法&#xff1a; 1.调用alarm&#xff0c;它在指定超时期满时产生SIGALRM信号。此方法涉及信号处理&#xff0c;而信号处理在不同的实现上存在差异&#xff0c;且此方法可能干扰进程中已经执行过的alarm调用&#xff0c;可能使之前已…

【LLM系列之Tokenizer】如何科学地训练一个LLM分词器

1 背景与基础 1.1 为什么需要分词 对于人而言&#xff0c;在我们学会阅读之前&#xff0c;仍然可以理解语言。比如当你开始上学时&#xff0c;即使你不知道名词和动词之间的区别&#xff0c;但是你已经可以和你的同学交谈了&#xff0c;比如“我喜欢吃香蕉”&#xff0c;孩子…

vmware ubuntu突然无法联网的一种解决方案

记录一下vmware突然无法联网的一种解决方案。此法未必适用所有无法联网情形。Good Luck then. 今天使用vmware的ubuntu 18.04时&#xff0c;突然无法联网。Firefox在访问百度时显示“The proxy server is refusing connections”&#xff0c;随即检查了浏览器的proxy设置&#…

详解Jetpack Compose中的状态管理与使用

前言 引用一段官方描述&#xff0c;如下 由于 Compose 是声明式工具集&#xff0c;因此更新它的唯一方法是通过新参数调用同一可组合项。这些参数是界面状态的表现形式。每当状态更新时&#xff0c;都会发生重组。因此&#xff0c;TextField 不会像在基于 XML 的命令式视图中那…

头歌计算机组成原理实验—运算器设计(9)第9关:原码一位乘法器设计

第9关&#xff1a;原码一位乘法器设计 实验目的 学生掌握原码一位乘法运算的基本原理&#xff0c;熟练掌握 Logisim 寄存器电路的使用&#xff0c;能在 Logisim 平台中设计实现一个 8*8位的无符号数乘法器。 视频讲解 ####实验内容 在 alu.circ 文件中的原码一位乘法器子电…

分布式消息中间件RocketMQ概述

RocketMQ 概述 MQ概述 MQ简介 ​ MQ&#xff0c;Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件&#xff0c;是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据。一般消息的体量不会很大。 MQ用途 在网络上上可以查…

React学习笔记五-props

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第五篇&#xff0c;主要介绍react中的props。 目录 1.props的基本使用 2.props的批量传递 2.1展开运算符的复习 2.1.1数组中的展开运算符 2.1.2函数中的展开运算符 2.1.3构造字面…

部署图的画法

部署图画法 1.部署图 1.1含义 部署图是把软件制品装配到计算机节点以及配置软件环境的工作 软件部署包含环境部署和软件制品部署 1.2软件部署 软件部署通过部署图对软件进行建模 1.3部署图 部署图常见的有制品 节点 设备 运行环境和部署规范 1.4部署图关系 在UML&…