0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemVerilog中bind用法总结+送实验源码和脚本

芯片验证日记 来源:芯片验证日记 作者:芯片验证日记 2023-01-11 08:59 次阅读

1.前言

bind是systemverilog中一个重要的知识点,很多时候能够在验证中发挥重要的作用,今天就针对这个知识点做一个梳理,希望能帮助到大家。

2. 为什么需要bind

当RTL已经编写完毕,验证工程师有责任添加断言时。RTL设计者不希望验证工程师为了添加断言而修改其RTL,于是SystemVerilog的绑定特性应运而生。bind可以实现验证和设计的分离,将module/interface/program绑定到任意的设计模块或者其特定例化中,可以将interface直接bind到top module中进行例化。bind可以使得验证工程师不改动或最小的改动原有设计代码和文件结构,就能够实现对设计代码的检查。

SystemVerilog断言(SVA)可以直接添加到RTL代码中,也可以通过bindfile间接添加。实践表明,大多数的断言最好是使用bindfile添加。在独立的文件中写入所有必需的断言,使用bind就可以将断言文件的端口与测试代码中RTL的端口/信号绑定。这是多么酷的一个功能。

3. bind的语法

bind用于指定module、interface、program的一个或多个实例化,而无需修改目标文件的代码。因此,封装在module、interface、program中的插入代码或断言可以以非侵入方式(non-intrusive manner)在目标模块或模块实例中实例化。类似地,封装在接口中的检测代码可以绑定到目标接口或接口实例。

SVA检验器通过关键字bind可以与设计中的任何模块(module)或者实例(instance)绑定。将SVA检验器可以与模块、模块的实例或者一个模块的多个实例进行bind绑定。实现绑定时,使用的是设计中的实际信号,语法如下:


bind ;

这里注意以下几点:

[1] 通过bind语句将SVA的checker与设计模块绑定,等价于将SVA例化到设计模块中。

[2] bind不仅可以将断言与设计module绑定,也可以将任意两个模块之间进行绑定。

[3] bind功能可用于以下位置:

pYYBAGO9SyCAIRw_AAHGbcqxaZs341.png

4. bind的具体应用实例

4.1 通过模块名实现绑定

语法:bind module_name sva_name sva_inst;

具体实例的代码如下图所示:

poYBAGO9S1SAEFLxAAQH_dnyFnw213.png

针对上图中代码的一些解释:

[1] dut 是module的名字

[2] dut_assert 是内部包含 property 以及断言的模块,可以是 module 或者 interface

[3] my_assert是dut_assert的实例化名字

[4] 括号中的信号clk/rst_n/vld/rdy是dut的端口信号,并且连接到dut_assert的对应端口

[5] 包含断言的interface/module,其端口信号的方向均为input,也就是说property中包含的信号都是从该interface/module外部给进来的。

bind成功后,断言会关联到module_name的所有例化示例,sva_inst路径位于rtl_inst下一层,参考下面仿真器中的hierarchy结构:

poYBAGO9S5aAO3B4AALc3gMNbag086.png

具体的实验源代码和脚本,请参考分享的网盘链接中的basic目录。

4.2 通过模块实例化名实现绑定

语法:bind module_name:mudule_inst_name sva_name sva_inst;

具体实例的代码如下图所示:

pYYBAGO9S8yASX9kAAQXjJBVP5g577.png

注意跟4.1的区别:

上图中第64行中,对dut的实例化my_dut1和my_dut2进行bind。

下图中的hierarchy结构图和上图中的代码是正确对应的,这也很好理解。

pYYBAGO9S_-AGAK3AANFJMDf9IA074.png

具体的实验源代码和脚本,请参考分享的网盘链接中的basic目录。

4.3 通过模块名实现bind的另一个例子

前面的例子对bind的基本用法已经讲的很清楚了,下面的例子只是想说明下面这一点:可以将需要的所有断言写入独立的文件中,使用bind也可以将断言文件的端口与测试台代码中RTL的端口/信号绑定。下面是这个例子的详细代码截图。

下图是testbench(最大的module)的代码截图:

pYYBAGO9TDqAMKNdAAPyPv-aTEg495.png

下图是DUT代码的截图:

poYBAGO9TGmATDUCAAGr6CnB2P8445.png

下图是断言模块:

pYYBAGO9TJiADw1DAALrierxAKQ989.png

如下图所示,bind功能单独写在一个独立module中,这种用法EDA工具也是支持的,这是这个例子跟上面例子的最大区别。

pYYBAGO9TMeAcy6OAALWZ0EYUOA867.png

注意理解下图中的hierarchy结构,

pYYBAGO9TPWAemONAAExYw1LjDo190.png

具体的实验源代码和脚本,请参考分享的网盘链接中的asic-world目录。

4.4 参数化bind的实例

从前面的例子,我们可以很好的理解SV中的绑定命令允许向模块添加新功能,通常用于向RTL模块添加新的检查。再往深里研究一下,bind还可以继承参数,绑定模块可以根据其使用位置参数化自身。

下面的代码用于演示bind的参数化特性,该特性允许绑定模块(bdut模块)根据其使用位置参数化自身。

当查看bind语句(下图中第29行)时,它使用的所有参数都没有在第29行定义,但当绑定被激活时,它就有了参数化自身的作用域。其实也很好理解,我们可以想象把第29行粘贴到“dut”中;在那里所有的定制参数都将流到“bdut”的实例化中。

需要注意的一个特殊情况是,第29行的“.Z()”参数化为空。这允许“bdut”的默认值接管。第10行根据参数化在“bdut”中创建“逻辑[X]总线”。这可用于生成参数化覆盖点或其他需要参数化的功能。

poYBAGO9TSyAJdsAAAMuvrwcSLg506.png

具体的实验源代码和脚本,请参考分享的网盘链接中的parameter_bind-master目录。

5. 通过interface实现bind功能

这在用法上跟上面模块的例子一模一样,只是把module换成interface即可,这里就不再赘述了。

6. 赠送实验源码和Makefile脚本

关注微信公众号《芯片验证日记》,后台回复”bind”,可得本文所有的源码和Makefile脚本对应的百度链接,目录如下图所示,这样你就可以在本地复现本文中的所有。

pYYBAGO9TVqAXQBxAABkeriucIU376.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110090
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36939
  • 源码
    +关注

    关注

    8

    文章

    640

    浏览量

    29198
  • Bind
    +关注

    关注

    0

    文章

    5

    浏览量

    7610
收藏 人收藏

    评论

    相关推荐

    从Linux源码分析bind系统调用

    众所周知,一个Server端Socket的建立,需要socket、bind、listen、accept四个步骤。
    的头像 发表于 10-16 11:08 3303次阅读
    从Linux<b class='flag-5'>源码</b>分析<b class='flag-5'>bind</b>系统调用

    SystemVerilog的Virtual Methods

    SystemVerilog多态能够工作的前提是父类的方法被声明为virtual的。
    发表于 11-28 11:12 704次阅读

    关于typedef的用法总结

    关于typedef的用法总结不管实在C还是C++代码,typedef这个词都不少见,当然出现频率较高的还是在C代码。typedef与#define有些相似,但更多的是不同,特别是在
    发表于 09-25 09:11

    Bind源代码包安装

    先到官方下载Bind的安装包 wgetftp://ftp.isc.org/isc/bind9/9.6.0-P1/bind-9.6.0-P1.tar.gz tar xzvf
    发表于 04-04 20:30 23次下载

    OpenCV3编程入门-源码例程全集-resize函数用法示例

    OpenCV3编程入门-源码例程全集-resize函数用法示例
    发表于 09-18 16:38 2次下载

    OpenCV3编程入门-源码例程全集-sobel函数用法示例

    OpenCV3编程入门-源码例程全集-sobel函数用法示例
    发表于 09-18 16:38 1次下载

    OpenCV3编程入门-源码例程全集-Scharr函数用法示例

    OpenCV3编程入门-源码例程全集-Scharr函数用法示例
    发表于 09-18 16:38 0次下载

    OpenCV3编程入门-源码例程全集-remap函数用法示例

    OpenCV3编程入门-源码例程全集-remap函数用法示例
    发表于 09-18 16:38 0次下载

    OpenCV3编程入门-源码例程全集-pyrDown函数用法示例

    OpenCV3编程入门-源码例程全集-pyrDown函数用法示例
    发表于 09-18 16:38 1次下载

    OpenCV3编程入门-源码例程全集-pyrUp函数用法示例

    OpenCV3编程入门-源码例程全集-pyrUp函数用法示例
    发表于 09-18 16:38 0次下载

    STM32实验10输入捕获实验源码

    STM32 实验10 输入捕获实验源码
    发表于 05-05 16:06 7次下载

    SystemVerilog枚举类型的使用建议

    SystemVerilog枚举类型虽然属于一种“强类型”,但是枚举类型还是提供了一些“不正经”的用法可以实现一些很常见的功能,本文将示例一些在枚举类型使用过程的一些“不正经”
    的头像 发表于 09-01 14:20 1713次阅读

    SystemVerilog的Shallow Copy

    SystemVerilog的句柄赋值和对象复制的概念是有区别的。
    的头像 发表于 11-21 10:32 916次阅读

    SystemVerilogifndef如何避免重复编译

    `ifndef是SystemVerilog/Verilog的一种条件编译命令,可以认为其是"if not defined"的缩写,其用法与`ifdef相反,他们主要用来根据其后
    的头像 发表于 06-25 15:59 3259次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>ifndef如何避免重复编译

    什么是bind?你真的熟悉bind吗?

    bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被指定 bind()的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
    的头像 发表于 07-13 09:56 2769次阅读