自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 浅谈svlib (Str)

Systemverilog 中定义了string 类型,常见的默认的方法有len()getc()putctoupper()tolower()compare()substr()这些方法可以满足日常很多的应用,但是相对于perl,python,systemverilog 内建的string 方法比较少,同时缺少regular expresssion等常见的应用方法。因此我们可以在systemverilog lib的基础上开发自己的string方法,这里我们介绍svlib这个开源libs

2020-11-28 15:44:19 1227

原创 SV中系统常见的I/O方法以及bit vector 操作方法

$fopen(file_name,operation_type): 打开文件句柄$ftell(file_handle) :获取当前文件的位置信息(这个位置信息指得是操作到文件那个字节了)$fseek(file_handle,offset,base):重定向文件操作的位置,base+offset等于文件中具体字节位置$fscanf(file_handle," string format",args):读取file,按照string format的形式读,并将值赋值给argsmodule..

2020-09-23 15:44:41 1694

原创 浅谈UVM/SV中的进程管理

在System Verilog中 initial/always/task/function/fork 等都会产生进程,产生的过程是自动产生的(process),用户不可以手动的产生process,但是可以引用已经存在的进程句柄,从而实现进程的管理,在SV中 ,定义了class process ...

2020-09-04 20:35:42 3104

原创 UVM之uvm_callback详解

在DV中,我们可以使用factory,override机制来实现方法的重载,继而修改现有类的方法和属性。想象一下下面的一个应用场景,driver从sequencer拿到transaction,需要根据一些条件进行一些特殊处理才可以驱动到interface上,而现有的环境没有做这方面的处理。这个时候我们可以重载这个类,修改这个方法(用户的角度),但是TB开发人员(有时候不是用户),比如VIP开发的时候,开发人员可能无法穷经所有的情况,或者锁着项目的迭代,出现了一些新的特性,在TB中使用回调函数变成了一种可选项

2020-07-29 20:52:28 4047 1

原创 UVM中寄存器模型中的高级用法->参数uvm_object extension的用处

在write方法中有一个参数uvm_object extension。这个参数我们在之前一般不会去关注,在调用adapter时,reg2bus,方法reg2bus的只能接受一些通用参数,比如addr,data,access等,但是在一些特殊寄存器访问时,我们在driver中不仅要在同一个driver中驱动bus总线,还要驱动别的信号(类bus信号),这个时候参数extension就有了用处。在调用...

2020-07-19 10:13:32 2606 1

原创 UVM中(TB 环境)不同组件参数类型的要求

本文的目的在于总结,总结在应用中可以不注意的点,导致出现意想不到的错误,下面暂时给出下面几条总结(1)TLM 端口的参数类型必须一致才可以试下连接,两边类型不一样,即使是一边是parent_class,一边是child_class,发生连接时也会报错(2)sequencer和driver的参数类型必须一致,本质上是TLM端口的连接(3)sequence和sequencer的参数类型可以出现不一致的情况,但是要满足parent_class,child_class的关系,因为在sequencer中将se

2020-06-20 17:13:43 837

原创 uvm_mem模型(2)

这里介绍mem模型的常用方法,write,readburst_write,burst_readclass my_mem extends uvm_mem; function new (strng name); super.new(name,1024,32,"RW"); endfunctionendclassclass my_blk extends uvm_reg_block; my_mem mem_clent; uvm_reg_map my_map;

2020-06-04 20:07:42 1795

原创 uvm_mem 模型 (1)

class my_mem extends uvm_mem; function new (strng name); super.new(name,1024,32,"RW"); endfunctionendclassclass my_blk extends uvm_reg_block; my_mem mem_clent; uvm_reg_map my_map; function build(); mem_clent=my_mem::typ

2020-06-04 19:39:05 2611

原创 UVM RAL 中的显示预测 uvm_reg_predictor

在之前简单介绍了uvm_reg_predict是怎么实现显示预测的,连上map,连上adapter,连上bus_in即可,下面我们要详细的解释原因先解释uvm_reg_predict中重要变量的作用uvm_reg_map map : 从bus总线上上采样到addr信息之后,有map根据addr寻找到RAL中相关寄存器句柄uvm_reg_adapter adapter:从bus总线上上采样到addr信息之后,调用adapter.bust2reg实现transaction 转换uvm_analysis

2020-06-01 19:48:07 2433

原创 UVM RAL uvm_reg_map.get_reg_by_offset

在UVM寄存器模型中,调用uvm_reg_block::lock_model完成整个RAL模型的生成,整个时候整个寄存器scope的地址也已经生成了,比如有下面的层次化结构 reg_blk.reg1。向写寄存器reg1,可以调用reg_blk.reg1,write()方法。那还存在别的友好的方法开获取RAL模型中某个寄存器的句柄吗,毕竟如果整个RAL模型存在上百个寄存器,记住某个寄存器的句柄还是比较困难的。下面我们来介绍uvm_reg_map.get_reg_by_offset开获取寄存器句柄在lock

2020-06-01 17:31:01 2181

原创 使用python自动化生成TB 中 interface

开始:

2020-05-25 19:41:11 644

原创 Systemverilog中时间单位以及相关系统函数

在Systemverilog中有一些与时间相关的系统函数在TB打印log的时候会使用到,在打印log时间的时候,如果与我们预期的不一致,可以在这方面找原因。下面列出相关的系统函数$time$stime$realtime`timescale$printtimescale$time: 返回module 64bit 整数时间单位,这里的时间单位做一下说明,比如 `timescale 10ns/1ns , 时间单位就是10ns`timescale 10ns/1nsmodule test;

2020-05-16 15:42:23 13176 1

原创 SV 中宏的使用

在SV中,养成使用宏的习惯可以大大提高code 的可阅读性,让我们从简单重复的工作中脱离出来,聚焦技术方法本身或者硬件的理解上,可以有效的提高我们的验证效率。在我们验证的过程或多或少的会遇到在TB/test中使用宏的方法,当然我们是看的懂的,但是我们一定要思考这个TB、test为什么要这么写,有什么好处,如果让我们自己开搭建的话,我们会思考使用这种方法吗,而不能仅仅停留在看的懂,会用的level,毕竟这个是可以成为我们的核心技能的。下面我们给个实际的工程例子class base_test extend

2020-05-16 10:04:20 1292

原创 C++/C testbench中getenv和setenv的使用

验证环境中,尤其是复杂SOC level ,chip level,这些与硬件联系非常紧密的依旧的应用场景中(主要是通过跑 CPU instruction),C、C++依旧有大显身手的地方。在TB中或者testcase中,会根据不同的args(一些重要的,与debug相关的args),来打印不同的log,比如在debug的时候,我们需要将c_model 以及DUT执行的instruction打印下来,进行debug,这里介绍工作中的一种方法,getenv和setenvchar *instruct

2020-05-09 19:05:57 531

原创 UVM中通过宏启动sequence 的弊端

在UVM中启动sequence的方法主要有两种,一种是start的方法,一种是通过宏,比如`uvm_do。我们推荐在使用UVM的过程中尽量不要使用宏来启动sequence,而是使用start,因为使用宏的方法有一些意想不到的弊端,会给我们带来意想不到的惊喜,一旦出现问题,会给debug调试带来困难。下面我们讲解一下使用宏启动sequence有什么样的弊端。在UVM中经常有一个顶层virtual ...

2020-04-27 19:31:43 874

转载 UVM 代码生成器 easier UVM

转自:http://www.eetop.cn/blog/html/28/1561828-3571704.htmlUVM大大提高了我们开发验证平台的效率。但同时,熟练掌握UVM搭建验证平台也并不是一件容易的事情。同时由于不同验证工程师搭建环境的风格不太一致,所以在一个项目中常会出现不好管理,甚至前后不一相互矛盾的UVM代码。对于这些问题UVM 代码生成器基本都可以解决,更为关键的是,这对...

2020-04-18 08:24:59 2234

原创 C、C++中位字段,结构体以及联合(union)的实际使用

在验证的过程了,经常遇到C的testcase,C在定义寄存器的时候通常会使用struct 的位字段来实现,比如定义下面一个寄存器typedef struct reg{ unsigned int field0: 8; unsigned int field1: 8; unsigned i...

2020-04-17 17:46:01 685

原创 UVM sequence机制(4)(response 特性)

这篇我们介绍一下sequence 机制的response 属性。/////sequence1class sequence1 extends uvm_sequence;........................................................virtual task body(); item1 req1; item1 ...

2020-03-22 13:11:17 2453 1

原创 UVM sequence机制(3)(sequence的仲裁2)

这篇主要介绍仲裁算法的使用,sequence在发送item的过程中,sequencer使用别的仲裁算法,在UVM中仲裁算法有下面这几种typedef enum{ UVM_SEQ_ARB_FIFO, UVM_SEQ_ARB_WEIGHTED, UVM_SEQ_ARB_RANDOM, UVM_SEQ_ARB_STRICT_FIFO, UVM_SEQ_ARB_STRICT_RAN...

2020-03-22 12:08:40 583

原创 UVM sequence机制(2)(sequence的仲裁1)

这篇我们介绍一下多个sequence同时挂载到sequencer上的情形在上一篇博客中有讲到,在sequencer中有下面几个重要的变量arb_sequence_q[$]中存放每一次sequence发送的请求bit arb_complete[int]中存放仲裁结果(那个sequence 的请求获得了胜利)/////sequence1class sequence1 extends uvm...

2020-03-21 16:13:23 499 1

原创 UVM sequence机制(1)

sequence机制时UVM的核心机制,主要作用的是发送transaction以及对transaction的控制,下面将会重点介绍item transaction是如何从sequence传入到driver的。在这里,我们暂时不会介绍start方法的使用,主要还是item如何从sequence传入到driver的。首先在sequence中负责发送item的方法是start_item和finish...

2020-03-21 14:49:55 1582

原创 UVM配置之resource机制(2)

这部分我们将要详细介绍uvm_config_db机制时如何解决uvm_resource_db机制带来的弊端的首先我们来看看uvm_config_db是如何工作的,两个核心方法set和getpackage UVM_cmd; import uvm_pkg::*' `include "uvm_macros.svh" class unit_agent extends ...

2020-03-15 12:28:48 893

原创 UVM配置之resource机制(1)

UVM为什么会迅速成为业内标准(已经是IEEE的标准),在于UVM的TB的可复用性,用户友好性。想象一下下面的一个应用场景,我们在搭建TB时,某些case run起来的时候需要配置某些参数,在TB中利用SV的系统函数来获取相应的参数来配置某些特定的应用场景,这样做在现在看来又两处不友好的地方,首先在run的时候需要命令行加入参数,其次如果在环境集成的时候,同样的子TB需要两个来构成上一层的环境...

2020-03-15 09:52:48 3559 2

原创 uvm_object的常见操作print,copy,compare,pack,unpack

在uvm_object中封装了非常有用的方法,主要是print,copy,compare,pack,unpack,下面我们来说明一下print:打印package UVM_cmd; import uvm_pkg::*' `include "uvm_macros.svh" class obj extends uvm_object; int a; ...

2020-01-03 17:05:21 4923

原创 UVM field automation

field automation机制在UVM中非常重要,主要是牵扯到打印,比较,复制,打包以及解包等操作。看下面一段代码package UVM_cmd; import uvm_pkg::*' `include "uvm_macros.svh" class obj extends uvm_object; int a; `uvm_object_u...

2020-01-03 16:25:26 1533

原创 UVM phase机制(三)objection机制

在上一篇博客UVM phase机制(二)中,我们有介绍到run_phase以及12个run_time_phase是如何运转起来的,但是留了一个小问题就是objection,想要run必须raise_objection,要想结束run必须drop_objection。下面我们详细分析一下为什么会这样在运行到run_node的时候,是这样一个执行结构,fork fork ...

2019-12-30 15:36:46 6967

原创 UVM phase机制(二)

UVM中所有的phase是按照一定的顺序执行的,那么UVM是如何组织的?下面我们详细说明一下。首先在phase运行之前已经生成了完整的common domain,这个common domain中的node就是执行的顺序。牵扯到的核心函数是task uvm_phase::m_run_phases(); uvm_root top = uvm_root::get(); // initi...

2019-12-30 11:11:42 1034

原创 UVM phase机制(一)

UVM的执行严格按照phase机制在执行的,顺序是:->build_phase->connect_phase->end_of_elaboration_phase->start_of_simulation_phase->run_phase->extract_phase->check_phase->report_phase->fi...

2019-12-29 15:13:30 2860

原创 寄存器模型中的预测机制

在操作UVM寄存器模型时,模型中mirror值是如何更新的呢,在RAL机制中,有两种方式可以实现mirror值得更新。(1)自动预测:所有的后门访问均是自动预测,对于前门访问,需要在map中进行设置map.set_auto_predict(1);这个时候,前门访问之后,会调用do_predict进行预测(2)显示预测自动预测有弊端,如果在系统中,一组寄存器除了可以总线驱动之外,也可以使...

2019-12-18 15:29:50 1300 2

原创 寄存器(RAL)模型中的lock

在使用寄存器UVM寄存器模型的时候,当整个模型建立完成以后,必须在root block中调用lock_model,这样整个模型才算建立完整,那么为什么要这么做呢,因为我们在建立模型的时候所有寄存器的地址均是相对地址,在进行前门访问,是以绝对地址进行的,因此lock_model帮助我们得到所有寄存器的绝对地址。 extern virtual function void lock_model();...

2019-12-17 11:25:55 1476

原创 寄存器(RAL)模型中的后门操作路径

我们在进行寄存器模型的后门操作时,必须提前设置后门操作路径,以此RAL模型方能进行操作。``在上面这个RAL 模型中,当调用reg_blk.reg1.write(*),参数指定是后门操作(UVM_BACKDOOR),那么RAL模型时如何取得硬件rtl的绝对路径?核心的方法是调用reg::get_full_hdl_path,下面来讨论一下首先要得到这个reg所在block的路径,设置bloc...

2019-12-16 18:17:42 5234

原创 寄存器(RAL)模型中的predict操作

在寄存器模型中,比如读写操作,我们是怎么进行预测的,也就是说怎么更新field的3个值得,即value,mirror_value,desired_value。核心方法是do_predict。我们发现在后门访问时,会自动调用do_predict方法进行预测,而在前门访问时,是否会进行预测是有条件的,必须得设置map.set_auto_predict。只有设置了map的自动预测功能才可以在执行完前门读...

2019-12-15 16:24:42 3176

原创 寄存器(RAL)模型中的mirror实现读操作

在寄存器读操作中,除了了使用read方法,peek方法,还可以使用mirror方法,mirror方法最大的好处可以进行check,也就是说如果read的值value与RAL中的现有的镜像值不一致的话,可以报出相应的信息。task uvm_reg::mirror(output uvm_status_e status, input uvm_ch...

2019-12-15 16:01:46 3211

原创 寄存器(RAL)模型中的peek方法

我们在进行寄存器读操作时,除了使用read方法,还可以使用peek方法,peek方法与read方法不同之处在于(1)read方法支持前门/后门访问,但是peek方法仅仅支持后门访问,(2)read方法会根据field的实际access policy进行read操作,但是peek方法不会case这些,相当于force的方式。task uvm_reg::peek(output uvm_status_...

2019-12-15 08:58:37 1570

原创 寄存器(RAL)模型中的set update实现写操作

我们在进行寄存器写操作时,除了使用write方法,还可以使用poke方法,poke方法与write方法不同之处在于(1)write方法支持前门/后门访问,但是poke方法仅仅支持后门方法,(2)write方法会根据field的实际access policy进行write操作,但是poke方法不会case这些,相当于force的方式。task uvm_reg::poke(output uvm_st...

2019-12-15 08:52:33 2408

原创 寄存器(RAL)模型中的read方法

在使用UVM寄存器模型时,当对寄存器进行读操作时,有很多种方法,这里介绍最常用的方法:假设已经生成了一个uvm_reg_block模型,名字时reg_blk,在模型中有一个寄存器名字叫reg1。并且reg1添加到了名字是map1的uvm_reg_map中在这里插入代码片下面来讲解一下寄存器模型是如何完成read操作的 extern virtual task read(output uv...

2019-12-14 15:01:39 3351

原创 寄存器(RAL)模型中的write方法

在使用UVM寄存器模型时,当对寄存器进行写操作时,有很多种方法,这里介绍最常用的方法:假设已经生成了一个uvm_reg_block模型,名字时reg_blk,在模型中有一个寄存器名字叫reg1。并且reg1添加到了名字是map1的uvm_reg_map中下面来讲解一下寄存器模型时如何完成write操作的 extern virtual task write(output uvm_stat...

2019-12-14 14:36:54 4474

转载 VCS option

转自 https://blog.csdn.net/bcs_01/article/details/79803304 ...

2019-12-13 15:21:53 2860

转载 VCS 选项

转自https://blog.csdn.net/wonder_coole/article/details/79618696VCS/VCSMX 一般仿真步骤VCS仿真可以分成两步法或三步法, 对Mix language, 必须用三步法。仿真前要配置好synopsys_sim.setup文件,里边有lib mapping等信息。设置环境变量’setenv SYNOPSYS_SIM_SETUP /x...

2019-12-13 15:18:37 1557

原创 VCS中coverage常用的选项

在IC验证的过程中,使用VCS来统计覆盖率,下面简单介绍一下compile optionVCS -cm code_coverage_optionrun option./simv -cm code_coverage_option -cm_name name -cm_dir cov_dir其中(1)-cm的作用是说要统计代码覆盖率(2)-cm_na...

2019-12-13 15:01:39 2836

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除