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
相关产品推荐
相关产品推荐

