SystemVerilog interface详细介绍

1. Interface概念

        System Verilog中引入了接口定义,接口与module 等价的定义,是要在其他的接口、module中直接定义,不能写在块语句中,跟class是不同的。接口是将一组线捆绑起来,可以将接口传递给module。

2. 接口的优点

        一)通过接口在module之间或内部进行信号传递,模块的输入列表就是一个接口,这样简单,避免手动连线的错误。

        二)如果需要增加模块的IO,只需要在接口中增加,不需要改变模块的输入列表,防止输入错误、少改了哪个模块的列表。

        三)在UVM 中需要在不同的class之间传递信号,用接口的话,传递一组信号只需要uvm_config_db一个接口就可以了,如果不用接口,那么就需要好多条uvm_config_db语句。

        四)接口中可以定义一些initial(生成时钟),always块,任务,函数,类的句柄

3. 定义接口

        可以在接口中定义一些信号、函数、任务、class对象,也可以有always,initial语句块。比如可以在initial块中生成时钟clk。

3.1 定义

interface if(input bit clk);logic data;logic valid;logic addr;
endinterface

3.2 modport

        可以用modport将接口中的信号分组。比如总线接口中,master、slave、arbiter需要的信号是不同的,输入输出也不同。

interface if(input bit clk);logic [7:0] data;logic valid;logic [7:0] addr;logic request;logic grant;logic command;logic ready;modport MASTER(output request,addr,command);modport SLAVE(input request,addr,command,output ready);modport ARBITER(input request,output grant);
endinterface
module Master (if.MASTER if_u);
...
endmodule
module test;if if_u;Master m_u(if_u.MASTER);
endmodule    

4. 激励时序

        测试平台需要和设计之间的时序密切配合。比如在同一个时间片内,一个信号需要被同时写入和读取,那么采样到新值还是旧值?非阻塞赋值可以解决这个问题,值的计算在active区域,值的更新在NBA区域——采样到的是旧值。

4.1 时钟块控制同步信号的时序

        在接口中定义时钟块,时钟块中的任何信号都相对于时钟同步驱动和采样时钟块大都在测试平台中使用

interface if(input bit clk);logic [7:0] data;logic valid;logic [7:0] addr;clocking cb@(posedge clk);input valid;input data;input addr;endclockingmodport TEST(clocking cb);modport DUT(input valid ,input data);
endinterface

        一个接口中可以有多个时钟块,但每个时钟块只有一个时钟表达式。如@(posedge clk)定义了单时钟;@(clk)定义了DDR时钟(双数据率,两个沿)。

4.2 logic还是wire

        在测试平台中,如果用过程赋值语句驱动接口中的信号,那么信号要在接口中定义为logic,如果是连续赋值驱动,定义成wire

        定义成logic的一个好处是,如果多个信号驱动logic,那么编译器会报错,这样你就知道写错了,如果是wire,这个错误就隐藏了。

4.3 对测试平台和DUT中事件的调度

        如果没有用时钟块,测试平台对DUT的驱动和采样存在竞争,这是因为测试平台的事件和DUT的事件混合在同一个时间片中

SV中将测试平台中的事件和DUT中的事件分离。
时间片划分:

 SV的主要调度区域:

4.4 设计和测试平台之间的时序

        时钟块(测试平台)在#1step延时之后采样DUT,也就是采样上一个时间片postponed区域的数据。也就是前面讲的采样旧值。时钟块(测试平台)在#0延时之后驱动DUT信号。0延迟说明还在同一个time slot,DUT能够捕捉到变化。
        更细致的时间片划分:

time slot
activedesign
inactive显示0延迟阻塞赋值;
observedSVA
reactiveSV
postponedSV 采样

5. 接口采样和驱动信号的时序

        为了同步接口中的信号,可以在时钟沿采样或者驱动接口信号。可以在接口中定义时钟块来同步接口信号:

interface if(input bit clk);logic data;logic valid;logic addr;clocking cb@(posedge clk);input valid;input data;input addr;endclockingmodport TEST(clocking cb);modport DUT(input valid ,input data);
endinterface

在测试平台中的信号才需要同步。

5.1 接口信号采样时序

        如果时钟块中的信号采样DUT中的信号,采样的是上一个时间片(time slot)postponed区域的数据。即如果DUT信号在时钟沿发生0-1跳变,那么采样到0。DUT接口想要驱动TEST接口中时钟块里的信号,需要线给DUT接口信号赋值:

module dut(if.DUT if0);....#10 if0.valid = 1;#10 if0.valid = 2;....
endmodule

5.2 接口信号驱动时序

        如果时钟块驱动DUT信号,值会立即传入到设计中。即如果时钟块中的信号在时钟沿发生0-1跳变,则时钟沿之后DUT中为1。
        时钟块想要驱动DUT,需要在testbench给时钟块中的信号赋值,在tb中驱动时钟块中的信号需要同步驱动,用“<=”符号。时钟块中的信号驱动采样

program tb(if.TEST if1);...#10 if1.cb.valid <= 1;#10 if1.cb.valid <= 0;...
endprogram

6. 使用虚接口

        之前介绍的接口都是跟module一样来描述硬件的;在SV中有面向对象的概念,在class里面使用虚接口——virtual interface。虚接口是一个物理接口的句柄(handler),同这个句柄来访问硬件接口。虚接口是唯一链接动态对象和静态模块、接口的一种机制。

6.1 在测试平台中使用接口

interface inf; //定义接口
...
endinterface
program test(inf if0); // 接口传入测试平台driver drv;initial begindrv = new(if0); // 接口传给driver对象end
endprogram
class driver;virtual vif;  // 在class中为虚接口function new(inf i);vif=i;endfunction
endclass
module top;inf inf0();  // 例化接口test t1(inf0);dut d1(inf0);
endmodule

也可以在tb中跨模块引用XMR(cross module reference)接口

program test(); //没有接口参数virtual inf if0=top.inf0;//top是顶层模块...
endprogram
module top;inf inf0();  // 例化接口test t1(); // tb无接口列表dut d1(inf0);
endmodule

6.2 使用端口传递接口数组

interface inf(input clk);
...
endinterface
parameter NUM=10;
module top;inf xi[NUM](clk); // 顶层例化多个接口,接口名后跟个数test t1(xi);// 接口作为参数dut...
endmodule
program test(inf xi[NUM]); // 接口参数列表virtual inf vxi[NUM];initial beginvxi=xi;end
endprogram

也可以用跨模块引用。

7. 接口中的代码

        接口中可以定义信号、函数、任务、class对象,也可以有always,initial语句块。下面给一个在《UVMPrimer》中的例子:

interface tinyalu_bfm;import tinyalu_pkg::*;
​byte         unsigned        A;byte         unsigned        B;bit          clk;bit          reset_n;wire [2:0]   op;bit          start;wire         done;wire [15:0]  result;operation_t  op_set;
​assign op = op_set;
​task reset_alu();reset_n = 1'b0;@(negedge clk);@(negedge clk);reset_n = 1'b1;start = 1'b0;endtask : reset_alutask send_op(input byte iA, input byte iB, input operation_t iop, shortint result);if (iop == rst_op) begin@(posedge clk);reset_n = 1'b0;start = 1'b0;@(posedge clk);#1;reset_n = 1'b1;end else begin@(negedge clk);op_set = iop;A = iA;B = iB;start = 1'b1;if (iop == no_op) begin@(posedge clk);#1;start = 1'b0;           end else begindo@(negedge clk);while (done == 0);start = 1'b0;endend // else: !if(iop == rst_op)endtask : send_opcommand_monitor command_monitor_h;
​function operation_t op2enum();case(op)3'b000 : return no_op;3'b001 : return add_op;3'b010 : return and_op;3'b011 : return xor_op;3'b100 : return mul_op;default : $fatal("Illegal operation on op bus");endcase // case (op)endfunction : op2enum
​
​always @(posedge clk) begin : op_monitorstatic bit in_command = 0;command_s command;if (start) begin : start_highif (!in_command) begin : new_commandcommand.A  = A;command.B  = B;command.op = op2enum();command_monitor_h.write_to_monitor(command);in_command = (command.op != no_op);end : new_commandend : start_highelse // start lowin_command = 0;end : op_monitor
​always @(negedge reset_n) begin : rst_monitorcommand_s command;command.op = rst_op;command_monitor_h.write_to_monitor(command);end : rst_monitorresult_monitor  result_monitor_h;
​initial begin : result_monitor_threadforever begin@(posedge clk) ;if (done) result_monitor_h.write_to_monitor(result);endend : result_monitor_threadinitial beginclk = 0;forever begin#10;clk = ~clk;endend
endinterface : tinyalu_bfm

函数使用的时候通过接口对象调用就行了

virtual tinyalu_bfm inf;
initial begininf.send_op(..);
end

8. 接口使用注意事项

  • 接口不能在package中被`include

    下面这种写法是会报错的。

    package pkg;`include "apb_if.sv"……
    endpackage

    而要放在package外面

    `include "apb_if.sv"
    package pkg;……
    endpackage

            如果要在UVM中要通过hierarchy访问DUT中的信号,最好将这些信号放在interface中,然后将virtual interface传给UVM。

    // 在接口中定义信号
    interface bfm;bit[7:0 addr;
    endinterface// 实例化接口
    bfm u_bfm();// 将虚接口传给UVM
    initial beginuvm_config_db#(vitual bfm)::set("", uvm_test_top, "bfm", bfm);
    end// 在UVM可直接操作虚接口    

            如果不这样的话,当uvm component(driver, monitor, agent等)文件是通过package来管理的话,就不能在UVM中hierarchy引用DUT中的信号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven入门教程(一):安装Maven环境

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 Maven项…

Vscode画流程图

1.下载插件 Draw.id Integration 2.桌面新建文件&#xff0c;后缀名改为XXX.drawio 在vscode打开此文件 &#xff0c;就可以进行绘制流程图啦

6.Redis-hash

hash 哈希类型中的映射关系通常称为field-value&#xff0c;⽤于区分 Redis 整体的键值对&#xff08;key-value&#xff09;&#xff0c;注意这⾥的value是指field对应的值&#xff0c;不是键&#xff08;key&#xff09;对应的值&#xff0c;请注意 value 在不同上下⽂的作⽤…

R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达自激过程时间序列...

全文下载链接&#xff1a;http://tecdat.cn/?p25880 本文描述了一个模型&#xff0c;该模型解释了交易的聚集到达&#xff0c;并展示了如何将其应用于比特币交易数据。这是很有趣的&#xff0c;原因很多。例如&#xff0c;对于交易来说&#xff0c;能够预测在短期内是否有更多…

EVO大赛是什么

价格是你所付出的东西&#xff0c;而价值是你得到的东西 EVO大赛是什么&#xff1f; “EVO”大赛全称“Evolution Championship Series”&#xff0c;是北美最高规格格斗游戏比赛&#xff0c;大赛正式更名后已经连续举办12年&#xff0c;是全世界最大规模的格斗游戏赛事。常见…

angular抛出 ExpressionChangedAfterItHasBeenCheckedError错误分析

当变更检测完成后又更改了表达式值时&#xff0c;Angular 就会抛出 ExpressionChangedAfterItHasBeenCheckedError 错误。Angular 只会在开发模式下抛出此错误。 在开发模式下&#xff0c;Angular 在每次变更检测运行后都会执行一次附加检查&#xff0c;以确保绑定没有更改。这…

Java 8 新特性——Lambda 表达式(2)

一、Java Stream API Java Stream函数式编程接口最初在Java 8中引入&#xff0c;并且与 lambda 一起成为Java开发里程碑式的功能特性&#xff0c;它极大的方便了开放人员处理集合类数据的效率。 Java Stream就是一个数据流经的管道&#xff0c;并且在管道中对数据进行操作&…

springBoot打印精美logo

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;文本logo &#x1f412;个人主页 &#x1f3c5;JavaEE系列专栏 &#x1f4d6;前言&#xff1a; 本篇博客主要以提供springBoot打印精美logo &#x1f380;文本logo ??…

博流RISC-V芯片BL616开发环境搭建

文章目录 1、工具安装2、代码下载3、环境变量配置4、下载交叉编译器5、编译与下载运行6、使用ninja编译 本文分别介绍博流RISC-V芯片 BL616 在 Windows和Linux 下开发环境搭建&#xff0c;本文同时适用BL618&#xff0c;BL602&#xff0c;BL702&#xff0c;BL808系列芯片。 1、…

电商数据接口API:品牌价格监控与数据分析的重要工具

一、引言 随着电子商务的快速发展&#xff0c;传统品牌企业越来越重视在线销售市场。为了在竞争激烈的市场环境中取得成功&#xff0c;企业需要实时掌握市场动态&#xff0c;了解自身产品的销售情况、价格趋势以及竞品信息。为了实现这一目标&#xff0c;各大电商平台&#xf…

每天 26,315 美元罚款?交通安全局要求特斯拉提供 Autopilot数据

根据美国国家公路交通安全管理局&#xff08;NHTSA&#xff09;最近的特别命令&#xff0c;特斯拉公司被要求提供关于其自动驾驶功能Autopilot的相关信息。这一命令是继NHTSA于2021年8月启动初步评估后&#xff0c;在2022年6月升级为正式调查的一部分&#xff0c;NHTSA近期对特…

自学设计模式(类图、设计原则、单例模式 - 饿汉/懒汉)

设计模式需要用到面向对象的三大特性——封装、继承、多态&#xff08;同名函数具有不同的状态&#xff09; UML类图 eg.—— 描述类之间的关系&#xff08;设计程序之间画类图&#xff09; : public; #: protected; -: private; 下划线: static 属性名:类型&#xff08;默认值…

NPM 管理组织包

目录 1、关于组织范围和包 1.1 管理无作用域的包 2、使用组织设置配置npm客户端 2.1 配置您的npm客户端以使用您组织的范围 为所有新包设置组织范围 为单个包设置组织范围 2.2 将默认包可见性更改为public 将单个包的包可见性设置为public 将所有包的包可见性设置为pu…

C++新经典 | C语言

目录 一、基础之查漏补缺 1.float精度问题 2.字符型数据 3.变量初值问题 4.赋值&初始化 5.头文件之<> VS " " 6.逻辑运算 7.数组 7.1 二维数组初始化 7.2 字符数组 8.字符串处理函数 8.1 strcat 8.2 strcpy 8.3 strcmp 8.4 strlen 9.函数 …

WPF 查看绑定错误——Snoop 的基本使用

关于 可以通过 Snoop 查看 WPF 程序的 Visual Tree&#xff0c;更多介绍请看 snoopwpf 快速开始 一、下载 snoopwpf.msi 安装后打开&#xff0c;选择自己的程序&#xff0c;点击 snoop&#xff08;望远镜&#xff09; 二、筛选 点击左侧下拉列表&#xff0c;选择 Show onl…

docker desktop安装es 并连接elasticsearch-head:5

首先要保证docker安装成功&#xff0c;打开cmd&#xff0c;输入docker -v&#xff0c;出现如下界面说明安装成功了 下面开始安装es 第一步&#xff1a;拉取es镜像 docker pull elasticsearch:7.6.2第二步&#xff1a;运行容器 docker run -d --namees7 --restartalways -p 9…

Maven入门教程(二):idea/Eclipse使用Maven

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 4.开发…

forlium 笔记 Map

用于创建交互式地图 1 主要参数 1.1. location 地图位置 地图的经纬度 import foliumm folium.Map(location[31.186358, 121.510256],zoom_start15)m 1.2 tiles 内置样式 默认是OpenStreetMap 1.2.1 Stamen Terrain 它强调了地形特征&#xff0c;如山脉、河流和道路 m …

深度学习论文: Segment Any Anomaly without Training via Hybrid Prompt Regularization

深度学习论文: Segment Any Anomaly without Training via Hybrid Prompt Regularization Segment Any Anomaly without Training via Hybrid Prompt Regularization PDF: https://arxiv.org/pdf/2305.10724.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch Py…

Ubuntu 23.10 将首次推出基于 Flutter 的新 Ubuntu 商店

导读Ubuntu 正在升级其软件商店以提供顺滑的体验&#xff01; 随着不断发展&#xff0c;Canonical 似乎全力以赴&#xff0c;将基于 Flutter 的元素整合到 Ubuntu 中。 在前段时间 Ubuntu 23.04 发布后&#xff0c;我们见到了基于 Flutter 的安装程序 &#xff0c;现在&#x…