《SystemVerilog验证测试平台编写指南》学习笔记——回调

一、回调

如何创建一个可以不做任何更改就能在所有测试中使用的验证环境?
要做到这一点的关键就是测试平台必须提供一个“钩子”,以便测试程序在不修改原始类的情况下注入新的代码

驱动器的作用:

  • 注入错误
  • 放弃事务
  • 延迟事务
  • 将本事务跟其他事务同步
  • 将事务放进记分板
  • 收集功能覆盖数据

与其试图预测所有可能的错误、延迟或者事务流程中的干扰,不如使用回调的方法,这时驱动器仅需要回调一个在顶层测试中定义的子程序。这种回调子程序可以在每个测试中做不同的定义,这样测试就可以使用回调来为驱动器增加新的功能而不用编辑Driver类。
在这里插入图片描述

二、创建一个回调任务

一个回调任务应该在顶层测试创建,在环境中的最低级即驱动器中调用

回调基类

virtual class Driver_cbs;		//驱动器回调
	virtual task pre_tx(ref Transaction tr, ref bit drop);		//默认情况下回调不做任何动作
	endtask

	virtual task post_tx(ref Transaction tr);					//默认情况下回调不做任何动作
	endtask
endclass

使用回调的驱动器类

class Driver;
	Driver_cbs cbs[$]

	task run();
		bit drop;
		Transaction tr;

		forever begin
			drop = 0;
			agt2drv.get(tr);
			foreach(cbs[i]) cbs[i].pre_tx(tr,drop);
				if(!drop) continue;
				transmit(tr);
			foreach(cbs[i]) cbs[i].post_tx(tr,drop);
		end
	endtask
endclass	

三、使用回调来注入干扰

回调可以用来注入干扰,例如引起一个错误或延迟。回调也可以用来向记分板发送数据或者收集功能覆盖率数据。

使用回调进行错误注入

class Driver_cbs_drop extends Driver_cbs;
	virtual task pre_tx(ref Transaction tr, ref bit drop);
		//每100个事务中随机丢弃一个
		drop = ($urandom_range(0,99) == 0);
	endtask
endclass

program automatic test;
	Environment env;
	initial begin
		env.new();
		env.gen_cfg();
		env.build();

		begin		//创建错误注入的回调任务
			Driver_cbs_drop dcd = new();
			env.drv.cbs.push_back(dcd);		//放入驱动器队列
		end

		env.run();
		env.wrap_up();
	end
endprogram

四、记分板

记分板的设计取决于待测设计DUT。

使用原子事务的简单记分板

/*
这个记分板,它将事务存储在一个期望值队列中,
第一个方法用来保存一个期望的事务,
第二个方法尝试找出与测试平台接收到的实际事务相匹配的期望事务,
可能会得到0个匹配,1个匹配或者多个匹配。
*/
class Scoreboard;
	Transaction scb[$];		//保存期望的事务的队列

	function void save_expect(input Transaction tr);
		scb.push_bask(tr);
	endfunction

	function void compare_actual(input Transaction tr);
		int q[$];
		q = scb.find_index(x) with (x.src == tr.src);
		case(q.size())
			0: $display("No match found");
			1: scb.delete(q[0]);
			default:
				$display("Error,multiple matches found!");
		endcase
	endfunction : compare_actual
endclass : Scoreborad

五、与使用回调的记分板进行连接

记分板使用回调

class Driver_cbs_scoreboard extends Driver_cbs;
	Scoreboard scb;
	
	virtual task pre_tx(ref Transaction tr, ref bit drop);
		scb.save_expect(tr);		//将事务放入记分板
	endtask

	function new(input Scoreboard scb)
		this.scb = scb;
	endfunction
endclass

program automatic test;
	Environment env;

	initial begin
		env.new();
		env.gen_cfg();
		env.build();

		begin		//创建scb回调
			Driver_cbs_scoreboard dcs = new(env.scb);
			env.drv.cbs.push_back(dcs);		//放入驱动器队列
		end
		
		env.run();
		env.wrap_up();
	end
endprogram	

应该总是为记分板和功能覆盖使用回调。事务监测器可以使用一个回调来比较接受到的事务和期待的事务,监视器回调也非常适合用来收集DUT实际发送事务的功能覆盖数据。

六、使用回调来调试事务处理器

如果一个使用回调的事务处理器没有按照预期工作,可以使用另外一个回调来调试它,可以通过增加一个显示事务内容的回调。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装:类 209 5.1 概述 209 5.2 类的成员 233 5.3 类的继承 245 三种类型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率类型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 类型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的类 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值