SystemVerilog学习整理——例化连接与接口

目录

 3、SystemVerilog——设计例化和连接以及验证结构

3.1设计例化和连接

3.2验证结构

4、SystemVerilog——接口interface

4.1接口(把信号封装,便于维护和使用)

4.2采样和数据驱动(竞争、接口中的clocking用于信号的同步)

4.2.1竞争问题

4.2.2接口中的clocking块

4.3测试的开始和结束(时钟复位信号开始,系统函数调用stop、finish结束、program隐式结束)

4.3.1时钟和复位信号开始

4.3.2结束方式一:调用系统函数结束

4.3.3结束方式二:program隐式结束

4.3.4program和module


 3、SystemVerilog——设计例化和连接以及验证结构

3.1设计例化和连接

  1. module为硬件域,在定义时需要标注方向、位宽和端口名。
  2. 在上层例化底层模块,或者TB例化DUT时,均需要完成模块例化。例化时需要注意模块名、参数例化传递(如果有)、例化名和端口例化对应。
  3. 在testbench中的连接(connection)指的是有硬件模块参与作为信号驱动方(drive)或者负载方(load)。
  4. TB中常见的连接有两个硬件模块之间的连接,譬如实例A与实例B的连接,可由logic类型完成连接;如果是硬件模块与TB中发送数据激励的连接,则需要考虑数据激励一端如何正确产生数据并发送至DUT一侧,同时数据激励一端也需要对DUT反馈的信号做出正确响应。

3.2验证结构

  1. 测试平台(testbench)是整个验证系统的总称,它包括验证结构中的各个组件、组件之间的连接关系、测试平台的配置和控制。从更系统的意义来讲,它还包括编译仿真的流程、结果分析报告和覆盖率检查等。
  2. 从狭义上讲,我们主要关注验证平台的结构和组件部分,他们可以产生设计所需要的各种输入,也会在此基础上进行设计功能的检查。

4、SystemVerilog——接口interface

4.1接口(把信号封装,便于维护和使用)

        SV中接口为块之间的通信建模,接口可以看成是一捆智能的连线。接口包含了连接,同步,甚至是两个块或者更多块之间的通信功能。它们连接了设计和测试平台。具有以下特点:

  1. 接口可以用作设计,也可以用作验证。
  2. interface中包含了 一组信号;
  3. interface可以是 一个独立的文件,将多个模块通用的信号集中放在一个文件中;
  4. interface中集合了多个Verilog类型信号,是一个独立的端口类型;
  5. interface中可以包含多个modport, 定义interface的不同视图view(DUT、Test program)
  6. interface中可以使用clocking模块 显式指明同步时钟域;
  7. interface中的clocking只用于验证平台,其中可包含多个clocking模块,clocking中的信号方向与Testbench相关;
  8. interface和module的使用性质很像。它可以定义端口,也可以定义双向信号;它可以使用initial和always,也可以定义function和task。
  9. interface可以在硬件环境和软件环境中传递,例如作为module的端口列表,也可以作为软件方法的形式参数。
  10. DUT与TB之间的数据驱动关系都可以使用interface这个插排来完成。
  11. 在搭建测试平台时,接口信号必须使用非阻塞赋值来驱动。
  12. 使用接口时需要确保在模块和程序块之外声明接口变量。

        接口interface实例:

interface arb_if(input bit clk);   //通常在接口的端口列表中声明时钟信号
       logic      grant;
       logic      request;
       logic      reset_n;

    clocking cb@(posedge clk);      //用于同步时钟域,相当于寄存器,将信号寄存一拍
       input      grant;            //clocking模块主要服务于TB
       output     request;
    endclocking
 
    modport TB(                    //定义TB视图view
        clocking   cb,
        output     reset_n);

    modport dut(                    //定义dut视图view
        input      request,
        input      reset_n,
        output     grant);

endinterface

4.2采样和数据驱动(竞争、接口中的clocking用于信号的同步)

4.2.1竞争问题

        为了避免在RTL仿真行为中发生的信号竞争问题,建议通过非阻塞赋值或者特定的信号延迟来解决同步的问题。

避免采样的竞争问题

  1. 在驱动时,添加相应的人为延迟,模拟真实的延迟行为,同时加大clk与变量之间的延迟,以此提高DUT使用信号时的准确度和TB采样信号时的可靠性。
  2. 对于一些采样时依然存在delta-cycle延迟的信号,我们还可以依靠在采样事件的某段时刻中进行采样,来模拟建立时间的采样要求,确保采样的可靠性。

4.2.2接口中的clocking块

  1. 硬件世界和软件世界的连接可以通过灵活的interface来实现,也可以通过modport来进一步限定信号传输的方向,避免端口连接的错误。
  2. 我们也可以在接口中声明clocking(时序块)和采样的时钟信号,用来做信号的同步和采样。
  3. clocking块基于时钟周期对信号进行驱动或者采样的方式,使得testbench不再苦恼于如何准确及时地对信号驱动或者采样,消除了信号竞争的问题。
  4. clocking块不但可以定义在interface中,也可以定义在module和program中。
  5. clocking中列举的信号不是自己定义的,而是应该由interface或者其它声明clocking的模块定义的。
  6. clocking在声明完名字之后,应该伴随着定义默认的采样事件,即"default input/output event"。如果没有定义,则会默认地在clocking采样事件前的1step对输入进行采样,在采样事件后的#0对输出进行驱动。
  7. 除了定义默认的采样和驱动事件,也可以在定义信号方向时,用新的采样事件对默认事件做覆盖。

结论:

  1. 为了避免可能的采样竞争问题,verifier应该在验证环境的驱动环节就添加固定延迟,使得在仿真波形中更容易体现出时钟与被驱动信号之间的时序前后关系,同时这样也便于DUT的准确处理和TB的准确采样。
  2. 如果TB在采样从DUT送出的数据,在时钟与被驱动信号之间存在delta-cycle时,应该考虑在时钟采样沿的更早时间段去模拟建立时间要求采样,这种方法也可以避免由于delta-cycle问题带来的采样竞争问题。
  3. 当我们把clocking运用到interface中,用来声明各个接口与时钟的采样和驱动关系后,可以大大提高数据驱动和采样的准确性,从根本上消除采样竞争的可能性。

4.3测试的开始和结束(时钟复位信号开始,系统函数调用stop、finish结束、program隐式结束)

4.3.1时钟和复位信号开始

        对于一个设计,在仿真开始后提供时钟和复位信号,这对于验证而言是必要的步骤。如果在仿真开始没有任何的激励,譬如时钟和复位信号,那么仿真不具备执行的条件,也可以认为已经结束。时钟和复位信号本身不会对设计的功能产生实质的功能影响。从设计的角度来看,复位信号只是为了让设计进入确定的状态,而时钟信号保证设计可以正常地运行

4.3.2结束方式一:调用系统函数结束

        在Verilog测试中,需要通过Verilog提供的系统函数来结束仿真。通过系统函数$finish()结束了仿真,也可以使用$stop()来暂停仿真。这两者的区别在于$finish()会使得仿真退出,将控制权交回给操作系统,仿真无法再次继续;$stop()会使得仿真暂停,用户还有机会让仿真继续运行。

4.3.3结束方式二:program隐式结束

        在SV中将每一个program作为一个独立的测试,如果testbench中只有一个program,则会在执行完该program中最后一个initial过程块后自动结束仿真。如果testbench中有多个program,那么需要等待所有program中最后一个initial过程块完成后,才能结束仿真。

4.3.4结束方式之三:program显式结束

        从上面program隐式结束方式来看,要求仿真自动结束的前提是所有program的initial块都应该在一定时间内完成,而实际上有的program内的initial语句块会一直运行下去,这就使得仿真无法等到所有的program都执行完毕,也就无法自动结束。这时候,我们可以在目标program内置入系统函数$exit()来要求该program强行结束待该program结束之后,仿真器仍然会等待其它program执行完毕后再结束仿真。

4.3.4program和module

  1. 通常将设计部分放置在module中,将测试采样部分放置在program中。可以将program看做是软件的"领地",所以program中不可以出现和硬件行为相关的过程语句和实例,例如always.module.interface,也不应该出现其它program例化语句。
  2. 为了使得program进行类软件方式的顺序执行方式,可以在program内部定义变量,以及发起多个initial块。
  3. program内部定义的变量赋值的方式应该采用阻塞赋值(软件方式)
  4. program内部在驱动外部的硬件信号时应该使用非阻塞赋值(硬件方式)
  5. program对于数据采样时可以消除delta-cycle竞争问题的描述。
  6. 划分module(硬件盒子)、program(软件盒子)和interface(硬件软件的媒介)的初衷在于SV需要更清晰的界限来划分硬件域(module)、软件域( program和class)以及中间域(interface)
  7. 为了验证环境建立独立的测试盒子,可以考虑采用program来帮助消除采样竞争问题以及自动结束测试用例;也可以采用module硬盒子的方式,使用interface clocking来消除采样竞争问题,使用$stop()、$finish()系统方法来显式结束测试用例

你可能感兴趣的:(集成测试,模块测试,功能测试)