1、验证一个设计的步骤:

  生成输入激励,捕捉输出响应,决定对错和进度

2、连接设计和测试平台

  信号连接:SystemVerilog已经扩展了传统的reg类型,可以像wire那样用来连接模块,它的新名字为logic,logic不能多驱动。

  -缺点:使用信号连接极易出错。

  接口:接口可以看作是一捆智能的连线,在接口中使用modport结构能够将信号分组并指定方向,使用时钟块可以指定同步信号相对于时钟的时序。将接口中的信号定义为logic,则可以直接被过程赋值语句驱动,wire类型只能被连续赋值语句驱动。

  -优点:使得连接变得简洁不易出错,要增加一个信号时,在接口中只需要声明一次,不需要再更高层的模块层中声明。

3、接口中的双向信号用wire,单向信号用logic

4、module和program

  在模块module里描述设计,在program里搭建测试平台,再用接口把它们连接起来。程序块可以读写模块中的所有信号,可以调用模块中的所有例程,但是模块看不到程序块。这是因为测试平台需要访问和控制设计,但是涉及却独立于测试平台中的任何东西。程序块可以减少待测器件和测试平台之间的竞争状态:

5、接口采样和驱动

  接口信号采样:当你从时钟块中读取一个信号的时候,你是在时钟沿之前得到采样值

  接口信号驱动:当在modport中使用时钟块时,任何同步接口信号都必须加上接口名(arbif)和时钟块名(cb)的前缀,如arbif.cb.request

  通过时钟块驱动接口信号:如果测试平台在时钟的有效沿驱动同步接口信号,那么其值会立即传递到设计中。这是因为时钟块的默认输出延时是 #0。如果测试平台在时钟有效沿之后驱动输出,那么该值直到时钟的下一个有效沿才会被捕获。在时钟块中应当使用同步驱动(synchronous drive),即“<=”来驱动信号。

6、示例

interface:

`timescale 1ns/1ns
interface arb_if(input bit clk);
logic [:] grant,request;
logic rst; clocking cb @(posedge clk);
output request;
input grant;
endclocking modport TEST (clocking cb,
output rst);
modport DUT (input request,rst,
output grant);
endinterface

module:

`timescale 1ns/1ns
module arb(arb_if.DUT arbif);
initial begin
# arbif.grant <= ;
# arbif.grant <= ;
# arbif.grant <= ;
$display("@%0t:arbif.request=%b",$time,arbif.request);
end
endmodule

program:

`timescale 1ns/1ns
program automatic test(arb_if.TEST arbif);
initial begin
# arbif.cb.request <= ;
//$display("@%0t:Drive req=3",$time);
# arbif.cb.request <= ;
//$display("@%0t:Drive req=2",$time);
# arbif.cb.request <= ;
//$display("@%0t:Drive req=1",$time); $display("@%0t:arbif.cb.grant = %b",$time,arbif.cb.grant); repeat () @arbif.cb;
#50ns;
end
endprogram

top:

`timescale 1ns/1ns
module top;
bit clk;
always # clk = !clk;
arb_if arbif(clk);
arb a1 (arbif.DUT);
test t1 (arbif.TEST); endmodule

7、示例输出

# @25:arbif.request=11
# @25:arbif.cb.grant = 10

可以看到,arbif.cb.grant在时钟上升沿之前获得数值,当接口的输入信号恰好在时钟沿(25ns)变化(top.a1.arbif.grant:10-11)的时候,信号的新值在下一个时钟上升沿(35ns)传递给测试平台(top.arbif.cb.grant)。

如果测试平台在时钟的有效沿(25ns)驱动同步接口信号(top.arbif.cb.request: 10-01),那么其值会立即传递到设计(top.a1.arbif.request)中: arbif.request没有采到10数据,直接采到01数据.

总结来说就是,测试平台通过接口驱动设计是“立即”的,但是测试平台通过接口采样数据不是“立即”的

7、断言

  分为立即断言、并发断言

`timescale 1ns/1ns
program assert_test();
initial begin
bit a;
a <= ;
#;
a1:assert (a==)
else $error("customized error message");
end
endprogram

# ** Error: customized error message
# Time: 10 ns Scope: assert_test.#ublk#168691044#3.a1 File: D:/MyFiles/code_and_projects/ModelSim/sv_test4.sv Line: 8
# ** Note: implicit $finish from program
# Time: 10 ns Iteration: 0 Instance: /assert_test

8、结论

  (1)接口可以取代很多的信号连接,使代码更加容易维护和修改,还可以减少出错。

  (2)程序块可以减少待测器件和测试平台之间的竞争状态。

  (3)在接口中使用modport进行信号分组,使用时钟块使得测试平台能够相对于时钟正确地驱动和采样设计信号。

04-SV连接设计和测试平台的更多相关文章

  1. 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本

    ​    ​接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...

  2. teprunner测试平台部署到Linux系统Docker

    本文是一篇过渡,在进行用例管理模块开发之前,有必要把入门篇开发完成的代码部署到Linux系统Docker中,把部署流程走一遍,这个过程对后端设计有决定性影响. 本地运行 通过在Vue项目执行npm r ...

  3. 打造专属测试平台4-使用Docker部署Django项目

    编写完项目代码后,为了稳定的运行,需要将其部署至服务器.这里我选择了Docker去部署Django后端代码. 首先来看看Runoob对Docker的介绍: Docker 是一个开源的应用容器引擎,基于 ...

  4. 微软官方网站线上兼容测试平台-Browser screenshots

    前端开发时最不想做的就是在不同浏览器.平台和分辨率测试网页显示效果,通常这会浮现许多问题,尤其浏览器版本就可能让显示成效完全不同,也只好尽力维持让每一种设备都能正常浏览网页.修改到完全没有问题必须投入 ...

  5. Optimizely:在线网站A/B测试平台

    Optimizely:在线网站A/B测试平台是一家提供 A/B 测试服务的公司.A/B 测试能够对比不同版本的设计,选取更吸引用户眼球的那一款,从而带来更为优化的个人体验.让网站所有者易于对不同版本的 ...

  6. Testin云测试平台初体验

    这几天偶然接触到了一个叫做Testin的云测试平台,经过一番体验,感觉还是不错的,因为里面提供了大量的测试机型,可以针对Android手机的严重碎片化现象做出比较全面的测试,同时Testin的测试内容 ...

  7. SQL注入测试平台 SQLol -1. 简介与安装

    最近下载了SQLol测试了一下,感觉挺好玩的,做一下记录. SQLol是一个可配置得SQL注入测试平台,它包含了一系列的挑战任务,让你在挑战中测试和学习SQL注入语句,SQLol还是比较有创意的项目. ...

  8. 一个基于集成jenkins的测试平台

    (一)先看测试业务的情况: 有各种各样的任务包括代码构建.部署搭建.单元测试.功能自动化测试(包括许多模块的功能自动化测试,有十几个居多),性能测试.正确性验证:复杂一点的是这些任务在不同的测试阶段中 ...

  9. 支撑Pinterest日均1000+次试验的A/B测试平台揭秘

    编者按:本文详细介绍了 Pinterest 内部A/B测试平台的搭建过程,对于无论是有技术能力和资源想要自建A/B测试系统的大公司,还是想在业务中引入第三方A/B测试方法和工具的中小公司都极具参考意义 ...

随机推荐

  1. 二维数组转稀疏数组、稀疏数组恢复二维数组(Java实现)

    public static void main(String[] args) { // 创建一个原始的二维数组 9*9 int chessArr1[][] = new int[9][9]; // 0表 ...

  2. Descriptor - Python 描述符协议

    描述符(descriptor) descriptor 是一个实现了 __get__. __set__ 和 __delete__ 特殊方法中的一个或多个的. 与 descriptor 有关的几个名词解释 ...

  3. 用户登录并返回token(springboot)

    何为token?[如果想直接看代码可以往下翻] 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的:1. 客户端使用用户名跟密码请求登录2. 服务端收到请求,去 ...

  4. CentOS7重置密码

    #在vmlinuz段最后添加rd.break Ctrl+X启动 rd.break #在linux16/linux/linuxefi所在参数行尾添加以下内容 init=/bin/sh #此时,可使用mo ...

  5. 如何在GitHub预览html

    1.在GitHub中找到需要预览的html文件,点击settings 2.找到GitHub Pages,将其中的source改为master branch,此时出现了下图中的红色链接,打开一个新的网页 ...

  6. Jmeter 连接Redis获取数据集

    公司开展了新的业务活动,需要配合其他部门做压测,由于脚本中的手机号和用户的uid需要参数化而且每次均不能重复,最初的考虑使用csv的方式来获取数据,比较头疼的问题是集群节点需要维护测试数据,所以我将所 ...

  7. .NET CORE应用程序启动

    ASP.NET Core 应用是在其 Main 方法中创建 Web 服务器的控制台应用: Main 方法调用 WebHost.CreateDefaultBuilder,通过生成器模式来创建web主机. ...

  8. [PHP] 使用PHP在mongodb中进行count查询

    在php7的mongodb扩展中,当要查询某个集合在某个条件下的数据个数时,可以使用下面的方式来获取. 比原生的命令要复杂许多 比旧版mongo扩展也复杂许多 需要使用到MongoDB\Driver\ ...

  9. 图解Java设计模式之设计模式七大原则

    图解Java设计模式之设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 单一职责原则 2.3.1 基本介绍 2.3.2 应用实例 2.4 接口隔离原则(Interface S ...

  10. C#方法中的各类参数

    居家隔离的第26天,还在持续的疫情着实让人担忧,看着每天新增的确认人数数字,也在为那些家庭祝福,每当想想那不是一个数字是一条条鲜活的生命时就格外沉重.利用闲在家里的时间巩固C#语言的一个难点.最近在温 ...