You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala库SpinalHDL中Masked()方法的含义及源码解析

SpinalHDL中Masked对象的作用解析

Masked是SpinalHDL里专门用来构建掩码匹配规则的工具对象,核心是帮你把普通的枚举、字面量,转换成「数值+关心位掩码」的组合,用来处理硬件设计里常见的“部分位精确匹配、部分位不关心”的场景(比如地址译码、特定信号模式匹配)。

从给出的源码看具体实现

object Masked{
  def apply(ml : MaskedLiteral) : Masked = Masked(ml.value, ml.careAbout)
  def apply(lit : Any) : Masked = lit match {
    case e: SpinalEnumElement[_] => Masked(e.spinalEnum.defaultEncoding.getValue(e), (BigInt(1) << e.spinalEnum.defaultEncoding.getWidth(e.spinalEnum))-1)
    case bt: BaseType => bt.head.source match {
      case lit : Literal => Masked(lit.getValue(), (BigInt(1) << widthOf(bt))-1)
    }
  }
}

它提供了两个重载的apply方法:

  • 第一个方法:直接接收MaskedLiteral类型的参数,提取其中的value(需要匹配的有效数值)和careAbout(掩码位,1表示该位需要精确匹配,0表示该位不关心),生成Masked实例。
  • 第二个方法:接收任意类型,通过模式匹配处理两种常见场景:
    • 当输入是SpinalEnumElement(枚举元素)时:获取枚举元素的编码值,同时生成对应宽度的全1掩码(因为枚举的所有位都需要精确匹配,没有不关心的位),再创建Masked实例。
    • 当输入是BaseType且其源头是Literal(字面量)时:提取字面量的数值,生成对应位宽的全1掩码(同样要求所有位精确匹配),创建Masked实例。

核心用途举例

比如你要匹配地址总线的高4位为0x1,低12位不关心,就可以用Masked(0x1000, 0xF000)来表示这个规则;而如果是直接传入一个枚举元素或者普通字面量,Masked会自动生成全1掩码,相当于要求完全匹配这个值。

内容的提问来源于stack exchange,提问作者Pairshoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:54:21