PLI的诞生和衰落
Verilog硬件描述语言为我们提供了描述硬件电路的一种高级语言形式,其类C的风格,让我们写起硬件电路,如果写C代码一样轻松愉悦。标准组织,想尽办法,为Verilog,添加更多的轮子,让它能跑得更快,跳的更高。各大EDA厂商,也在为基于verilog的仿真器,做各种有利的工具,以便用户使用。
这里,我提出一个问题,用户是如何获得Verilog语言描述的电路的内部数据结构信息的?不同的EDA厂商,如何都能让自己的仿真器中,在仿真verilog的tb时,生成FSDB波形?$display,$stop, $finish等系统函数,为何能被不同的EDA厂商的仿真器识别?
答案就在Verilog PLI(Programming Language Interface),Verilog PLI(编程语言接口)是一种从Verilog代码调用C或C++函数的机制。Verilog编程语言接口(PLI)为Verilog代码提供了一种机制,用于调用用C编程语言编写的函数。Verilog PLI的出现是Verilog语言在硬件设计方面如此成功的原因之一。
使用PLI,第三方公司和最终用户可以扩展商业Verilog仿真器的功能。在Verilog代码中调用的函数称为系统调用。内置系统函数的一个示例是$display,$stop,$finish等。 PLI允许用户创建自定义系统调用,这是Verilog语法不允许我们做的事情。基于PLI其实我们可以做的更多:
- 功耗分析
- 代码覆盖率工具
- 修改Verilog仿真数据结构 - 更准确的延迟。
- 自定义输出显示
- 协同仿真。
- 设计调试工具。
- 仿真结果分析
- C模型接口加速仿真
- Testbench建模
为了实现PLI的这些应用,C代码应该可以访问Verilog仿真器的内部数据结构。为方便起见,Verilog PLI提供了一些称为acc例程或简单访问例程的东西。
还有第二组例程,称为tf例程,或简称为任务和函数例程。 tf和acc是PLI 1.0例程,并且非常庞大且陈旧。
最后出现的就是Verilog程序接口(VPI),最初称为PLI 2.0,是主要用于C编程语言的接口。它允许行为Verilog代码调用C函数,C函数调用标准Verilog系统任务。 Verilog程序接口是IEEE 1364编程语言接口标准的一部分;该标准的最新版本是从2005年开始的.VPI有时也被称为PLI 2,因为它取代了已弃用的程序语言接口(PLI)。
虽然PLI1被弃用而支持VPI(又名PLI2),但由于其广泛记录的tf_put,tf_get函数接口在许多verilog参考书中有所描述,因此PLI1仍常用于VPI。
综上所述:PLI有三个libraries, TF(task/function) interface, ACC(access) interface, 以及VPI(Verilog Procedural Interface),三者的时间先后顺序是1985-1989-1995而前面两个已经在IEEE 1364-2005(IEEE 1364就是verilog std)中被删除。
由上面的描述我们可以看到,PLI很强大,几乎无所不能,那么为什么在2003年的时候,会出现一个叫DPI的家伙呢?这就要从PLI的应用和维护上说起。
写PLI例程,是件痛苦的事情,不仅需要好几个步骤,更让人头痛的是PLI三个库中提供的一大堆难记的标准例程名字。写完了,还必须再用checktf例程,calltf例程包一层,才能在verilog中调用。
另外一个问题, 就是谁来负责写这些PLI例程,通常情况下,不管是设计者还是验证人员通常都不需要了解仿真器生成的verilog数据结构。我们只是使用者,不是生产者。
最后,就是怎么编译写好的PLI。
编写PLI应用程序很难
- 必须学习奇怪的PLI术语
- 必须了解PLI库中的内容
- 必须创建checktf例程,calltf例程等
将PLI应用程序链接到仿真器很难
- 涉及多个步骤
- 每个仿真器都不同
- 谁链接…
- 设计工程师?
- EDA工具管理员?
- 管理多个PLI应用程序很困难
- PLI代码很少与二进制兼容
- 必须为每个仿真器重新编译
综上所述,PLI有以上痛点,它严重阻碍着设计者和验证者使用更高级的语言来加强verilog语言的功力,尤其是日益复杂的设计和验证工作迫切需要一种新的编程语言接口,为我们提供强大的生产力的时候。
DPI横空出世
在2003年IEEE 1800 SV LRM 3.1a中提出了一种直接的编程语言接口DPI。SystemVerilog DPI(直接编程接口)是将SystemVerilog与外部语言连接的一个接口。理论上外部语言可以是C,C ++,SystemC以及其他语言。但是,现在,SystemVerilog仅为C语言定义了一个外部语言层。
DPI由两层组成:SystemVerilog层和外部语言层。两层都彼此隔离。实际使用哪种编程语言作为外语是透明的,与此接口的SystemVerilog端无关。
DPI标准源自两个专有接口,一个来自Synopsys公司的VCS DirectC接口,另一个是来自Co-Design公司(已被Synopsys公司收购)的SystemSim Cblend接口。这两个专有接口起初是为他们各自的仿真器专门开发的, 而不是一个能够工作在任何仿真器上的标准。后来Synopsys公司将这两个技术捐献给了Accellera组织,Accellera的SystemVerilog标准委员会把这两个捐献技术合并在一起,并定义了DPI接口的语义,使得DPI能够与任何Verilog仿真器一起工作。
两者之间的关系
DPI绝不是PLI(或VPI)的替代品。相反,他们的角色是互补的。 PLI和VPI将来会继续存在并蓬勃发展,这主要有两个原因。
- PLI和VPI是经过时间考验的方法确保了对仿真器数据库的保护。 PLI和VPI将继续提供访问设计数据的安全机制,同时保持仿真器数据库的完整性。
- 对于许多人来说,PLI在未来几年仍将是首选接口语言。有许多应用程序使用PLI和VPI编写。将维护这些遗留应用程序,创建新的附加组件,并且将出现全新的应用程序 - 全部使用PLI和VPI。
在Accellera决定对整个SystemVerilog语言提供完整的VPI支持时,PLI也就证明了其顽强的生命力。你熟悉和喜爱的VPI方法现在将适用于SystemVerilog的整个对象集。
所以我们同时需要Verilog PLI和SystemVerilog DPI
- 使用PLI
- 访问仿真数据结构中任何位置的任何对象
- 同步到仿真事件队列
- 阻塞赋值,非阻塞赋值等
- 与仿真事件同步
- 仿真的开始,停止,完成,保存,重启,复位等