监视器/驱动程序与其BFM之间的虚拟接口它们实际上是什么,有人可以解释吗?

时间:2018-07-17 12:47:33

标签: system-verilog uvm eda

我在阅读UVM食谱,对监视器,驱动程序及其BFM之间的虚拟接口连接感到困惑。这是否意味着可能有多个驱动程序或监视器,或者这与不知道其监视器或驱动程序的接口无关。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

关键字virtual在SystemVerilog中已多次使用。接口是 virtual ,在某种意义上说,接口的层次结构路径是通过在运行时通过变量传递来设置的。 Verilog / SystemVerilog中的所有其他连接均为固定路径。

这确实允许您将同一驱动程序代码的多个实例连接到多个接口实例。它还有助于块到系统的重用,因此您可以在接口深入系统级别时更改层次结构路径。

答案 1 :(得分:0)

Verilog并不是作为编程语言创建的,而且,它不适合面向对象的编程。另一方面,系统Verilog测试平台语言被创建为一种面向对象的编程语言。

问题之一是在语义上将HDL Verilog与TB连接。所有Verilog HDL / RTL对象都是静态编译的,不能动态操作(TB需要此操作)。您无法获得指向模块,变量等的指针(好吧,除非通过某些后门PLI机制)。

因此,System verilog提出了interface构造,该构造旨在用作RTL世界中的连接对象。从某种意义上讲,它类似于module,它是一个编译时静态对象。但是,SV还添加了一个技巧,使您可以引用interface。这个技巧称为virtual interface

从程序员的角度来看,您可以将其视为引用或指向静态接口对象的指针。这使您能够将此引用传递给不同的TB类,或为同一接口创建多个引用。

这是一个示意性示例:

class Transaction;
   virtual dut_if trans; // <<< virtual interface
   function new(virtual dut_if t);
      trans = t; // <<<< assign it to trans
   endfunction // new
endclass // Transaction

// definition of the interface
interface  dut_if import trans_pkg::*;
    (input trans_t trans);
endinterface

// instantiate the interface in module 'rtl'
bind rtl dut_if dut_if(data);

program tb;
   // pass it to the constructor as a virtual interface pointer.
   Transaction trans1 = new (rtl.dut_if);
   Transaction trans2 = new (rtl.dut_if);
endprogram // tb