介绍创建模块判断逻辑的when命令。
 
1. when/elsewhen/otherwise
 
伴生对象when中的工厂方法,会创建一个WhenContext:
 
WhenContext含有方法elsewhen/otherwise:
他们又各自创建一个新的WhenContext。
 
WhenContext的构造方法在类体中:
 
when(cond){...}
 
a. firrtlDepth是判断的深度:when()时为0,elsewhen时即为1;所以当其大于0,则表明已经是一个else判断了,需要添加一条AltBegin命令;
b. cond是一个Option,包裹着一个无参但返回Bool的函数。when/elsewhen中有,otherwise中为None。所以when/elsewhen中会添加一条WhenBegin命令,而otherwise中则无。
c. Builder.whenDepth表示when嵌套的深度,第一层when为0,其block中的when的嵌套深度则为1。
d. block是一个call-by-name参数,如同一个无参带返回的函数,第一次使用时调用。就是花括号括住的那段代码。其中可以有另一个when结构,所以在执行block之前和之后,需要对Builder.whenDepth进行处理。
e. 如果是when/elsewhen,则添加WhenEnd命令;如果是otherwise,即cond为空,则添加OtherwiseEnd命令;
 
 
2. unless
 
unless基于when实现:
 
3. switch/is
 
switch/is使用Scala的宏实现:
宏是为了支持switch(state) {...}的写法。最终会把这个结构转换成为一个SwitchContext。
1) Tree为AST,即Abstract Syntax Tree,抽象语法树。cond为state,x为{...}这个代码块对应的AST。
2) {...}中为一系列的 is(s){...},val q"..$body" = x 把x对应的列表,赋值给body,所以body是一个tree的列表,每个tree,是一个is(s){...}的结构;
3) q"""new SwitchContext($cond, None, Set.empty)""" 相当于调用new SwitchContext(cond, None, Set.empty) 返回一个SwithContext;
4) body.foldLeft(z)(op),意为把body中的元素从左边开始逐个带入op运算,亦即每次折叠一个元素,最终返回一个结果。op接收两个参数,第一个参数为前一次折叠结果,第二个为下一个要折叠的元素。第一次op运算时,使用默认的z作为前一次的折叠结果。
 
a. 这里的z为new SwitchContext(cond, None, Set.empty) 创建的SwitchContext,而op为:
所以,最后返回的是一个SwitchContext。
 
b. op的两个参数为acc, tree,acc为前一次的折叠结果SwitchContext,tree为下一个待折叠的is(s){...};
 
c. tree是一个is(){}调用,定义为:
其只是一个占位符,方法实现只是一个简单的判断,并没有具体的实现。
 
d. case q"chisel3.util.is.apply( ..$params )( ..$body )" 取出is(s,s,s,s,s){...} 中的states作为params,而{...}作为代码块body;
 
e. q"$acc.is( ..$params )( ..$body )" 调用acc(SwitchContext)的is方法,并传入两个参数列表:
 
总结下来,过程就是首先创建一个SwitchContext类的对象,然后逐个调用其is方法,最后返回一个SwitchContext对象;
 
5) 返回最后的折叠结果,也就是一个SwitchContext对象:q"""{ $res }"""
 
 
SwitchContext的实现如下:
其基于WhenContext:
a. 状态v和已有的状态值需要互斥,亦即不能存在多个相同的状态值判断;
b. 如果v是多个状态,则只需要有一个为真即可:def p = v.map(_.asUInt === cond.asUInt).reduce(_||_)
c. 如果是第一个is(s)判断,则使用when(),如果是后续的is(s)判断,则使用elsewhen:
 
 
 
 

Chisel3 - model - when的更多相关文章

  1. Chisel3 - model - 子模块,顶层模块

    https://mp.weixin.qq.com/s/3uUIHW8DmisYARYmNzUZeg   介绍如何构建由模块组成的硬件模型.   1. 子模块   一个模块可以有一个或多个子模块,创建子 ...

  2. Chisel3 - model - Builder

    https://mp.weixin.qq.com/s/THqyhoLbbuXXAtdQXRQDdA   介绍构建硬件模型的Builder.   1. DynamicContext   ​​ 动态上下文 ...

  3. Chisel3 - model - IO ports

    https://mp.weixin.qq.com/s/fgCvIFt0RdEajhJVSy125w   介绍模块的输入输出端口的定义与管理.     1. _ports   1) 模块的输入输出端口, ...

  4. Chisel3 - model - DefWire, Reg, Memory, Prim

    https://mp.weixin.qq.com/s/KkkqvekWHG6yrqwHUECRIw   介绍如何定义Wire/Reg/Memory/Prim.   1. DefWire   Wire( ...

  5. Chisel3 - model - connect

    https://mp.weixin.qq.com/s/w8NqM3GVlF0NydpsB65KPg   介绍创建模块顺序逻辑的connect命令.     0. 这里先简单对 "=" ...

  6. Chisel3 - model - UserModule commands

    https://mp.weixin.qq.com/s/0ECca6XyFyEri0B4ckOZ4A   介绍UserModule类中,如何管理构建硬件模型所需的命令.   ​​   1. _comma ...

  7. Chisel3 - model - Hardware Model

    https://mp.weixin.qq.com/s/x6j7LZg7i7i_KcNEA8YCQw   Chisel作为领域专用语言(DSL),用于构建硬件模型.待硬件模型建立后,再基于模型进行仿真. ...

  8. Spring Boot笔记一

    Spring Boot 入门 Spring Boot 简介 > 简化Spring应用开发的一个框架:> 整个Spring技术栈的一个大整合:> J2EE开发的一站式解决方案: 微服务 ...

  9. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

随机推荐

  1. github使用命令

    创建本地库,提交,和绑定github ,上传代码 git init git add README.md git commit -m "first commit" git remot ...

  2. mybatis传递参数的方法

    一.传递一个参数 例:根据员工编号查询员工的基本信息 1.在dao接口中声明一个方法 2.在mapper中实现该方法 3.测试 /** * 传递一个参数 */ public class Test02 ...

  3. pycharm中的TODO注释用法

    pycharm 中可以在# 后面加TODO提示自己后续的开发动作. 点击pycharm又下角的小标签,会弹出一个列表,选择TODO选项. 进入TODO选项,可以看见所以设置的TODO,选择一个TODO ...

  4. 【Hadoop离线基础总结】Sqoop数据迁移

    目录 Sqoop介绍 概述 版本 Sqoop安装及使用 Sqoop安装 Sqoop数据导入 导入关系表到Hive已有表中 导入关系表到Hive(自动创建Hive表) 将关系表子集导入到HDFS中 sq ...

  5. Java 将鼠标改为图片的两种方法

    一 图片跟着鼠标移动,鼠标隐藏 int x,y; addMouseMotionListener(this);//设置鼠标监听 public void paint(Graphics g) {  g.dr ...

  6. transform-translate3d

    translate3d 开启硬件加速,做动效效率比 position 定位置后,改变位置,效果好,比如下拉背景放大效果,上滑的时候背景跟着上滑,可以用 translate3d.亲测效果更好,记下来

  7. 批量下载B站视频

    一个一个下载:https://www.zhihu.com/question/41367609 WSDAB的回答批量下载:https://www.zhihu.com/question/49793759( ...

  8. (数据科学学习手札83)基于geopandas的空间数据分析——geoplot篇(下)

    本文示例代码.数据及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们详细学习了geop ...

  9. putty、pscp、psftp 使用教程

    如何从安装了Windows的工作电脑连远程接到Linux服务器?其实有很多软件,比如 PuTTY.XShell.CRT.MobaXterm等等.不过还是 PuTTY最简单易用.无需安装.并且开源免费. ...

  10. 用一个python文件去调用另一个python文件,关于相对路径的处理?

    比如用a.py调用执行b.py,但是a.py和b.py路径环境不一样,而b.py中有使用相对路径读取文件,这时会报错,怎么在a.py中进行配置,使其调用b.py时路径和其相同,能否做到? 比如目录结构 ...