实现一个查找逻辑。
 
参考链接:
 
 
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 Boot 整合 Apache Dubbo

    Apache Dubbo是一款高性能.轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 注意,是 Apache Dubb ...

  2. Python网络爬虫练习

    1. 豆瓣top250电影 1.1 查看网页 目标网址:https://movie.douban.com/top250?start=0&filter= start=后面的数字从0,25,50一 ...

  3. Coursera课程笔记----计算导论与C语言基础----Week 10

    C程序中的数组(Week 10) 一维数组 数组的定义 类型 数组名[常量表达式] int sheep[10] 定义数组时,[]内必须为常量表达式 可以用const int 可以在main函数前,#d ...

  4. Coursera课程笔记----计算导论与C语言基础----Week 9

    C语言中的控制成分(Week 9) 计算机程序的基本结构 任何具有单入口单出口的程序,都可以用顺序结构.分支结构.循环结构来表达 分支语句 在执行if语句前,先对表达式求解 if()内可以是任意的数值 ...

  5. 房价预测Task1

    pandas:简单的房价预测实例 我们使用pandas等工具,对于给出的.csv文件进行处理,完成要求的几个Task. 利用sklearn的线性回归,对于房价进行简单的预测. 所有的要求,数据集等文件 ...

  6. TP5整合的阿里云短信接口

    现阶段,短信的应用主要就是用来验证下手机号是不是正常的手机号.只要涉及到用户手机号的问题的时候,都会做短信验证码来验证下改手机号是否是正常手机号.接下来就是操作步骤. 首先要在阿里云账号上开通短信功能 ...

  7. Ubuntu:Tkinter无法导入

    最近想写个GUI小程序,所以就使用了python内置的Tkinter包,但是导入时竟然提示没有这个包? 使用命令搜索了下: sudo apt search python3-tk ,显示已经安装了.又重 ...

  8. 异步http接口调用库:httpx

    谈到http接口调用,Requests大家并不陌生,例如,robotframework-requests.HttpRunner等HTTP接口测试库/框架都是基于它开发.这里将介绍另一款http接口测试 ...

  9. 为什么Tableviewcell创建时可以不判空

    dequeueReuseableCellWithIdentifier:与dequeueReuseableCellWithIdentifier:forIndexPath:的区别: 前者不必向tableV ...

  10. 【Spring】Spring AOP详解(转载)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...