数字硬件建模SystemVerilog-通信总线建模 --Interface和modport

news2024/11/13 11:10:56

7cf9562d8d1a8581371dec127f0a64d8.png

来到了SV最后一部分,预计三篇文章,两周更完,所有的思维导图如下:

129e41dbfc3f632c59b1e06d3a8a1892.png

概述

SystemVerilog Interface是modport的一种,但比简单的输入、输出或输入输出端口的功能更多。在其最简单的形式中,Interface端口将相关的信号捆绑在一起作为一个单一的复合端口。例如,构成AMBA AXI总线的所有单个信号都可以被归纳为一个Interface端口。一个Interface可以做的不仅仅是封装总线信号。SystemVerilog Interface为设计者提供了一种集中总线功能的方法,而不是将功能分散在设计中的几个模块中。这就模拟了设计工程师在RTL层面的工作,并让综合工作在整个设计中适当地分配门级总线硬件。

当遵循特定的建模准则和限制时,Interface是可以综合的。Interface也可以用在不可综合级别的建模,并作为验证测试平台的一部分。先进的验证方法,如UVM 、OVM和VMM,都使用Interface。

使用Interface作为modport

  • interface:定义interface模块以关键字interface和endinterface结尾,内部通过定义输入输出信号和对应的logic信号,注意,双态信号不可以定义为logic。定义好了interface后,需要在top层将interface进行例化。

  • modport:使用modport来对上述信号接口进行一个分组和方向指定,这样会使得接口更加条理清晰。在顶层top中例化test时参数还是接口(模块内部是modport)

一个模块的端口可以被声明为一个Interface类型,而不是传统的输入、输出或inout端口。一个模块可以有任意数量的interface,interface可以与其他端口以任意顺序连接。本书中的例子将Interface端口列在前面,只是为了强调Interface端口的作用。

有两种风格的Interface端口声明--通用和特定类型。这两种风格都是可以综合的。

通用Interface端口

一个通用的Interface端口通过使用关键字interface来定义端口的类型。而不是使用一个特定的Interface类型的名称。语法是:

module <module name>(Interface<port_name>)

当module被实例化时,任何类型的Interface都可以被连接到通用Interface端口。这就提供了灵活性,同一个模块可以用多种方式使用,不同的Interface连接到模块上。在下面的例子中,模块bridge被定义为有两个通用Interface端口。每个通用Interface端口可以有一个ahb_bus Interface实例或一个Interface端口。

4ab0fd8a5af51842770897d024697231.png

特定类型的Interface端口

一个modport可以被明确地声明为一个特定类型的Interface。一个特定类型的接口端口是通过使用一个Interface的名称作为端口类型来声明的。语法是:

module <module name> (<interface name><port_name>)。

比如说:

d76c9a4a4ecaa744d9ca71c96e617709.png

一个特定类型的Interface端口只能连接到同一类型的Interface实例上。在上面的例子中,高层网表可以实例化CACHE模块并连接一个ahb_bus Interface的实例,但不能连接一个usb_bus Interface的实例。如果错误的Interface实例类型被连接到特定类型的Interface端口,仿真器或综合工具将发出一个阐述错误。特定类型的Interface端口确保错误的Interface不会被无意中连接到端口上。明确命名可以连接到端口的Interface类型,也使端口类型对其他需要审查或维护模块的人更加明显。有了特定类型的Interface端口,就更容易看清端口的确切使用方式。

最佳实践指南10-2
为RTL模型使用特定类型的Interface端口。不要在设计模块中使用通用的interface。

一个模块的功能需要引用Interface内的信号。对于特定类型的Interface,Interface内的信号名称在编写模块的时候就已经知道了,可以毫无顾虑地引用。对于通用Interface端口,不能保证连接到模块Interface端口的每个Interface实例都有相同的信号名称。

Interface modports

Interface为简化模块间的连接提供了一种实用而直接的方法。然而,连接到一个Interface的每个模块可能需要看到Interface内信号的独特视图。例如,在AHB总线上,hwdata信号是主模块的输出,而同样的hwdata是同一总线上从属模块的输入。

SystemVerilog Interface提供了一种方法来定义Interface信号的不同视图,这样每个模块都能看到具有正确端口方向的Interface端口。这个定义是在Interface中使用modport关键字进行的。Modport描述了Interface所代表的modport。一个Interface可以有任意数量的modport定义,每个定义都描述了一个或多个其他模块如何看待Interface内的信号。

一个modport定义了模块在Interface中看到的信号的端口方向。modport的定义并不重复已经在Interface信号声明中定义的向量大小和类型信息。一个modport只定义连接模块是否将一个信号视为输入、输出、inout端口。

下面的界面中显示了两个modport声明的例子。

587c2b7719a58e3f4a773fdb9d071cfb.png

指定使用哪种modport

SystemVerilog提供了两种方法来指定一个模块Interface端口应该使用哪种modport。

  • 作为模块定义中Interface端口声明的一部分

  • 作为与模块实例的接口连接的一部分

这两种方式都是可以综合的,但将modport作为modport定义的一部分来指定有一些优势,这将在下面几段中讨论。

在模块的interface声明中选择modport。要从一个Interface使用的特定调制端口可以直接指定为模块内Interface端口声明的一部分。要连接到Interface的modport被指定为:

<interface_name>.<modport_name>

比如说。

86d3f3eb15a0facb42c4ec01836b2fab.png

只有特定类型的Interface端口可以指定一个modport作为端口声明的一部分。通用Interface端口不能指定一个modport。

在实例化和连接这个主模块的上级模块,Interface的一个实例被连接到modport,而不指定modport的名称。例如:

adb5484aad4e3882190d49ca7a7345b0.png

在module实例中选择modport。另一种编码方式是不在模块定义中选择modport,而是将modport的选择推迟到模块实例化时进行。下面的例子声明了第一个从属模块的端口作为simple_ahb Interface端口,但没有指定使用哪个modport定义。

cd59cfdd9e4b244d70208bb07d2c36e8.png

然后可以在模块实例化时指定Interface的具体模口,将一个Interface的实例连接到一个模块实例。该连接被指定为:

<interface instance_name>.<modport_name>

比如说。

48fd8980a2c7b602641ea98c87a14ab2.png

当在模块实例中指定要使用的modport时,模块定义可以使用特定类型的Interface端口或通用Interface端口类型。

注意事项
一个modport可以在模块端口定义或模块实例中选择,但不能同时选择。
最佳实践指南10-3
选择模块使用的modport作为模块的Interface端口声明的一部分。不要在网表级别选择modport。

将modport作为端口声明的一部分来指定,还可以使模块独立于其他模块进行综合。它还有助于使模块更加自我记录。阅读或维护该模块的工程师可以立即看到哪一个modport将被用于该模块。

在不指定modport的情况下连接到Interface。模块Interface端口可以连接到一个Interface实例,而不需要指定具体的modport定义。当没有指定modport时,Interface中的所有wire都被假定为有一个双向的inout方向。在仿真中,Interface中的变量被假定为ref类型。(ref端口允许端口的两边都可以读取和修改变量。ref端口是不可综合的,在本书中没有讨论)。综合编译器将没有指定modport的Interface端口中的所有信号视为inout双向端口。

使用modports来定义不同的连接集

在一个由几个不同模块使用的比较复杂的Interface中,可能不是每个模块都需要看到Interface中的同一组信号。Modports使得为每个使用该Interface的模块创建一个自定义的Interface视图成为可能。

一个模块只能访问其modport定义中列出的信号。这使得Interface中的一些信号有可能被完全隐藏,不被某些模块看到。例如,Interface可能包含一些信号,只有通过master_ports modport连接到Interface的模块才能使用,而通过s1ave_ports modport连接的模块不能使用。

完整的AMBA AHB总线有19个信号,其中有几个信号只由总线主机使用,而不是由总线从机使用。

下面的例子说明了一个自定义版本的simple_ahb Interface,增加了3个额外的AMBA AHB信号-hprot ,hburst和htrans,只被主模块使用。master_ports和slave_ports的modport声明确保主模块和从模块看到各自模块的正确信号集。

例10-5: 用modports的Interface来定制Interface信号的视图
///
// Simple AMBA AHB Interface
///
//`begin_keywords "1800-2012"
interface simple_ahb (
  input logic  hclk,    // bus transfer clk
  input logic  hresetN  // bus reset, active low
);
  logic [31:0] haddr;   // transfer start address
  logic [31:0] hwdata;  // data sent to slave
  logic [31:0] hrdata;  // return data from slave
  logic [ 2:0] hsize;   // transfer size
  logic        hwrite;  // 1 for write, 0 for read
  logic        hready;  // 1 for transfer finished
  // additional AHB signals only used by bus master
  logic [ 3:0] hprot;   // tranfer protection mode
  logic [ 2:0] hburst;  // transfer burst mode
  logic [ 1:0] htrans;  // transfer type

  // master module port directions
  modport master_ports (
    output haddr, hwdata, hsize, hwrite, // to AHB slave
    input  hrdata, hready,               // from AHB slave
    input  hclk, hresetN,                // from chip level
    // additional AHB signals only used by bus master
    output hprot, hburst, htrans
  );

  // slave module port directions
  modport slave_ports (
    output hrdata, hready,               // to AHB master
    input  haddr, hwdata, hsize, hwrite, // from AHB master
    input  hclk, hresetN                 // from chip level
  );
endinterface: simple_ahb
//`end_keywords

使用 simple_ahb .master_ports modport 的模块可以使用 hprot, hburst和 htrans 信号。一个使用simple_ahb.slave_ports modport的模块不能访问这3个信号。因为这些信号没有在slave_ports modport中列出,就好像这些信号根本不存在一样。

也有可能在一个Interface内有内部信号,这些信号通过任何modport都不可见。这些内部信号可能被lint检查器或Interface中的其他功能所使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Tailwind CSS创建自定义动画,进阶您的前端开发技能

从零开始&#xff0c;探索如何使用 TailwindCSS 自定义动画 Tailwind CSS是一种颠覆性的CSS框架&#xff0c;改变了开发者处理前端开发的方式。它的低级性和移动优先的方法使得它成为设计独特、响应式和可扩展的网页设计的热门选择。此外&#xff0c;它还具有强大的动画支持&am…

13共模电感

目录 一、原理 二、差模噪声和共模噪声主要来源 三、共模电感如何抑制共模信号 四、共模电感的选取 一、原理 在介绍共模电感之前先介绍扼流圈&#xff0c;扼流圈是一种用来减弱电路里面高频电流的低阻抗线圈。为了提高其电感扼流圈通常有一软磁材料制的核心。共模扼流圈有…

Django企业it资产管理系统

背景 21世纪&#xff0c;我国早在上世纪就已普及互联网信息&#xff0c;互联网对人们生活中带来了无限的便利。像大部分的公司都有自己的系统&#xff0c;由从今传统的管理模式向互联网发展&#xff0c;如今开发自己的系统是理所当然的。那么开发企业it资产管理系统意义和用处…

JavaWeb开发学习笔记_Vue

JavaWeb开发学习笔记_Vue Vue快速入门常用指令v-bind和v-modelv-onvif和vshowvfor 案例生命周期参考 Vue快速入门 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible"…

Windows上使用CLion配置OpenCV环境,亲测可用的方法(一)

一、Windows上使用CLion配置OpenCV环境&#xff0c;亲测可用的方法&#xff1a; Windows上使用CLion配置OpenCV环境 教程里的配置&#xff1a; widnows 10 clion 2022.1.1 mingw 8.1.0 opencv 4.5.5 Cmake3.21.1 我自己的配置&#xff1a; widnows 10 clion 2022.2.5 mingw 8.…

Flink 2.0 启航,开启全新篇章

我们已经在开发者邮件列表上发起了关于 Flink 2.0 版本计划的讨论。我们相信现在是时候启动这个计划了&#xff0c;以便在明年作为 Apache Flink 的十周年庆典推出这个版本。欢迎大家参加关于 Flink 2.0 的愿景、功能、时间表、流程、路线图等方面的讨论&#xff01; 开发者邮件…

04.DolphinScheduler使用详细介绍

文章目录 创建Worker分组-指定执行机器使用创建执行脚本用户 执行脚本执行Shell脚本执行Spark任务执行Spark任务可能的报错Storage service config does not exist! 执行Hive任务执行HTTP任务创建任务任务参数任务样例 参数使用内置参数基础内置参数衍生内置参数画布中引用方法…

拓展业务规模 | 2023 Google 游戏开发者峰会

将游戏拓展到 PC 端&#xff0c;在很大程度上能够帮助您向更多玩家展示游戏魅力&#xff0c;进一步提高用户覆盖率、互动度和 ROI&#xff0c;并在 Google Play 平台上构建高质量的游戏。Google Play 游戏电脑端的每次更新&#xff0c;都旨在让您的跨平台开发更加轻松&#xff…

初探 VS Code + Webview

本文作者为 360 奇舞团前端开发工程师 介绍 VSCode 是一个非常强大的代码编辑器&#xff0c;而它的插件也非常丰富。在开发中&#xff0c;我们经常需要自己编写一些插件来提高开发效率。本文将介绍如何开发一个 VSCode 插件&#xff0c;并在其中使用 Webview 技术。首先介绍一下…

功率放大器在MTT检测超声医疗中的应用

实验名称&#xff1a;MTT检测超声激活血卟啉对SW-480细胞的杀伤作用 研究方向&#xff1a;超声医疗 测试目的&#xff1a; 自提出激光与血卟啉结合具有明显的抗肿瘤效应&#xff0c;PDT法在诊治肿瘤方面已做了大量研究并在临床中得到应用。但由于激光对组织穿透力较差&#xff…

C语言CRC-8 ROHC格式校验函数

C语言CRC-8 ROHC格式校验函数 CRC校验基于前处理和后处理的不同&#xff0c;由不同的协会标准推出了一些不同格式的版本。这里介绍CRC-8 ROHC格式的校验函数。 CRC-8 ROHC格式特征 标准CRC-8的校验函数参考&#xff1a; C语言标准CRC-8校验函数 CRC-8 ROHC格式有如下的不同&…

Numpy从入门到精通——详解广播机制

这个专栏名为《Numpy从入门到精通》&#xff0c;顾名思义&#xff0c;是记录自己学习numpy的学习过程&#xff0c;也方便自己之后复盘&#xff01;为深度学习的进一步学习奠定基础&#xff01;希望能给大家带来帮助&#xff0c;爱睡觉的咋祝您生活愉快&#xff01; 这一篇介绍《…

机器学习-线性模型(波士顿房价预测)

机器学习-线性模型(波士顿房价预测) 文章目录 机器学习-线性模型(波士顿房价预测)人工智能、机器学习、深度学习的关系机器学习深度学习 波士顿房价预测数据集介绍模型假设 → \rightarrow →线性回归模型评价函数 → \rightarrow →均方误差线性回归模型网络结构实现波士顿房价…

HummerRisk V1.0 安装部署指南

HummerRisk v1.0 开始采用 springcloud 微服务架构&#xff0c;微服务架构更加易于扩展、易于容错、灵活部署&#xff0c;但是需要注意的是 HummerRisk v0.x 版本无法直接升级到 v1.0&#xff0c;如需使用 HummerRisk 请手动安装最新版本。 环境要求 全新安装的 Linux(x64)需要…

HashMap详解

手撕HashMap源码 HashMap一直是面试的重点。今天我们来了解了解它的源码吧&#xff01; 首先看一下Map的继承结构图 源码分析 什么是哈希 **Hash&#xff0c;一般翻译做“散列”&#xff0c;也有直接音译为“哈希”的&#xff0c;就是把任意长度的输入&#xff0c;通过散列算…

【Python语法系列】第三章:Python判断语句

进行逻辑判断&#xff0c;是生活中常见的行为。同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能&#xff0c;一个逻辑判断的流程非常简单&#xff0c;我们有一个判断的条件&#xff0c;那么他无非给我们返回两个结果&#xff0c;是或者否&#xff0c;是的…

Ubuntu22.04部署Pytorch2.0深度学习环境

文章目录 安装Anaconda创建新环境安装Pytorch2.0安装VS CodeUbuntu下实时查看GPU状态的方法小实验&#xff1a;Ubuntu、Windows10下GPU训练速度对比 Ubuntu安装完显卡驱动、CUDA和cudnn后&#xff0c;下面部署深度学习环境。 &#xff08;安装Ubuntu系统、显卡驱动、CUDA和cudn…

成本降低33%!英飞凌挑战智能汽车「高功率密度」瓶颈

伴随着汽车电动化、智能化的逐步推进&#xff0c;功率半导体器件的需求激增。其中&#xff0c;MOSFET作为新能源汽车中DC-DC、OBC等电源系统的重要组成部分&#xff0c;应用于汽车动力域以完成电能的转换与传输。同时&#xff0c;MOSFET还是可以用于ADAS、安全、信息娱乐等功能…

华为流程体系:MPP流程

今天主要来讲讲IPD中营销侧的另一个流程&#xff1a;MPP 流程。 在讲解MTL流程时&#xff0c;提到过MTL流程的底层逻辑是4C营销理论。 换句话说就是&#xff0c;MTL 流程是面向客户的产品上市流程。 而MPP流程则是面向产品的上市流程&#xff0c;它的底层逻辑就是经典的4P营…

新工具、新升级,推陈出新的测试好帮手

前言 【推陈出新】才是我们搞IT的正确发展方向&#xff0c;我们要以发展的眼光来看待我们使用的测试工具&#xff0c;如何升级您手中的测试工具&#xff0c;我们来品一品Eoink的Apikit五个维度对比我们之前用的测试工具&#xff1f; 我会按照&#xff1a;基础功能全面与否、大型…