实现一个查找逻辑。
 
参考链接:
 
 
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. 记一次sqoop安装后测试的问题

    运行命令: sqoop import --connect "jdbc:mysql://x.x.x.x:3306/intelligent_qa_bms?useUnicode=true& ...

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

    C程序中的字符串(Week 11) 字符数组 所有的字符串,都是以\0结尾的 只能在数组定义并初始化的时候:char c[6] = "China"; 不能用赋值语句将一个字符串常量 ...

  3. 永磁同步电机 spmsm 和 ipmsm 的区别总结

    layout: post tags: [motor control] comments: true 永磁同步电机的分类 永磁同步电机根据转子上永磁体的位置不同,可以分为: 表贴式永磁同步电机--S-P ...

  4. redis文章汇总

    方便集群管理时的查看操作 http://www.cnblogs.com/mushroom/p/4738170.html http://www.cnblogs.com/hjwublog/p/568170 ...

  5. 技术人的福音!教你如何使用Typora+PicGo实现图片自动上传功能

    前言 写技术文章的小伙伴,对于 Typora 肯定不陌生,用来编写 Markdown 特别的方便. 但是,有个问题,就是当我们插入一个图片,并且使之可以在公网访问时,操作流程特别的麻烦. 首先,你需要 ...

  6. 画结构图的神器 Graphviz

    经常看到别人的论文里各种优美的图,没想过它们是怎么来的,前两天也是在看论文的时候被推荐了一款画图软件graphviz,稍微了解了一下这个画图软件,据说是贝尔实验室的几位牛人开发出来的,试了一下觉得很不 ...

  7. Hive环境搭建和SparkSql整合

    一.搭建准备环境 在搭建Hive和SparkSql进行整合之前,首先需要搭建完成HDFS和Spark相关环境 这里使用Hive和Spark进行整合的目的主要是: 1.使用Hive对SparkSql中产 ...

  8. 爬取淘宝商品信息,放到html页面展示

    爬取淘宝商品信息 import pymysql import requests import re def getHTMLText(url): kv = {'cookie':'thw=cn; hng= ...

  9. HttpRequestUtils post get请求

    package com.nextjoy.projects.usercenter.util.http; /** * Created by Administrator on 2016/10/20. */ ...

  10. PAT 1002 A+B for Polynomials (25分)

    题目 This time, you are supposed to find A+B where A and B are two polynomials. Input Specification: E ...