(八)SV虚接口及包的使用

这篇具有很好参考价值的文章主要介绍了(八)SV虚接口及包的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、虚接口:

interface 简化了模块之间的连接,但是无法很好地适用于基于OOP的测试平台,无法在program  、class 中进行实例化,所以引入了虚接口,virtual interface的本质是指针,是指向interface的指针,即virtual interface是可以在class中实例化的数据类型,interface将测试平台与DUT分开,
virtual interface可以在TB的不同位置操纵一组虚拟信号,而不是直接操纵实际的信号。

关于interface和virtual interface的含义和使用正确的是,SV学习,fpga开发

//1.create DUT file counter.sv:
module counter(
	input  logic       resetn    ,
	input  logic 	   clk       ,
	input  logic [3:0] load_value,
	input  logic 	   load_valid,
	output logic [3:0] q
);

always_ff @(posedge clk or negedge resetn)
begin
	if(!resetn)
		q <= 4'd0;
	else if (load_valid)
		q <= load_value;
	else
		q <= q+1;
end
endmodule

//2.create interface file counter_if.sv: 
interface counter_if (input logic clk);
	logic 		load_valid;
	logic [3:0] load_value;
endinterface

//2.create transaction.sv:
class transaction;
	rand logic 		 load_valid;
	rand logic [3:0] load_value;
endclass

//4.create file driver.sv:
class driver;
	virtual counter_if vif;//声明虚接口的句柄
	transaction tr;
function new(input virtual counter_if vif);//形参也是虚接口
	this.vif=vif;
endfunction

task run (int n = 10);
for(int i=0;i<n;i++) 
begin
	tr=new();
	assert(tr.randomize());
	$display("tr.load_valid=%d,tr.load_value=%d", tr.load_valid, tr.load_value);
	@(posedge vif.clk) 
	begin
		vif.load_valid <= tr.load_valid;
		vif.load_value <= tr.load_value;
	end
end
endtask
endclass

//5.create tb_top.sv:
module tb_top;
	logic       clk;
	logic		rstn;
	logic [3:0] out;
	counter_if dutif(clk);//实例化接口
	driver my_driver;     //声明my_driver对象的句柄
	
initial begin
	my_driver=new(dutif);//使虚接口指向实例化的接口dutif
	repeat(2)@(posedge clk);
	@(posedge rstn);
	repeat(5)@(posedge clk);
	my_driver.run(20);
end

initial begin
	clk=1'b0; 
	forever #5 clk=~clk;
end

initial begin
	rstn=1; repeat(2)  @(posedge clk);
	rstn=0; repeat(5)  @(posedge clk);
	rstn=1; repeat(50) @(posedge clk);
	$finish;
end

counter u_counter (

	.resetn    (rstn			),
	.clk       (clk				),
	.load_valid(dutif.load_valid),
	.load_value(dutif.load_value),
	.q         (out				) 
);

endmodule

打印的随机结果:
tr.load_valid=0,tr.load_value= 4
tr.load_valid=0,tr.load_value=14
tr.load_valid=1,tr.load_value= 4
tr.load_valid=1,tr.load_value= 5
tr.load_valid=1,tr.load_value=11
tr.load_valid=1,tr.load_value= 4
tr.load_valid=0,tr.load_value=15
tr.load_valid=1,tr.load_value=12
tr.load_valid=1,tr.load_value=13
tr.load_valid=0,tr.load_value=12
tr.load_valid=1,tr.load_value= 6
tr.load_valid=0,tr.load_value=14
tr.load_valid=0,tr.load_value=12
tr.load_valid=1,tr.load_value=15
tr.load_valid=0,tr.load_value=14
tr.load_valid=1,tr.load_value= 6
tr.load_valid=0,tr.load_value= 9
tr.load_valid=1,tr.load_value= 7
tr.load_valid=1,tr.load_value= 5
tr.load_valid=1,tr.load_value= 7

说明:

  1. 实例化的接口必须正确连接到DUT
  2. 必须在类中用关键词virtual声明虚接口的句柄,并且有相应驱动
  3. 必须将virtual interface指向实例化的interface

二、包(package)

一、包

SV提供了一种在多个module、interface和program中共享parameter、data、type、task、function、class等的方法,包就是把相关的方法封装起来,也可以对类封装,将相关的类封装到一起,每个包分配单独的命名空间,这样对于不同的验证模块,有相同名字的类(这个类的内容和功能是不同的)也可以通过包来区别,sv中包不支持包含module、interface(会报错)。

包的定义:(关键词:package.....endpackage)

package regs_pkg;
`include "stimulator.sv"
`include "monitor.sv"
`include "checker.sv"
`include "env.sv"
endpackage

package arb_pkg;
`include "stimulator.sv"
`include "monitor.sv"
`include "checker.sv"
`include "env.sv"
endpackage

module arbiter_tb;
regs_pkg::monitor mon1 = new();
arb_pkg::monitor mon2 = new();
endmodule

说明:

  1. 上示代码,定义了regs_pkg、arb_pkg两个包,但其中包含的类的文件名和类的名字相同,当调用时需要用包的名字来指明调用的是哪个包的类。
  2. 包的命名一般要求要独一无二,便于区分命名空间。
package regs_pkg;
`include "regs_stm.sv"
`include "regs_mon.sv"
`include "regs_chk.sv"
`include "regs_env.sv“
endpackage

package arb_pkg;
`include "arb_stm.sv"
`include "arb_mon.sv"
`include "arb_chk.sv"
`include "arb_env.sv"
endpackage

module test_tb;
import regs_pkg::*;///regs_pkg中的所有元素都可以被当前文件直接调用
import arb_pkg::*;
regs_mon mon1= new();
arb_mon mon2 = new();
endmodule

说明:

  1. 在上示代码中,包的名字和类的文件名和名类的名字都不同时(代码风格文件名和类名一般相同),可以"import pkg_name::*"来导入pkg_name中包所有的类,因为类名不同,所以也可以直接引用。
  2. 包中可以定义类、静态方法和静态变量。
  3. 在包中include的文件的路径是默认路径,若包含的文件不在默认路径时,在编译时需要把文件相对路径包含进去,可以在Makefile中包含。在使用`include的关键词完成类在包中的封装,要注意编译的前后顺序来放置各个`include的类文件。

另:文章来源地址https://www.toymoban.com/news/detail-647825.html

  • generator产生这个激励数据 ,driver把激励加载到接口去驱动DUT,stimulator=generator+driver

到了这里,关于(八)SV虚接口及包的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Typescript - 通俗易懂的 interface 接口,创建接口 / 基础使用 / 可选属性 / 只读属性 / 任意属性(详细教程)

    在面向对象语言中,接口是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类去实现。 TypeScript 中的接口是一个非常灵活的概念,除了可用于 对类的一部分行为进行抽象 以外,也常用于对「对象的形状(Shape)」进行描述。 ​TypeScript 的核心原则之一是对值所

    2023年04月15日
    浏览(38)
  • VMware WiIN7 虚拟机安装wm-tools 时报错 安装程序无法自动安装Virtual Machine Communication Interface Sockets(VSock)驱动程序

    关于 VMware Tools安装时出现的问题的解决办法: 安装时出现问题对话框: 安装程序无法自动安装Virtual Machine Communication Interface Sockets(VSock)驱动程序。必须手动安装此驱动程序 可以通过安装windows更新解决,路径: https://support.microsoft.com/en-us/topic/servicing-stack-update-for-windows-

    2024年02月05日
    浏览(40)
  • Jmeter接口关联(三)【使用正则表达式提取值】以及正则表达式提取器中模板的含义及用法

    文章目录 前言 一、Jmeter中使用正则表达式匹配 1、选择 RegExp Tester 2、在线程组------》添加------》后置处理器-------里面添加一个“正则表达式提取器” 二、关于正则表达式提取器里面字段的解释 参数说明 三、进一步解释Jmeter正则表达式提取器中的模板 1、当模板设置为$0$ 

    2024年02月13日
    浏览(46)
  • Golang 接口(interface)

    原创比较累,希望大家能点点赞,对我的支持。你们的支持,就是我的动力。 1. 接口实现 在 Go 中,接口是一种抽象类型,它定义了一组方法签名,但没有实现。接口用于描述对象应该具有的方法集合,而不是具体的实现方式。 接口的定义使用 `type` 和 `interface` 。例如

    2024年02月05日
    浏览(31)
  • GO学习之 接口(Interface)

    1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Http) 11、GO学习之 微框架(Gin) 12、GO学习

    2024年02月14日
    浏览(35)
  • Typescript 之接口 interface(详解)

    TS新增了一个重要概念:接口, 分为对象类型接口和函数类型接口 接口可以约束对象,函数,类的结构和类型,是一种代码协作必须遵守的契约 Interface 是一种描述对象或函数的东西。你可以把它理解为形状,一个对象需要有什么样的属性,函数需要什么参数或返回什么样的值,数

    2024年02月10日
    浏览(35)
  • Go语言入门7(interface 接口)

    ​接口类型是对其它类型行为的抽象和概括,因为接口类型不会和特定的实现细节绑定在一 起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具有适应能力 可以包含0个或多个方法的签名 只定义方法的签名,不包含实现 实现接口不需要显式的声明,只需实现相应

    2023年04月13日
    浏览(61)
  • .NET Interface [接口]、abstract【抽象类】

    接口 Interface 接口不能被实例化 接口只能包含方法声明 接口中的成员包括方法、属性、索引器、事件 接口中不能包含常量、字段、构造函数、析构函数、静态成员 接口中的所有成员默认 public,因此接口中不能有private修饰符 派生类必须实现接口的所有成员 一个类可以继承多

    2024年02月05日
    浏览(88)
  • 【TypeScript】TS接口interface类型(三)

    一、前言 TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。这些方法都应该是抽象的,需要由具体的类去实现,然后第三方

    2024年02月14日
    浏览(34)
  • TypeScript--接口interface的定义,实现,继承

    可浏览博客主页的 TypeScript 专栏,会陆续添加相关文章,有问题或者可以优化的地方也希望大大门告知 共同进步 :) ts版本 Version 4.8.4 TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在TypeScript里,接口的作

    2023年04月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包