【路科V0】systemVerilog基础4——接口类型

news/2024/5/19 19:13:49 标签: 数字验证, systemVerilog

        Verilog是通过模块之间进行端口连接来完成模块间通信的。对于大型设计,通过端口进行连接将会让硬件集成变得乏味和容易出错。SV在Verilog语言基础上扩展了接口(interface) 。

 接口

接口(interface)的特点: 

  • 接口提供了一种新型的面向抽象级建模的方式。
  • 接口的使用可以简化建模和验证大型复杂的设计。

使用Verilog的模块端口与SV的接口之间的比较

要集成一个子系统,包括处理器单元、存储单元、测试单元的连接等

Verilog的方式

按照以下步骤进行:

  • 逐一对每一个子模块进行端口声明。
  • 在上层环境,需要声明非常多的线网用来在各个模块之间进行连接。

Verilog方式的缺点:

  • 对于标准的总线端口也不得不在多个模块重复声明。
  • 相应的通信协议也不得不在多个模块中重复定义。
  • 在不同模块之间的连接可能会出现不匹配的信号声明和连接。
  • 一个设计发生了变化,可能会影响多个模块的端口声明和连接。

Verilog代码:

        可以看到需要声明许多对应的线网,利用这些线网与目标模块进行连接。而且还需要连接其余四个模块。

        将这种场景扩展到数十甚至上百个模块,在系统层集成,可以看到顶层集成的工作量相当可观。 

SV方式 

        SV添加了新的抽象端口类型interface。
        interface允许多个信号被整合到一起用来表示一个单一的抽象端口。

 使用SV接口更新的代码:

        可以看到多个模块可以使用同一个interface,继而避免分散的多个端口信号连接。继而简化了连接,降低了端口连接不匹配的风险。

和之前Verilog代码做对比:

        可以看到SV代码 ,集成部分得到了极大的简化。这是因为,把处理单元的数据总线、信号,在接口类型main_bus中,而处理器端口的声明也得到了简化。以至于在顶层连接时,可以通过接口的例化与处理器接口类型端口进行连接,简化了集成的过程。同时也让后期接口信号的维护变得更加方便。

接口特点:

  • 接口不仅可以包含变量或者线网,还可以封装模块之间通信的协议。(不管变量还是函数都可以置于其中)
  • 此外接口中还可以嵌入与协议有关的断言检查、功能覆盖率收集等模块。

接口与模块的定义有许多相似之处 :

  • 接口的定义同模块定义类似。
  • 接口也可以有端口,例如外部接入的时钟或者复位信号。
  • 接口内部可以声明所有的变量或者线网类型。
     

 接口和模块的区别:

  • 接口不同于模块的地方在于,接口不允许包含设计层次,即接口无法例化模块,但是接口可以例化接口。
  • 可以在接口声明modport来约束不同模块连接时的信号方向。

问题:为什么接口中的变量或者线网类型没有声明方向?

        在与多个模块连接时,可以会被用作驱动或者负载,即用作不同的连接方向

 接口的例化

 接口的例化

  •  接口的例化方式同模块例化一致。
  • 模块的端口如果声明为input、output或者inout,那么在例化时可以不连接。
  • 模块的端口如果声明为interface,那么在例化时则必须连接到一个接口实例,或者另外一个接口端口。

 索引接口中的信号

        如果一个模块拥有一个接口类型端口,那么要索引该接口中的信号,需要通过以下方式进行:

<接口名>.<接口内部信号名>
always @(posedge bus.clock, negedge bus.resetN)
...

·slave模块的多个端口,都被整合到main_bus中,在slave模块内部定义时,可以通过接口类型的端口bus去访问内部信号。这使得以往Verilog的端口声明代码得到了极大的简化,同时加强关联端口的内聚性。

modport

         接口中的变量或者线网信号,对于连接到该接口的不同模块则可能具备着不同的连接方向。

        接口引入了modport来作为moduleport的缩写,表示不同的模块看到同一组信号时的视角(连接方向)。

        在接口中声明modport,需要指明modport中各个信号的方向。

示例: 

  • chip_bus中的各个信号如ready、data没有方向 
  • 两个单元模块slave和master中的连接又不相同
  • 可以进一步声明modport master和modport slave。
  • 保证接口内的信号,在连接不同模块时,通过与modport 对接,来避免方向接错的意外。

 当一个模块在例化时,可以选择连接到interface端口中具体的某一个modport。 

        这种方式可以降低方向连接错误的可能,进而避免信号多驱动的情况。

 验证中的应用

 利用接口,也可以将测试平台同DUT连接在一起。

  • 测试模块:testbench
  • 待测设计模块: arbiter

测试模块通过接口像待测设计发送激励信号,通过接口监测待测设计的输出信号

接口的总结 

  •  接口提高了建模级别,接口对于设计复用非常有利。
  • 接口减少了模块之间错误连接的可能性。
  • 如果要添加新的信号,只需要在接口中声明,而不必在模块中声明。
  • 由于接口将有关信号都集合在一起,因此在使用这些信号时需要添加接口实例名。
  • 一种接口往往会将有关的信号集合在一起,对于拥有多组不相关信号的设计而言,它需要有多个接口才能完成与其它模块的连接。

http://www.niftyadmin.cn/n/586961.html

相关文章

vitess介绍

简介 Vitess 是一种用于部署、扩展和管理大型开源数据库实例集群的数据库解决方案。 它目前支持 MySQL、Percona 和 MariaDB。 它的架构设计为在公共或私有云架构中与在专用硬件上一样有效地运行。 它结合并扩展了许多重要的 SQL 功能和 NoSQL 数据库的可扩展性。 Vitess 可以…

JavaScript学习四(object对象,数组,)

1.定义对象 var a new Object(); //表示定义了一个对象 2.给对象添加内容 a.name "zhangsan"; a.score 99; //直接往定义的对象里面添加属性,不用事先和java一样进行定义 alert(a.name);//输出对象a的姓名 3.数组定义 var a new Array();//定义一个数组 a[0…

vitess与mysql的兼容性

支持的mysql 版本 5.6-8.0&#xff0c;但是5.6 从2021年2月不更新了&#xff0c;所以建议5.7之后版本 事务隔离级别 vitess: read committedmysql default: pepeatable read SQL语法 https://github.com/vitessio/vitess/blob/main/go/vt/vtgate/planbuilder/testdata/uns…

【Java并发面试】10道不得不会的Java并发基础面试题

博主介绍&#xff1a; &#x1f680;自媒体 JavaPub 独立维护人&#xff0c;全网粉丝15w&#xff0c;csdn博客专家、java领域优质创作者&#xff0c;51ctoTOP10博主&#xff0c;知乎/掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和副业。&#x1f680; 公众号&…

linux命令学习(date,cal,df,free,exit,pwd,ls,cd,file,less,通配符)

注:关于粘贴复制 。X 窗口系统 (使 GUI 工作的底层引擎)内建了一种机制,支持快速拷贝和粘贴技巧。 如果你按下鼠标左键,沿着文本拖动鼠标(或者双击一个单词)高亮了一些文本, 那么这些高亮的文本就被拷贝到了一个由 X 管理的缓冲区里面。然后按下鼠标中键, 这些文本就被粘贴到光…

Kibana 使用简介及查询条件示例

博文由来&#xff1a; 日志组件对于任意一个大型的系统的重要性不言自明。一般互联网企业的日志组件这一块的架构都是选用 ELK(ElasticSearch Logstash Kibana)&#xff0c;其中 L 也会替换成 logback 等&#xff1b;而查询日志的组件基本上选择余地不多&#xff0c;就是使用…

mysql GTID看这一篇就够啦

GTID看这一篇就够啦 这里讲的gtid是5.7版本的&#xff0c;5.7版本比5.6有一些增强&#xff0c;比如在线开启等 GTID (Global Transaction ID)是全局事务ID,当在主库上提交事务或者被从库应用时&#xff0c;可以定位和追踪每一个事务&#xff0c;比如主库新事务都有一个全局I…

Java 枚举总结

也许枚举没有什么好说的&#xff1f;那就错了。 在实战、实践的过程中&#xff0c;对于枚举的理解一步步加深&#xff0c;本文也会持续更新。 1. 不要在枚举类里面定义 name 属性&#xff1a; private String name; 假设现在有这么一个枚举类&#xff1a; Getter AllArgsCons…