SystemVerilog 验证-测试平台编写指南学习笔记(3):连接设计和测试平台

1 为什么需要更高层次的方法连接 Testbench 与 DUT?

Verilog 端口描述繁琐,容易产生连接错误。测试平台需要一种更高层次的方法来与设计建立通信。
Verilog 测试平台的代码与设计的代码处在不同的模块,使用模块保存测试平台经常会引起驱动和采样时的时序问题。SystemVerilog 引入了程序块(program block),从逻辑上和时间上分开测试平台。
Verilog 模块之间的连接修改起来繁琐,SystemVerilog 引入接口,接口代表一捆连线。

2 SystemVerilog 接口

2.1 什么是接口?

接口可以看作一捆智能的连线。
接口包含了连接、同步、两个或多个块之间的通信功能。

接口的例子:

interface arb_if(input bit clk);
    logic [1:0] grant,request;
    logic rst;

    modport TEST (output request, rst, clk,  // modport 结构能够将信号分组并指定方向。  
                 input grant);

    modport DUT (input request, rst, clk, 
                 output grant);
endinterface

模块可以在端口列表例化接口:module arb (arb_if.DUT arbif);

模块内部使用.来使用接口内的的连线:arbif.clk 、arbif.request。

2.2 接口怎么连接?

直接连接接口变量
如果不支持接口,则可以将接口的信号连接到每个端口上: .clk(arbif.clk)

2.3 接口的优缺点?

优点:

  1. 接口便于设计重用。当两个块之间有两个以上的连接信号,并且使用特定的协议通信的时候,应当考虑使用接口。
  2. 接口替代模块代码内部的一系列信号,减少了连接错误的可能性。
  3. 方便增加信号。
  4. modport方便地将接口中地一系列信号捆绑在一起。

缺点:

  1. 点对点连接使用接口,冗长。
  2. 必须同时使用信号名和接口名,可能使模块变得更加冗长。
  3. 如果模块间专用协议不重用,使用接口比端口连接工作更多。
  4. 连接两个不同地接口很困难。

3 SystemVerilog 控制通信中时序问题地结构?

测试平台与设计之间需要在相对于时钟信号合适的时间点驱动和接收同步信号。

3.1 使用时钟块控制同步信号地时序

带时钟块接口的例子:

interface arb_if(input bit clk);
    logic [1:0] grant,request;
    logic rst; 

    clocking cb @(posedge clk); // 时钟块
        output request;
        input   grant;
    endclocking

    modport TEST (output request, rst, clk,  // modport 结构能够将信号分组并指定方向。  
                 input grant);

    modport DUT (input request, rst, clk, 
                 output grant);
endinterface

定义了时钟块,测试平台可以用 @arbif.cb 表达式等待时钟,而不需要描述确切地时钟信号和边沿。

4 SystemVerilog 引入的新的时间片的划分方式?

设计和测试平台的事件(event)混合在同一个时间片(time slot)内,设计和测试平台之间可能存在竞争状态。

SystemVerilog 引入新的时间片划分方式:

在这里插入图片描述

  1. 区域1:Active。这个区域运行设计事件,包括RTL、门级代码和时钟发生器。
  2. 区域2:Observed。执行 SystemVerilog 断言。
  3. 区域3:Reactive。执行程序中的测试平台部分。
  4. 区域4:Postponed。为测试平台的输入采样信号。

事件并不是单向流动:Observed 和 Reactive 区域的事件可以触发本时钟周期内 Active 区域中进一步的设计事件。

时钟块默认在 #1step 延时之后采样输入信号,在 #0 延时之后驱动输出信号。1step 延时规定了信号在前一个时间片的 Postponed 区域,在设计有任何新动作之前被采样。

5 SystemVerilog 新增的结束仿真的方法?

Verilog,仿真在调度事件存在时继续执行,直到遇到 $finish。
SystemVerilog 把任何一个程序块是为含有一个测试,仿真在最后一个程序块结束时结束,可以执行 $exit 中断任何一个程序块。


6 接口中时钟块的信号是怎么同步的?

可以使用 Verilog 中的 @ 和 wait 来同步测试平台中的信号。

7 为什么在程序(program)中不允许使用always块?

SystemVerilog 程序比许多并行执行的块构成的Verilog更加接近C程序,它拥有一个(或多个)程序入口,always块可能从仿真开始就触发执行,但是一个测试平台的执行过程是经过初始化、驱动和响应设计行为等步骤后结束仿真的。

8 SystemVerilog 引入的编译单元?

Verilog 只有宏定义可以跨越模块的边界,而且经常用来创建全局常量。
SystemVerilog 引入了编译单元(compilation unit),它是一起编译的源文件的一个组合。任何module、macromodule、interface、program、package或者primitive边界之外的作用域被称为编译单元作用域。也称为 $unit 。这个作用域内的任何成员,如parameter ,都类似全局成员。

块外的作用域称为“顶层作用域”。


9 什么是 SystemVerilog 断言?

使用 SystemVerilog 断言(SVA)在设计中创建时序断言。

9.1 立即断言

测试平台的过程代码检查待测设计的信号值和测试平台的信号值,在存在问题时采取相应的行动。
断言相对于if语句实现,更加紧凑,但是断言的逻辑条件和if语句里的比较条件是相反的。设计者应该期望括号内的表达式为真,否则输出一个错误。

a1: assert (bus.cb.grant == 2'b01)
else $error("grant not asserted")

9.2 并发断言

可以认为是一个连续运行的模块,为整个仿真过程检查信号的值。
需要在断言内指定采样时钟。

assert_request_2state: assert property (request_2state)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值