介绍创建模块判断逻辑的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. Qt之xml文件解析

    XML文件简介 XML - EXtensible Markup Language,可拓展标记语言 Qt中加载XML模块 .pro 文件中添加 QT += xml Qt的XML访问方式 引用:https ...

  2. 关于Fragment的点击切换数据滞留问题

    场景再现:当我使用tabLayout + Fragment 切换不同的fragment时,出现了数据重复显示的问题: 思考逻辑: - 每次切换fragment都会重新获取数据,但是list集合是全局的 ...

  3. Power Query:非常规工资条

    常规工资条为标题.内容.空行,每三行一循环,横向排版.打印.空行填充颜色,方便切割.其中用到函数嵌套,先把table以row转换为list,然后用List.TransformMany生成Table.C ...

  4. MOS管和三极管开关特性

    不知道对不对? 待续!!!

  5. leeCode刷题 1078

    给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 "first second third" 形式出现的情况,其中 second 紧随 firs ...

  6. net core中Vue.component单独一个文件不运行,不报错的处理

    Vue.component代码段原先是放到view下的cshtml中的,可以正常运行,后来为了方便代码管理,将这块代码块单独放到一个js文件中,结果点击按钮等等都没有任何反应了,同时js控制台也不报错 ...

  7. Appium自动化(7) - 控件定位工具之Appium 的 Inspector

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 上一篇文章介绍了另一块控件定 ...

  8. 「雕爷学编程」Arduino动手做(36)——WS2812B 4位彩灯模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  9. 用JetBrains PyCharm 开发工具写一个简单python案例

    import urllib.request import re #解析html的内容 def getHtml(url): page=urllib.request.urlopen(url) html=p ...

  10. [原创][开源] SunnyUI.Net 开发日志:ListBox 增加跟随鼠标滑过高亮

    QQ群里,寸目说,ListBox鼠标移动时,当前行需要焦点,我想了想,不难实现啊 不就是在鼠标移动时重绘Item嘛,何况选中的Item已经改了颜色了. 见UIListBox代码: protected ...