实现一个查找逻辑。
 
参考链接:
 
 
1. Lookup
 
各个参数如下:
1) addr: 要查找对象的地址;
2) default: 若没有查到,则使用这个默认值返回;
3) mapping: BitPat与待查找对象的映射;可以理解为被查找对象的集合。
 
这里把参数转换之后,委托给ListLookup来查找。
 
Lookup查找的地址处,只有一个值;而ListLookup查找的地址处,有多个值。所以这里委托时,使用.head提取返回的第一个值,实际上也只有一个。
 
2. ListLookup
 
各个参数意义与Lookup相似,不同的在于ListLookup查找的地址处有多个值,所以传入了多个默认值。
 
 
1) 把mapping转换为是否匹配的映射:val map = mapping.map(m => (m._1 === addr, m._2))
 
m._1为BitPat,“===”为BitPat的匹配方法,m._1 === addr 返回一个是否匹配的Bool型,与m._2即List[T]一起组成一个新的map;
 
2) 逐个遍历每一个默认值:default.zipWithIndex map { case (d, i) => ...}
 
因为查找地址处有多个值(值的个数与传入的默认值的个数一致),所以需要逐个计算并返回。这个map返回的结果即是ListLookup返回的结果,即List[T]。
 
3)根据BitPat匹配的结果,返回查找到的值:map.foldRight(d)((m, n) => Mux(m._1, m._2(i), n))
 
a. d为默认值;
b. m._2(i)返回查找地址处的多个值中的第i个;
c. 如果地址匹配,则返回查找到的值:Mux(m._1, m._2(i), n)
d. map.foldRight()()
 
 
foldRight有两个参数列表,第一个是初始值z,第二个是一个函数op。
 
fold的意思为折叠,即把map中所有的元素逐个带入op运算,最终返回一个结果。前一次运算的结果作为下一次运算的z值。第一次运算使用的z值为作为第一个参数列表传入的z。
 
foldRight从有开始算,foldLeft从左开始算。
 
在此例中:map.foldRight(d)((m, n) => Mux(m._1, m._2(i), n))
 
第一次运算:n = d, m = map(length - 1).
第二次运算:n为第一次运算中Mux选择的结果,m = map(length - 1 -1)
...
 
如此即形成一个查找结构,按map中元素的顺序开始查找,若元素0不匹配,再与元素1匹配,如此直到最后一个元素。如果最后一个元素的BitPat与addr也不匹配,则使用默认值d。
 
3. 附录
 

Chisel3 - util - Lookup的更多相关文章

  1. Chisel3 - util - OneHot

    https://mp.weixin.qq.com/s/Jsy8P3m9W2EYKwneGVekiw   独热码相关的电路生成器.   参考链接: https://github.com/freechip ...

  2. Chisel3 - util - MixedVec

    https://mp.weixin.qq.com/s/mO648yx4_ZRedXSWX4Gj2g   可以容纳不同类型的变量的向量.   参考链接: https://github.com/freec ...

  3. Chisel3 - util - Mux

    https://mp.weixin.qq.com/s/TK1mHqvDpG9fbLJyNxJp-Q   Mux相关电路生成器.   参考链接: https://github.com/freechips ...

  4. Chisel3 - util - Valid

    https://mp.weixin.qq.com/s/L5eAwv--WzZdr-CfW2-XNA   Chisel提供的Valid接口.如果valid为置1,则表明输出的bits有效:反之,则输出无 ...

  5. Chisel3 - util - Math vs. CircuitMath

    https://mp.weixin.qq.com/s/8lC8vQnBdKW9C39H0QFFkA     对数相关的辅助方法,Math通过软件方法实现,CircuitMath通过硬件方法实现.   ...

  6. Chisel3 - util - LFSR16

    https://mp.weixin.qq.com/s/DSdb4tmRwDTOki7mbyuu9A     实现16位线性反馈移位寄存器.可用于生成简单的伪随机数.     ​​     ​​   参 ...

  7. Chisel3 - util - Bitwise

    https://mp.weixin.qq.com/s/MQzX1Ned35ztz0vusPdkdQ   比特相关的操作.   参考链接: https://github.com/freechipspro ...

  8. Chisel3 - util - BitPat

    https://mp.weixin.qq.com/s/80Q8j-OSMtgh5a92pI-MZA   使用value和mask来描述一个比特模式,即:value = bits & mask. ...

  9. Chisel3 - util - LockingArbiter

    https://mp.weixin.qq.com/s/5oAwH3scumARzPidRBfG2w     带锁多入单出仲裁器,输出会被锁定指定的时钟周期.   参考链接: https://githu ...

随机推荐

  1. Spring Cloud feign GET请求无法用实体传参的解决方法

    代码如下: @FeignClient(name = "eureka-client", fallbackFactory = FallBack.class, decode404 = t ...

  2. java基础篇 之 再探内部类跟final

    之前写过一篇文章:从垃圾回收机制解析为什么局部内部类只能访问final修饰的局部变量以及为什么加final能解决问题,经过这两天的学习,发现有些不对,必须再来捋一捋 先看之前的例子: /** * @a ...

  3. mac下xampp访问php显示403错误

    错误描述 New xampp security concept: Access Forbidden Error 403 错误分析和解决 403就是我们访问的时候,被安全策略拒绝了,解决方法 找到文件 ...

  4. 用Visual Studio2019自定义项目模板

    项目模板简介 众所周知,在我们使用VS新建项目时,都需要选择一个项目模板,如下图: 我们选择完项目模板进行创建,创建完成之后,可以发现项目中已经包含了一些基础的文件.例如MVC: 可以看到,MVC项目 ...

  5. 【Hadoop离线基础总结】Apache Hadoop的三种运行环境介绍及standAlone环境搭建

    Apache Hadoop的三种运行环境介绍及standAlone环境搭建 三种运行环境 standAlone环境 单机版的hadoop运行环境 伪分布式环境 主节点都在一台机器上,从节点分开到其他机 ...

  6. C# 数据操作系列 - 3. ADO.NET 离线查询

    0. 前言 在上一篇中,我故意留下了查询的示范没讲.虽然说可以通过以下代码获取一个DataReader: IDataReader reader = command.ExecuteReader(); 然 ...

  7. go实现SnowFlake

    package main import ( "errors" "fmt" "strconv" "sync" " ...

  8. [hdu5218]DP-约瑟夫环变形

    题意:n个人围成一圈,另外一个人最开始站在第一个人前面,每次从集合s里面随机选一个数x,这个人顺时针经过x个人后停下来,当前位置的前一个人出队,然后继续进行,求最后剩下的那个人的可能编号. 思路:由于 ...

  9. java 实现仿照微信抢红包算法,实测结果基本和微信吻合,附demo

    实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...

  10. Mysql 常用函数(11)- trim 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html trim 的作用 删除字符串左右两侧的空格 tri ...