自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 I2C学习笔记——01 slv_mon_common、slv_mon、slv_agt

在没有收到end_flag结束和rs_flag重复启动情况,将SDA数据放入tmp_data[m],当m从9→0后将tmp_data[9:2]数据放入mon_data[j]中,tmp_data[1]检测返回的ACK、m重新为。②并行执行monitor_end(trans)函数 forever中等待一个SDA上升沿,如果此时SCL为高且start_flag=1(停止),mon.data给trans.data并清空,j=0恢复初始,end_flag=1;

2023-06-14 21:08:00 811

原创 I2C学习笔记——01 I2c_trans、I2C_if、(I2C_common、slv_drv_common、slv_drv)

mon_data[j][0]==0写:等待wait_data_hd_time,在没有收到end_flag结束和rs_flag重复启动情况,wait_data_hd_time,返回ACK,将SDA数据放入tmp_data[m],当m从8→0后将数据放入mon_data[j]中,m重新为8,j++,结束写;如在STANDARD_MODE模式下,将i2c_clk_high = cfg.scl_high_time_ss(在define中scl_high_time_ss约束为。

2023-06-13 16:55:32 1037

原创 I2C学习笔记——00apb_tb、mst_seq_lib、test(env、test_sequence、test)

body()中定义32位addr变量,调用base test中任务wait_reset_release、wait_cycles 和 调用get_rand_addr返回一个addr赋值给addr做单写,并存放mem[addr]=addr中;burst_transaction_sequence:例化burst_write_seq、burst_read_seq;body()中`uvm_do_with有约束的随机发送→get_response→将rsp返回的状态给trans_status;判断rsp返回的状态;

2023-06-05 22:10:35 726

原创 I2C学习笔记——00apb_slv侧 drv变化

将总线上prdata pslverr 置0、pready由cfg中SLAVE配置参数确定、将mem清空→drive_response()等待一上升沿,如果psel=1 penable=0(说明总线上有控制信号了)判断读写(如下),否则do idle(对于vif.cb_slv下prdata pslverr置0 pready cfg确定);写do_write(t):定义32位addr、data变量和两个存放cfg中随机pready次数pslverr状态的变量;任务run()、get_and_drive()、

2023-06-05 17:14:24 940

原创 I2C学习笔记——00apb_mst侧trans、drv、mon、sqr、agt

任务run()、get_and_drive()、drive_transfer(lvc_apb_transfer t)、reset_listener()、do_idle()、do_write(lvc_apb_transfer t)、do_read(lvc_apb_transfer t);run()→get_and_drive()→get_next_item、drive_transfer(req)中判断trans_kind读写(如下),克隆、id、itemdone→reset_listener()

2023-06-04 22:11:35 1211

原创 I2C学习笔记——I2C协议学习

通过I2C总线接口的可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。SCL 的低电平 SDA 变化, SCL 的高电平 SDA 保持,每个时钟周期发送一位数据。当总线上的主机都不驱动总线,总线进入空闲状态, SCL 和 SDA 都为高电平。,第一帧 发送头序列(11110XX0,XX 表示 10 位地址的高两位),第二帧发送低八位从机地址。串口,用的线很少,需要8个SCL周期才能将地址和RW位发送;(一个字节),用于指定主机通信的对象地址,在发送停止条件之前,指定的从机一直有效;

2023-06-03 21:12:26 899

原创 AHB-to-APB Bridge——09断言、覆盖率、

代码覆盖率(目标是DUT代码):对整个测试过程中被执行的代码的衡量,它能测量源代码中的哪些语句在测试中被执行,哪些语句尚未被执行。断言检查hresp_hready两个信号的关系:当想回应error时,hresp为高的同一个周期hready为高,且前一个周期hready为低;---------------断言检查写在testbench中或RTLcode中、或单独assert()括号中为1;----------------覆盖率:文件在env下func_cov.sv。功能覆盖率:判断有没有实现想要的功能点;

2023-05-30 20:23:41 1294

原创 AHB-to-APB Bridge——08burst_test(rdy、nrdy、slverr、tight)、地址

-------------burst_tight_transfer(紧密传输两个burst):基本相同,例化两个相同的burst_seq,再run_phase中先后使用,并先后分别判断传输数量后跳出循环;APB端地址总是一次加4,PSTRB信号代表了地址是高有效还是低有效,C为1100说明高有效,3为0011说明低有效;-------------------------------地址解读:32位一次传4字节,地址0、4、8、C变化;,HWORD传输,随机出来的32位数据只有高两个字节有效;

2023-05-28 23:28:29 958

原创 AHB-to-APB Bridge——07single_read32、mst_seqlib、slv_seqlib、single_write32_apb_slv_nrdy

ahbl_mst_seqlib.ahbl_mst_single_write32_seq中uvm_do_with:约束hsel=1、htrans=NSEQ、hsize=WORD、hburst=SINGLE、hwrite=1;apb_slv_seqlib.apb_slv_nrdy_seq中uvm_do_with:约束slverr=0(无错)、nready_num在1:5之间随机;在apb_slv_rdy_seq中uvm_do_with中约束slverr=0(无错)、nready_num=0(一直准备);

2023-05-26 15:41:38 445 1

原创 AHB-to-APB Bridge——06testbench、env、base_test、scb

两个fifo两个port,使用FIFO缓存数据,可以选择ahb、apb端都单个比较,或者ahb端打包发一整个pkt,apbfifo端获得同等数量后同时发出比较;run_phase中check_pkt中用port.get到apb、ahbl的tran后,将其中信号进行对比,有误报错并err_flag+1;在env中mon连接到了fifo的export;需要在scb中把fifo的export连到scb的port中;report_phase中收集整个仿真过程中uvm_error,为0成功 有error失败;

2023-05-24 22:56:45 1033

原创 AHB-to-APB Bridge——05ahbl_tran、ahlb_drv、ahlb_mon、ahlb_agt

如果在burst中间,则继续传输;然后如果 hsel 为高说明选中了这个模块 & htrans[1]为1 即NONSEQ=2'b10 SEQ=2'b11传输状态时,就把addr phase的各个信号采样到pkt里。如果ready为高,判断如果pkt里不是空的就把总线上的data送出去,并将pkt置空。在没有rst情况下,第一次判断dataphase为空,不发送data,然后判断addrphase也为空不发送addr;mon将burst传输过来的数据拆分一个一个传递到scb中,方便之后的比较,因为apb。

2023-05-21 18:07:11 1261

原创 AHB-to-APB Bridge——04apb_tran、apb_if、apb_drv、mem、apb_mon、apb_agt

apb_drv: 使用一个mem(32,32)存放数据,传递vif(之前在agent传递并连接drv、mon);在drive_one_t中根据tran中的nready_num测试没有准备好的状态;slv_tran的Read or Write,AHB-ram是在types文件里定义,这个在package里定义了。apb_agt: 如果is_active为1例化sqr、drv,否则只例化mon。mem:写入put进去 读出时判断是否存在写入过的地址。apb_if放入所有apb需要的信号,以及cb。

2023-05-19 21:59:56 877

原创 AHB-to-APB Bridge——03 阅读SPEC文档、设计测试用例

对于不需要高工作频率的系统,可以将RECISTER_RDATA参数写为0,以减少APB访问的延迟。默认情况下,将RECISTER RDATA参数设置为1。AHB频率快,APB频率慢,从AHB到APB频率是下降的,即sync-down==同步,但是频率不一致(有下降)----------------------------------------------------验证环境框图、设计测试用例。------------AHB to APB同步下降桥 AHB to APB sync-down bridge。

2023-05-17 22:04:29 1223

原创 AHB-to-APB Bridge——02 AHB协议、测试点分解

Master发送HADDR[31:0]到Decoder,根据各个Slave所需要地址宽度进行HSEL分配;----------------------------------测试点分解。

2023-05-17 16:23:57 809

原创 AHB-to-APB Bridge——01 APB协议

PSTRB一个写选通信号,用于在写数据总线上进行sparse data transfer(稀疏数据传输)。APB4用的比较少。两个cycle,第一个cyclePSEL为1,PENABLE为0,第二个cycle都为1,即为一次APB协议。PPROT一种保护信号,用于支持APB上的非安全交易和安全交易。PREADY是slave发送,拉低信号表示没准备好。PREADY就绪信号,指示APB传输已完成。增加了PPROT和PSTRB两个信号。错误信号,指示传输失败。

2023-05-16 17:08:55 521

原创 IC验证学习笔记(AHB-RAM)09覆盖率收集

DVE中RELODE。

2023-05-15 20:39:15 424

原创 IC验证学习笔记(AHB-RAM)08addr、bsize都随机,主要做地址偏移操作

为了防止出现覆盖,mem中存放的地址为写入地址的后两位取0,如195d和195e都在同一地址195c,但是具有不同偏移量。(先地址统一再进行偏移存放)地址统一为195c开始存放,后两位地址为1,则存放在15:8位,为0000。地址统一为195c开始存放,后两位地址为3,则存放在31:16位,为。地址统一为113c开始存放,后两位地址为0,则存放在15:0位,为。在16BIT中,如果addr[1]为0,则数据存放在mem的15:0位;在8BIT中,如果后两位地址为0,则数据存放在mem的7:0位;

2023-05-15 17:02:43 860 1

原创 IC验证学习笔记(AHB-RAM)07diff-hsize、diff-haddr、diff-reset-w2r测试

-----------------diff_haddr_virt_seq:相对于smoke_test把约束地址改为cfg.addr_start : cfg.addr_end。-----------------------建立rkv_ahbram_diff_hsize_virt_seq并添加到头文件。diff_addr_test与smoke_test类似,只是更换了virt_seq;做完vir_seq后建立diff_hsize_test与smoke_test相似。

2023-05-11 21:27:29 402

原创 IC验证学习笔记(AHB-RAM)06构建scoreboard

确定scoreboard接收data的地址范围,从tb可以看到DUT是16位,所以也最多接受16位。读:检查读过来地址的数据是否等于mem存放相同地址的数据,相等返回1,并添加计数。写:判断burst类型(SINGLE)再确定位宽并存入mem。创建32位无符号关联数组存放write数据。确定地址是否在范围内,再判断读写。

2023-05-10 22:58:20 550

原创 IC验证学习笔记(AHB-RAM)05优化时序、monitor构建

第一个周期从vif记录各种状态信号,第二周期记录读写数据 和write read同步。删除driver不必要的时序,使得时序更加紧凑。

2023-05-10 20:14:29 449

原创 IC验证学习笔记(AHB-RAM)04 Sequence架构的建立

rkv_ahbram_single_write_seq里面将底层vip的master_single_trans例化其中,通过·uvm_do_on_with通过Virtual seqr(p_sequencer)挂载到vip的master_sqr上!---------------------------------------在顶层seq_lib下建立elem_seqs文件夹(搭建激励的架子)-------------------------------------建立vip的sequence_lib。

2023-05-09 22:28:06 564

原创 IC验证学习笔记(AHB-RAM)03更新ahb_driver

父类get and drive的drive_transfer在master_driver中实现。先判断传输类型(只有SINGLE),再判断read或write实现对应读写任务。

2023-05-08 17:37:36 614 1

原创 IC验证学习笔记(手撕代码)-7异步复位同步释放

目的:在这个rst=0时不处理,在rst=1时,延迟两个clk上升沿后才rstout置1.(使用非阻塞赋值方法,在块结束后才进行赋值)如:相当于两个q触发器。问题:当rst_n的信号重新回到1的时间和clk上升沿到来的信号非常接近的时候,DFF可能会输出亚稳态,造成信号无法识别是1还是0。假如一个DFF的复位值是0,那么rst_n=0的信号到来时,该DFF进行复位,当rst_n=1的信号到来时,该DFF正常工作。

2023-05-07 22:58:32 179

原创 IC验证学习笔记(AHB-RAM)02扩充vif和与DUT连接、更新transaction

---------------------------------------扩充driver先完善trans------------------------------------补充上DUT与vif在tb中的连接、时钟、复位信号:clk在tb中做,rstn在ahbram_if中做。rstn复位信号从ahbram_if中给出:rstn的task没有放tb里面做,方便以后的调用。defines文件:定义vif中需要的宏。根据AHB协议,完善types文件。

2023-05-07 20:32:25 656

原创 IC验证学习笔记(AHB-RAM)01搭建顶层环境框架以及内部 agent完善

----------------顶层创建rkv_ahbram_base_virtual_sequence、rkv_ahbram_smoke_virt_seq、rkv_ahbram_seq_lib。----------------env、virtual sequencer、scoreboard、顶层config、covergroup、subscriber。-------------------顶层base test 和smoke test。两个test文件存到tests文件里。

2023-05-06 22:39:09 1016

原创 IC验证学习笔记(手撕代码)-6饮料机

使用Verilog设计电路,完成以下功能:每瓶饮料1.5元,一次只能投入一个硬币,可投入0.5与1.0两种硬币,具有找零功能。分别设置两个输入(五毛、一块)和两个输出(出饮料、找零)s3:饮料机中的余额为1.5元(输出饮料,不找零)IDLE:复位状态,表示饮料机中的余额为0元。s4:饮料集中的余额为2元(输出饮料,找零)testbench 五毛一块只有一个为1。这个手撕代码应该用状态机来完成。s1:饮料机的余额为0.5元。s2:饮料机中的余额为1元。

2023-05-05 21:10:22 190

原创 IC验证学习笔记(AHB-RAM)00基本框架

include "uvm_macros.svh" 这两行。`ifndef ·define ·endif作用是防止重复调用文件(大写)package都要加 import uvm_pkg::*;目的是开发AHB master agent。PACKAGE:包含各个文件。先构建起各部分的框架。

2023-05-05 20:03:07 560

原创 IC验证学习笔记(手撕代码)-5模三检测器

4、当前余数为1,后续输入1,整体扩大2倍+1,次态余数为2*1+1=3可以被整除,次态余数为0;1、当前能被3整除,余数为0。后续输入1,整体扩大2倍+1,所以次态余数为2*0+1=1;2、当前能被3整除,余数为0。后续输入0,整体扩大2倍,依然能整除,次态余数为2*0=0;6、当前余数为2,后续输入1,次态余数2*2+1=5,除3后次态余数为2;3、当前余数为1,后续输入0,整体扩大2倍,所以次态余数为2*1=2;5、当前余数为2,后续输入0,次态余数2*2=4,除3后次态余数为1;

2023-04-28 16:36:57 195

原创 IC验证学习笔记(手撕代码)-4序列检测器(状态机)

要每个周期给seq随机化一个值。

2023-04-27 22:55:30 293

原创 IC验证学习笔记(手撕代码)-3.1用verilog实现3.5分频电路

posedge_clk:在0、1翻转 negedge_clk:在3、4翻转 然后或操作。

2023-04-27 21:38:25 193

原创 IC验证学习笔记(MCDF)UVM实验5

用来例化和配置reg中各个field是一个class,各个子类继承于它。子类(控制寄存器+只读寄存器)在完成field的声明后需要new函数和build函数(例化与配置都在build中)一个class包含了map,rgm和mem完成rgm到硬件reg的桥接,将reg_item转换成总线UVC需要的信息bus_seq_item,再由总线给到硬件reg。

2023-04-25 20:47:04 237

原创 IC验证学习笔记(MCDF)UVM实验4-virtual sequencer

移除原有在各个driver中的mailbox句柄,以及在任务中使用mailbox句柄通信的方式,转而用进行通信,同时定义对应的。在do_drive()中将原来用mailbox通信的方式改为PORT通信。通过driver的seq_item_port端口调用get_next_item(req)获取req,由sequence的函数set_sequence_id设置id,所用id为req这个item调用get_sequence_id得到的;最后返回rsp。

2023-04-25 20:41:27 323

原创 IC验证学习笔记(MCDF)UVM实验3b-TLM通信管道、回调函数

引入原因:consumer在没有分析transaction时,希望先存储到本地FIFO中,稍后使用TLM FIFO uvm_tlm_fifo类是一个新组件,继承于uvm_componnet类,预先内置了多个端口以及实现了多个对应方法,用户无需自己实现这些方法,同时又能够享受TLM端口的好处。(注意,uvm_tlm_fifo只是声明了这些端口,当我们要使用的时候还是要例化的)内置了一个没有尺寸限制的mailbox#(T),用来存储数据类型T。

2023-04-25 20:35:13 192

原创 IC验证学习笔记(MCDF)UVM实验3-TLM单向、多向通信

注意,只有端口类型为imp(也就是imp类型只能是target)的才需要通过端口宏声明来解决方法名冲突的问题,而port则不需要关注方法名字,直接还用put就行。也就是initiator一端不用去关心谁会和它连接,和它连接的有几个端口,只需要正常声明、例化端口即可,方法名用put/get/peek就行,不需要加后缀。假设我们在initiator这边的端口也将方法名设置为put_p1等有后缀的,那么一来会报错,二来下次你连接的target只要一个端口,那么你到时又需要修改。降低组件和环境的耦合度。

2023-04-25 20:26:35 160

原创 IC验证学习笔记(MCDF)UVM实验2b-测试的开始与结束

在UVM中,将对象的例化放置在build_phase中,而将对象的连接放置在connect_phase中。仅修改了TB与mcdf_env之间的接口传递,其实可以移除所有的set_interface()函数,完全使用uvm_config_db的set和get方法,从而使得mcdf_env与其各个子组件之间也实现“层次剥离”,这样也就进一步促进了组件之间的独立性。而实际上,uvm中组件的例化是在run_test()中(因为run_test会执行所有的phase,包括build_phase),所以不行。

2023-04-25 20:17:02 700

原创 IC验证学习笔记(MCDF)UVM实验2-验证组件的变为UVM、

在使用上述工厂注册宏的时候,会伴随着“域声明自动化”,一般而言,将sequence item类定义时,应当伴随着域声明,即利用'uvm_object_utils_begin和'uvm_object_utils_end完成。do_driver()方法里面void'($cast(rsp, req.clone())),是因为UVM核心基类的克隆方法返回的是uvm_object类型,所以需要把父类的句柄转换为子类的句柄,而req.clone()这个父类句柄指向的是一个子类的对象,所以能转换成功。

2023-04-25 20:04:40 160

原创 IC验证学习笔记(MCDF)UVM实验1b-域的自动化、Phase机制、config机制

今后会参与到的对象拷贝、克隆、打印等操作的成员变量注册的时候顺便声明,就可以直接使用uvm_object预定义的一些方法。

2023-04-25 19:30:43 261

原创 IC验证学习笔记(MCDF)UVM实验1-工厂机制

uvm_component常见的组件有:uvm_driver、uvm_monitor、uvm_sequencer、uvm_agent、uvm_scoreboard、uvm_env、uvm_test,凡是继承他们的组件都需要用 uvm_component_utils()进行注册;除了上述提到的组件外,几乎所有的类都派生自uvm_object,常见的有uvm_sequence_item、uvm_sequence、config等。若有多层覆盖时,最终覆盖的类必须是最初被覆盖类的子类;需要用工厂机制来创建;

2023-04-25 19:18:58 339

原创 IC验证学习笔记(MCDF)UVM实验0

时,我们不需要独立编译uvm_pkg,因为已经提前帮我们编译好了。但如果我们使用的是其他仿真器,比如VCS时,就需要独立编译一下uvm_pkg。无论在什么地方,UVM验证顶层都必须有这两行代码,代表着预编译的UVM库(包括UVM开源库和Questa的UVM定制部分库)。而uvm_pkg是UVM库的预编译库,很庞大,包括了uvm_factory、uvm_config_db、各种phase等。uvm_macros.svh是包含了众多宏定义的头文件,将其include进来可以让宏定义识别成功,否则编译时会报错;

2023-04-24 22:56:09 305

原创 IC验证学习笔记(MCDF)实验5-覆盖率

在编译过程中,需要对于设计相关的文件设置额外的覆盖率编译选项,目的是通过工具自动统计你选中的代码覆盖率类型(功能覆盖率的收集需要写额外的代码)。注意,我们的关注点在于执行了设计中的多少代码,而不是测试平台,所以不需要对测试相关的文件进行覆盖率编译选项的设置。1、只选中与设计相关的文件2、点击右键,选择compile->compile properties,在弹出设置栏的coverage一栏中,如图选择以下选项,然后点击OK。3、完成所有文件的编译“Compile All”。

2023-04-24 22:33:18 741 1

空空如也

空空如也

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

TA关注的人

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