【SpinalHDL快速入门】5.1、SpinalHDL组织结构之Component和hierarchy

news2024/12/27 12:23:57

文章目录

    • 1.1、简介
    • 1.2、Input / output 定义
    • 1.3、修剪信号(Pruned signals)
    • 1.4、参数化硬件(在Verilog中称为“Parameter”)
    • 1.5、合成组件名称

1.1、简介

就像在 VHDL 和 Verilog 中一样,可以定义组件以用于构建设计层次结构。但是,在 SpinalHDL 中,不需要在实例化时绑定它们的端口

class AdderCell() extends Component {
  // 建议在名为“io”的Bundle中声明外部端口
  val io = new Bundle {
    val a, b, cin = in Bool()
    val sum, cout = out Bool()
  }
  // 执行一些逻辑
  io.sum := io.a ^ io.b ^ io.cin
  io.cout := (io.a & io.b) | (io.a & io.cin) | (io.b & io.cin)
}

class Adder(width: Int) extends Component {
  ...
  // 创建2个AdderCell实例
  val cell0 = new AdderCell()
  val cell1 = new AdderCell()
  cell1.io.cin := cell0.io.cout   // Connect cout of cell0 to cin of cell1

  // 另一个例子,它创建了一个 ArrayCell 实例的数组
  val cellArray = Array.fill(width)(new AdderCell())
  cellArray(1).io.cin := cellArray(0).io.cout   // Connect cout of cell(0) to cin of cell(1)
  ...
}

val io = new Bundle { ... }:建议在名为io的Bundle中声明外部端口。如果您将Bundle命名为io,则SpinalHDL将检查其所有元素是否定义为输入或输出

1.2、Input / output 定义

定义输入和输出的语法如下:

在这里插入图片描述
组件互连需要遵循一些规则:

  • 组件只能读取子组件的输出和输入信号。
  • 与 VHDL 不同,组件可以读取其自身的输出端口值。

如果出于某种原因需要从层次结构较远的位置读取信号(例如进行调试或暂时性修补),可以通过使用 some.where.else.theSignal.pull() 返回的值来实现。

1.3、修剪信号(Pruned signals)

SpinalHDL将生成所有命名信号及其依赖关系,同时从RTL生成中删除所有无用的匿名/零宽度信号。

您可以通过生成的SpinalReport对象上的printPrunedprintPrunedIo函数收集所有已删除无用信号的列表:

class TopLevel extends Component {
  val io = new Bundle {
    val a,b = in UInt(8 bits)
    val result = out UInt(8 bits)
  }

  io.result := io.a + io.b

  val unusedSignal = UInt(8 bits)
  val unusedSignal2 = UInt(8 bits)

  unusedSignal2 := unusedSignal
}

object Main {
  def main(args: Array[String]) {
    SpinalVhdl(new TopLevel).printPruned()
    //This will report :
    //  [Warning] Unused wire detected : toplevel/unusedSignal : UInt[8 bits]
    //  [Warning] Unused wire detected : toplevel/unusedSignal2 : UInt[8 bits]
  }
}

1.4、参数化硬件(在Verilog中称为“Parameter”)

如果您想将组件参数化,可以按照以下方式向组件的构造函数传递参数:

class MyAdder(width: BitCount) extends Component {
  val io = new Bundle {
    val a, b   = in UInt(width)
    val result = out UInt(width)
  }
  io.result := io.a + io.b
}

object Main {
  def main(args: Array[String]) {
    SpinalVhdl(new MyAdder(32 bits))
  }
}

如果您有多个参数,最好按照以下方式提供特定的配置类:

case class MySocConfig(axiFrequency  : HertzNumber,
                       onChipRamSize : BigInt,
                       cpu           : RiscCoreConfig,
                       iCache        : InstructionCacheConfig)

class MySoc(config: MySocConfig) extends Component {
  ...
}

您可以在配置文件中添加功能,以及对配置属性的要求:

case class MyBusConfig(addressWidth: Int, dataWidth: Int) {
  def bytePerWord = dataWidth / 8
  def addressType = UInt(addressWidth bits)
  def dataType = Bits(dataWidth bits)

  require(dataWidth == 32 || dataWidth == 64, "Data width must be 32 or 64")
}

1.5、合成组件名称

在一个模块中,每个组件都有一个名称,称为“部分名称”。 “完整”名称是通过将每个组件的父级名称与“_”连接而构建的,例如:io_clockDomain_reset。您可以使用setName来替换此约定以使用自定义名称。这在与外部组件进行接口时特别有用。其他方法分别称为getNamesetPartialNamegetPartialName

合成时,每个模块都获得定义它的Scala类的名称。您也可以使用setDefinitionName覆盖此设置。

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

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

相关文章

Tableau招聘信息数据可视化

获取的招聘信息数据为某招聘网站发布的大数据及数据分析相关岗位,对其他计算机相关岗位的招聘信息数据分析也有一定的参考价值。因为所获取的招聘信息数据数量只有1万左右,实际的招聘信息数量肯定不止1万,所以可能会与实际信息有一定的误差。…

chatgpt赋能python:Python安装Gurobi优化器详细步骤

Python安装Gurobi优化器详细步骤 如果你是一个数据科学家或者运筹学专业的研究者,你肯定会经常接触到优化问题。Gurobi是一个流行的线性与整数规划优化软件包,它提供了出色的线性规划和整数规划支持,速度快,准确度高,…

nginx(八十三)error_page、proxy_intercept_errors深究

一 error_page和proxy_intercept_errors深究 强调: 本文只是基于状态码的角度来讨论error_page、proxy_intercept_errors差异性题外话: 让别人定位,一定要保留好事故现场,尽可能的提供更多的有用信息核心: 本文只讨论错误状态码的异常处理遗…

信息系统设计与分析

系统分析师作用 1. 业务需求 现有组织结构、组织目标、管理模式 部门业务、业务流程、业务规则 业务数据、业务过程与业务管理直接关系 业务优化与业务再造要求 2. 用户需求分析 新系统改进业务要求 对新系统的愿景与期望 对新系统使用要求 3. 系统需求分析 系统应具有哪些功能…

【JavaSE】Java(五十三):核心要点总结

文章目录 1. 简要说下什么是反射2. 什么是java序列化,什么情况下需要序列化3. 为什么需要克隆,如何实现克隆,深拷贝和浅拷贝区别4. throw 和 throws 区别5. final、finaly、finalize 区别 1. 简要说下什么是反射 Java反射是指在运行时获取类信…

chatgpt赋能python:Python安装dialog介绍

Python安装dialog介绍 Dialog是一个命令行工具,可以帮助用户在Linux系统中创建自定义对话框。它可以与多种编程语言一起使用,其中包括Python。在本文中,我们将详细介绍如何在Python中安装Dialog。 安装Dialog前的准备工作 在安装Dialog之前…

Git 命令行提交代码详细操作

Git 命令行提交代码操作(安装git后,鼠标右键打开Git Bash) 1、查看本地git绑定的用户名和邮箱: git config user.name git config user.email 2、① 修改本地git绑定的用户名和邮箱(全局): git config --global user.name “Your_userName” …

案例28:基于Springboot毕业设计系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

视频直播播放器弹幕功能API

POLYV播放器拥有弹幕功能,可以增加观看视频时的互动性。 功能API 参数 参数名类型默认值说明danmuEnablebooleanfalse是否开启弹幕功能showDanmubooleantrue开启弹幕功能后,弹幕初始显示状态。false则一开始不显示弹幕。banDanmuBtnbooleanfalse为true时…

【Vue】三:Vue组件: 组件使用和组件嵌套

文章目录 1.第一个组件1.1不使用组件前1.2创建组件1.3注册组件1.4使用组件1.5 细节 2.组件嵌套 1.第一个组件 1.1不使用组件前 1.2创建组件 Vue.extends({该配置项和new Vue的配置项几乎相同})区别: (1)创建Vue组件的时候,不能使…

MySQL 查询分析

一个低效查询引发的思考 上次在做银行对账,上传对账单后,出现对账超时的情况。查看日志发现,最后一条日志记录停在了对 c2c_zwdb.t_file_count 的查询 sql 上。使用 show processlist 命令来查看当前 SQL 的执行情况,如下&#x…

说说验证码功能的实现

前言 大家好,我是 god23bin,今天说说验证码功能的实现,相信大家都经常接触到验证码的,毕竟平时上网也能遇到各种验证码,需要我们输入验证码进行验证我们是人类,而不是机器人。 验证码有多种类型&#xff…

chatgpt赋能python:使用Python安装Gensim:简单而强大的自然语言处理库

使用Python安装Gensim:简单而强大的自然语言处理库 Gensim是一个Python库,它为自然语言处理任务和文本处理任务提供了简单而强大的接口。它可以用于文本相似性计算、主题建模、词嵌入和其他自然语言处理任务。Gensim库的优点之一是其简单性和易用性。在…

评述:量子传感器正掀起一场商业革命

光子盒研究院出品 量子传感器利用原子和光的基本属性来对世界进行测量。粒子的量子状态对环境极为敏感,这对传感来说是一个优点、但对制造量子计算机来说则是一个问题。使用粒子作为探针的量子传感器可以比设计的或基于化学或电信号的经典设备更精确地量化加速度、磁…

4.3 - 信息收集 - 端口扫描,操作系统识别

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」:此文章已录入专栏《网络安全快速入门》 端口&系统版本 一、端口扫描1、telnet2、Nmap3、Masscan 二、操作系统…

【链表的分类】

链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。根据节点的连接方式和节点的性质,链表可以分为多种类型。 单向链表(Singly Linked List) 单向链表是最基本的链表类…

Rust每日一练(leetDay0023) 二进制求和、左右对齐、平方根

目录 67. 二进制求和 Add Binary 🌟 68. 文本左右对齐 Text Justification 🌟🌟🌟 69. x 的平方根 Sqrt x 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Pytho…

低压安全用电云平台隐患故障的应用设计 安科瑞 许敏

前言:低压安全用电系统是保障用电质量的重要依托,也是增强用电安全性的根本依据。而在其中应用物联网技术,可进一步提升监测效率。在此之上,文章简要分析了低压安全用电系统的设计基准与监测内容,并通过科学制定系统建…

IMX6ULL裸机篇之I2C实验之从设备代码实现

一. I2C实验 本文介绍 I2C实验,关于 从设备 AP3216C传感器的I2C代码实现。 AP3216C从设备是 三合一传感器,即作为 I2C通信中从设备使用。 以下文章是关于 I2C实验,关于主控制器(即主设备)端的 I2C代码实现&#xff…

LinkedList源码

介绍 基于双向链表实现线程不安全插入删除效率较高&#xff0c;但不支持随机查找 public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable常量&变量 // 元素数量transient…