1.虚接口(virtual interface)

1.1为什么引入虚接口?

我们知道,通过引入interface可以简化模块儿之间的连接,即interface是连接硬件的,其是硬件语言;但对于验证来说,其描述语言往往是软件语言,interface无法在基于OOP的测试平台中实例化,因此我们无法通过interface把激励传送到DUT中;为了解决这个问题,引入了virtual interface,使得基于OOP的验证环境可以通过虚接口把激励传送给DUT。

1.2虚接口如何实现测试平台与DUT的连接?

virtual interface的本质是指向interface的指针,因此其并不是一个真实存在的实体,而interface是一个真实存在的实体;基于OOP的测试平台会通过调用virtual interface来间接操作实际的信号。

1.3示例

现有如下RTL代码,要求搭建一个简单的测试平台:

module counter(input clk,resetn,input [3:0] load_value,input load_valid,output reg [3:0] q);always@(posedge clk or negedge resetn)beginif(!resetn)q<=4d0;else if(load_valid)q<=load_value;elseq<=q+4'd1; end
endmodule

首先创建一个interface简化与DUT的连接:

interface counter_if(input logic clk);logic load_valid;logic [3:0] load_value;
endinterface

其次创建一个transaction用来生成随机激励:

class transaction;//用rand来生成随机化激励rand logic load_valid;rand logic [3:0] load_value;
endclass

然后创建一个driver来驱动激励到DUT上:

class driver;virtual counter_if vif;//生成一个virtual interface句柄function new(input virtual counter_if vif);//该new函数用来使虚接口句柄指向interfacethis.vif=vifendfunctiontransaction tr;task run(int n);//产生n次激励for(int i=0;i<n;i++)begintr=new;assert(tr.randomize());//$display("tr.load_valid=%0d,tr.load_value=%0d",tr.load_valid,tr.load_value);@(posedge vif.clk)begin//在clk上升沿,通过虚接口将transaction中的随机激励传送到interface上vif.load_valid<=tr.load_valid;vif.load_value<=tr.load_value;endendendtask
endclass

最后创建top文件,用来将以上文件整合:

module tb_top;logic clk,rstn;logic[3:0]q;counter_if dutif(clk);//实例化interfacedriver my_driver;//声明句柄counter u_counter(.resetn(rstn),.clk(clk),.load_valid(dutif.load_valid),.load_value(dutif.load_value),.q(out));//实例化DUTinitial beginmy_driver=new(dutif)//实例化驱动,使虚接口句柄指向interfacerepeat(2) @(posedge clk);@(posedge rstn);repeat(5) @(posedge clk);my_driver.run(20);//产生20次随机激励endinitial beign//生成T=10的时钟clk=1'b0;forever #5 clk=~clk;endinitial begin//复位信号的生成rstn=1;repeat(2) @(posedge clk);rstn=0;repeat(5) @(posedge clk);rstn=1;repeat(50) @(posedge clk);$finish;endendmodule

仿真结果:

System Verilog学习笔记—虚接口(virtual interface)相关推荐

  1. typescript学习笔记1 —— 接口(interface)

    typescript是微软出品的,javascript的超集.让javascript的写法很类似java,核心功能是让JavaScript这个弱类型的语言,增加类型检查,更适合编写企业级应用.之前的a ...

  2. System Verilog学习笔记—接口interface

    目录 0.interface的直观理解 1.使用端口的TB与DUT通信 2.使用接口的TB与DUT通信 3.使用modport将interface中的信号分组 4.接口中的clocking block ...

  3. TypeScript学习笔记之 接口(Interface)

    在java中,接口是用来定义一些规范,使用这些接口,就必须实现接口中的方法,而且接口中的属性必须是常量. javascript中是没有接口的概念的.所以TypeScript在编译成 JavaScrip ...

  4. System Verilog学习笔记—fork...join_xxx的三种用法及wait fork和disable fork

    目录 0.前言 1.fork...join 2.fork...join_any 3.fork...join_none 4.其它线程执行语句 4.1wait fork 4.2 disable fork ...

  5. System Verilog学习笔记—随机化约束的控制

    目录 1.控制多个约束块儿constraint_mode() 2.控制随机变量 2.1 rand_mode() 2.2 randomize() with {} 2.3 randomize单独控制变量 ...

  6. System Verilog学习笔记—随机化约束种类

    1.为什么引入随机化? 芯片体积增大,复杂度日渐提高,定向测试已经无法满足验证的需求,而随机测试的比例逐渐提高 定向测试能找到你认为可能存在的缺陷,而随机测试可以找到连你都没有想到的缺陷 随机测试的环 ...

  7. system generator学习笔记【02】

    作者:桂. 时间:2018-05-20  23:28:04 链接:https://www.cnblogs.com/xingshansi/p/9059668.html 前言 继续学习sysgen.接触s ...

  8. Verilog学习笔记-——Verilog模块例化

    Verilog学习笔记---Verilog模块例化 在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化.模块例化建立了描述的层次.信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则 ...

  9. 【Verilog学习笔记】D触发器(门级和行为级)+4位寄存器+一个完整的激励程序

    [Verilog学习笔记]D触发器(门级和行为级)+4位寄存器+一个完整的激励程序 首先展示以下完整的程序 `timescale 1ns / 1psmodule hardreg( input wire ...

最新文章

  1. 计算机一级题资源,计算机一级B考题汇总(珍贵资源)
  2. Visual Studio 2015 Community连接到Mysql
  3. 【Leetcode | easy】最长公共前缀
  4. play框架入门操作
  5. (Object detection)目标检测从入门到精通——第一部分
  6. springboot2 - 坑 - 解决put提交接收不到参数的问题
  7. kd-Tree 【专题@AbandonZHANG】
  8. Jps介绍以及解决jps无法查看某个已经启动的java进程问题
  9. 一个可能是世界上最全的 API 接口集合库开源项目
  10. Atitit 歌词成语提取项目 nlp 人工智能项目 目录 1.1. 流程 首先搜集3w成语词库 1 1.2. 歌词常用成语400个 按照拼音排序 1 1.1.流程 首先搜集3w成语词库 放入m
  11. 算法与数据结构面试题(6)-腾讯面试题
  12. Windows密码查看器实现原理
  13. python实现批量将域名解析成ip
  14. 编译安装wpa_supplicant
  15. 电脑能上qq等软件但是浏览器打不开网页
  16. 渗透实战(周三):Ettercap·ARP毒化MITM中间人攻击
  17. 免费可用的Android手机传感器数据采集程序(附程序)
  18. Idea 设置Eclipse快捷键
  19. JAVA 清理垃圾文件简单实现
  20. uniapp小程序实现开屏页

热门文章

  1. 如何在VScode上配置Python开发环境【保姆级】
  2. boolean mct_object_set_parent(mct_object_t *object, mct_object_t *parent) 有感
  3. C++练习题20191125
  4. java边框颜色_边框颜色顺序
  5. 机器学习中的目标函数、损失函数、代价函数的区别
  6. 一个小时完成numpy入门(一)
  7. 记一次jasper的PDF模板父子报表实现功能
  8. java static 修饰_「static」JAVA static是什么?修饰符总结整理 - seo实验室
  9. 两小时课程值2000?清晖PMP最后两小时冲刺点题你参加了吗?
  10. Java中高级核心知识