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. PyObject and PyTypeObject - Python 中的 '对象' 们

    1 PyObject, PyTypeObject - Python 中的 '对象' 们 '一切皆对象' - 这是 Python 的学习和使用者们最最常听到一句, 可谓 博大精深 - '勃大精深'. ' ...

  2. 大文件切割(split)

    split提供两种方式对文件进行切割: 根据行数切割,通过-l参数指定需要切割的行数 根据大小切割,通过-b参数指定需要切割的大小 1.1 根据行数切割 如下以一个3.4G大小的日志文件做切割演示,每 ...

  3. Linux 邮件服务

    三个要点 1.smtp协议 2.搭建本地邮件服务器 3.使用外部邮件服务器 实现邮件功能 1.smtp协议           SMTP(Simple Mail Transfer Protocol)即 ...

  4. 前后端API交互如何保证数据安全性?(转)

    前言 前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合.无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用 ...

  5. mybatis 通过配置父类数据源连接和关闭数据,进行junit单元测试

    来源:https://blog.csdn.net/Bigbig_lyx/article/details/80646005 解决问题,单元测试没经过单独配置,每个测试方法中要添加配置数据源 一:配置父类 ...

  6. 复制表结构创建分表 再设置自增ID

    CREATE TABLE table_name1 LIKE table_name ALTER TABLE test AUTO_INCREMENT=x

  7. 表关联使用INNER JOIN实现更新功能

    准备一些数据,创建2张表,表1为学生表: CREATE TABLE [dbo].[Student] ( [SNO] INT NOT NULL PRIMARY KEY, ) NOT NULL, ,) N ...

  8. 深度(deepin)系统不能ssh root用户登录

    vi /etc/ssh/sshd_config找到这一部分信息刚进去信息应该是这样 # Authentication: #LoginGraceTime 2m #PermitRootLogin proh ...

  9. 《手把手教你构建自己的 Linux 系统》学习笔记(1)

    第二章.基础准备--Linux 系统定制原理 Linux 系统的组成及架构 共享库和静态库 在 Linux 系统中,函数库包含两种形式:共享库和静态库. 共享库 共享库在程序运行时,为其提供所需要的函 ...

  10. opencv —— Laplacian 拉普拉斯算子、二阶导数用于边缘检测

    Laplacian 算子简介 求多元函数的二阶导数的映射又称为 Laplacian 算子:   计算拉普拉斯变换:Laplacian 函数 void Laplacian(InputArray src, ...