chisel可选值/模式匹配实例

2023-11-03

一、scala可选值语法

可选值就是类型为Option[T]的一个值。其中,Option是标准库里的一个密封抽象类。T可以是任意的类型,例如标准类型或自定义的类。并且T是协变的,简单来说,就是如果类型T是类型U的超类,那么Option[T]也是Option[U]的超类。

Option类有一个子类:Some类。通过“Some(x)”可以构造一个Some的对象,其中参数x是一个具体的值。根据x的类型,可选值的类型会发生改变。例如,Some(10)的类型是Option[Int],Some(“10”)的类型是Option[String]。由于Some对象需要一个具体的参数值,所以这部分可选值用于表示“有值”。

Option类还有一个子对象:None。它的类型是Option[Nothing],是所有Option[T]类型的子类,代表“无值”。也就是说,Option类型代表要么是一个具体的值,要么无值。Some(x)常作为case语句的返回值,而None常作为通配模式的返回值。需要注意的是,Option[T]和T是两个完全没有关系的类型,赋值时不要混淆。

如果没有可选值语法,要表示“无值”可能会选用null,这就必须对变量进行判空操作。在Java里,判空是一个运行时的动作,如果忘记判空,编译时并不会报错,但是在运行时可能会抛出空指针异常,进而引发严重的错误。有了可选值之后,首先从字面上提醒读者这是一个可选值,存在无值和有值两种情况;其次,最重要的是,由于Option[T]类型与T类型不一样,赋值时就可能需要先做相应的类型转换。类型转换最常见的方式就是模式匹配,在这期间可以把无值None过滤掉。如果不进行类型转换,编译器就会抛出类型错误,这样在编译期就进行判空处理进而防止运行时出现更严重的问题。

可选值提供了一个方法isDefined,如果调用对象是None,则返回false,而Some对象都会返回true。还有一个方法get,用于把Some(x)中的x返回,如果调用对象是None则报错。

  • 当我们访问一个map缺少的键/值对时,就会出现一个运行时错误:
val map = Map("a" -> 1)
val a = map("a")
println(a)
val b = map("b")
println(b)

1
java.util.NoSuchElementException: key not found: b
scala.collection.immutable.Map M a p 1. a p p l y ( M a p . s c a l a : 114 ) a m m o n i t e . Map1.apply(Map.scala:114) ammonite. Map1.apply(Map.scala:114)ammonite.sess.cmd2 H e l p e r . < i n i t > ( c m d 2. s c : 4 ) a m m o n i t e . Helper.<init>(cmd2.sc:4) ammonite. Helper.<init>(cmd2.sc:4)ammonite.sess.cmd2 . < i n i t > ( c m d 2. s c : 7 ) a m m o n i t e . .<init>(cmd2.sc:7) ammonite. .<init>(cmd2.sc:7)ammonite.sess.cmd2$.(cmd2.sc:-1)

  • 但是,Map通过get方法提供了另一种访问键/值的方法。使用它将返回一个抽象类Option类型的值。Option有两个子类,Some 和 None
val map = Map("a" -> 1)
val a = map.get("a")
println(a)
val b = map.get("b")
println(b)

Some(1)
None
map: Map[String, Int] = Map(“a” -> 1)
a: Option[Int] = Some(1)
b: Option[Int] = None

  • Option类也提供了get方法,用来获取Some包含的具体数值,但是不能用None去调用,否则会报错;对于这种情况,我们可以使用getOrElse方法,当 None调用该方法时,可以返回指定的默认值。
val some = Some(1)
val none = None
println(some.get)          // Returns 1
// println(none.get)       // Errors!
println(some.getOrElse(2)) // Returns 1
println(none.getOrElse(2)) // Returns 2

1
1
2
some: Some[Int] = Some(1)
none: None.type = None

个人觉得可选值的主要作用是:当你不确定某个数据或者函数的返回值到底有没有值时,你可以将该数据的类型定义成Option[T]类型,这样无论它是有值(如Option[Int])还是没有值(Option[Nothing])都属于同一个类型,这样就不会出错。

二、chisel可选值使用实例

当对象或函数有很多参数时,总是完全地指定它们可能是乏味和容易出错的。使用默认值的话有时参数并没有很好的默认值,那么这种情况下就可以使用Option[T]类型的默认值None

下面的例子是将输入延迟一个时钟周期的模块。如果resetValue=None(这是默认值),则寄存器将没有重置值,并被初始化为 garbage。这可以避免使用正常范围以外的值来表示none,例如使用-1作为重置值来指示此寄存器未被重置。

class DelayBy1(resetValue: Option[UInt] = None) extends Module {
    val io = IO(new Bundle {
        val in  = Input( UInt(16.W))
        val out = Output(UInt(16.W))
    })
    val reg = if (resetValue.isDefined) { // resetValue = Some(number)
        RegInit(resetValue.get)
    } else { //resetValue = None
        Reg(UInt())
    }
    reg := io.in
    io.out := reg
}

三、chisel模式匹配使用实例

上述例子,也可以改成使用模式匹配来实现,如下所示:

class DelayBy1(resetValue: Option[UInt] = None) extends Module {
  val io = IO(new Bundle {
    val in  = Input( UInt(16.W))
    val out = Output(UInt(16.W))
  })
  val reg = resetValue match {
    case Some(r) => RegInit(r)
    case None    => Reg(UInt())
  }
  reg := io.in
  io.out := reg
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

chisel可选值/模式匹配实例 的相关文章

随机推荐

  • Spring Cloud OAuth2(一) 搭建授权服务

    本文内容主要为spring cloud 授权服务的搭建 采用jwt认证 GitHub 地址 https github com fp2952 spring cloud base tree master auth center auth cen
  • [USACO13DEC]Optimal Milking G【线段树维护最大独立集】

    题目链接 P3097 USACO13DEC Optimal Milking G 很明显的是这道题有4e4个点 直接跑最大独立集的话 那么测评机承受不起啊 所以 这里要维护一个区间dp的形式 每个区间有左右两个端点 我们现在要合并两个区间的话
  • HTTP缓存

    HTTP缓存 什么是HTTP缓存 http缓存指的是 当客户端向服务器请求资源时 会先抵达浏览器缓存 如果浏览器有 要请求资源 的副本 就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源 常见的http缓存只能缓存get请求响应的
  • Java中的作用域

    目录 Java作用域 Java中变量类型主要有3种 成员变量 静态变量和局部变量 成员变量或方法也有4种作用域 静态修饰符的特点 静态使用的注意事项 静态的优缺点 当成员变量被静态修饰后 和非静态成员变量的区别 方法作用域 块作用域 基本使
  • 单词搜索--回溯算法

    LeetCode 单词搜索 给定一个二维网格 board 和一个字典中的单词列表 words 找出所有同时在二维网格和字典中出现的单词 单词必须按照字母顺序 通过相邻的单元格内的字母构成 其中 相邻 单元格是那些水平相邻或垂直相邻的单元格
  • UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释

    layoutSubviews总结 ios layout机制相关方法 CGSize sizeThatFits CGSize size void sizeToFit void layoutSubviews void layoutIfNeeded
  • 《软件工程教程》(第2版) 主编:吴迪 马宏茹 丁万宁 第十二章课后习题参考答案

    第十二章 软件项目管理 课后习题参考答案 一 简答题 1 项目管理的定义是什么 简述软件项目管理的过程 答 项目管理的定义 项目管理是以项目为对象 通过使用知识 技能 工具和方法来组织 计划 实施并监控项目 使之满足项目目标需求的过程 一般
  • ipad扩展为Windows的第二屏幕【免费无线版】

    本文参考 Ipad扩展为Windows的第二屏幕 有时候想用ipad作为Windows电脑的第二屏幕 那么我们可以通过spacedesk软件进行无线扩展 1 在电脑和ipad上分别下载spacedesk软件 电脑端 ipad 打开ipad
  • npm ERR! tar.unpack untar error

    今天在使用nam install命令安装第三方node模块时 老是出现这样的问题 npm ERR tar unpack untar error tmp npm 5884 e9fda1ac registry npmjs org npm npm
  • cocos creater 鸿蒙 音频卡死 播放失败 不回调

    cocos creater音频播放失败 不回调 卡死 鸿蒙 问题背景 开发过程中 未发现问题 线上 部分鸿蒙用户反馈 页面卡死没反应 页面不能继续下一步 so 问题有可能是 音频没播出来 或者回调没回来 或者 获取音频的时长错误 测试现场1
  • Objects365数据简介及数据转换为XML格式

    Objects365数据简介及数据转换为XML格式 注 Obj365和COCO数据集转换为xml格式以及转为yolo的txt格式 xml数据统计处理更改见GitHub https github com lidc1004 Object det
  • Jmter自动化

    一 接口测试流程 1 拿到api接口文档 熟悉接口业务 2 编写测试用例 正例 正常参数 是否接口正常 反例 鉴权异常情况 参数异常 兼容性 黑名单 调用次数异常 3 使用接口测试用具 Jmeter 4 无人值守 持续集成 输出报告 二 J
  • Cpp学习——模板

    模板 目录 模板 1 介绍 2 函数模板的使用 3 函数模板的强制转换or显式调用 四 模板的分类 1 介绍 在Cpp3 0中 祖师爷便引入了模板的概念 这是一个重大的变革 为后来的Cpp标准化打下了铺垫 也正是因为有了模板 Cpp才能有S
  • 创建阿里云产品和添加设备

    阿里云产品的创建 概述 阿里云网址 https www aliyun com 在线加解密网址 http encode chahuo com MQTT fx下载地址 http mqttfx jensd de 产品创建 一键复制并且保存完毕之后
  • Python爬虫--异常处理

    1 URLError出现的原因 1 连不上服务器 2 远程url不存在 3 无网络 4 触发HTTPError 2 处理异常实例 import urllib request import urllib error try urllib re
  • MongoDB复杂Json数据的增删改查

    本文讲解了MongoDB在java语言下的复杂用法 并附带案例 欢迎各位MongoDB使用者点赞收藏 提出宝贵的意见 TImetableDO数据结构 orgId test 0c8bd2befcae level 33 studyStageCo
  • IPsec技术介绍(转)

    目 录 IPsec IPsec简介 IPsec的协议实现 IPsec基本概念 加密卡 IPsec虚拟隧道接口 使用IPsec保护IPv6路由协议 IKE IKE简介 IKE的安全机制 IKE的交换过程 IKE在IPsec中的作用 IPsec
  • java定时任务实现的几种方式

    摘要 在开发测试工具的应用后台 经常听到同事说要做个定时任务把做日志处理 或者数据清理 包括做些复杂的业务计算逻辑 在选择定时任务的时候 怎么能够快速实现 并且选择一种更适合自己的方式呢 我这里把定时任务的实现收集整理了一些方法 希望可以帮
  • python中sorted和sort的key

    目录 sort与sorted区别 1 调用方式 2 返回值 3 操作对象是否变化 什么对象可以排序 sort sorted 排序的key 函数 方法 自己造 有趣的排序题 多级排序 sort与sorted区别 1 调用方式 sort是方法
  • chisel可选值/模式匹配实例

    一 scala可选值语法 可选值就是类型为Option T 的一个值 其中 Option是标准库里的一个密封抽象类 T可以是任意的类型 例如标准类型或自定义的类 并且T是协变的 简单来说 就是如果类型T是类型U的超类 那么Option T