介绍创建模块判断逻辑的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. LeetCode--Unique Morse Code Words && Flipping an Image (Easy)

    804. Unique Morse Code Words (Easy)# International Morse Code defines a standard encoding where each ...

  2. 【Hadoop离线基础总结】日志采集框架Flume

    日志采集框架Flume Flume介绍 概述 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.它可以采集文件,socket数据包.文件.文件夹.kafka等各种形式源数据,又可 ...

  3. [hdu1028]整数拆分,生成函数

    题意:给一个正整数n,求n的拆分方法数(不考虑顺序) 思路:不妨考虑用1~n来构成n.用多项式表示单个数所有能构成的数,用多项式表示,就相当于卷积运算了. 1 2 3 4 5 6 7 8 9 10 1 ...

  4. python循环中对一个列表的赋值问题

    参考:https://www.cnblogs.com/zf-blog/p/10613981.html https://www.cnblogs.com/andywenzhi/p/7453374.html ...

  5. python 基础应用1

    1.使用while循环输入1 2 3 4 5 6 8 9 10 n = 0 while n < 11: n = n + 1 if n == 7: continue print(n) n = 0 ...

  6. NoSQL之一:Memcached

    一.NoSQL简介 NoSQL并不是No SQL(不再需要SQL),而是指Not Only SQL(不仅仅只有SQL).NoSQL并不是用来替代关系型数据库的,而是在某些使用关系型数据库不合适的场景中 ...

  7. springboot+vue前后端免费开源

    序言 继上一篇 一套管理系统基础模版 详细梳理一下安装流程,功能说明,开发规范等. 后端项目结构? 如何从零搭建环境开发? 如何打包部署? 接入开发及规范 项目地址 小结 后端项目结构 ​ shop- ...

  8. pytest——pycharm中右击运行(run)没有问题,在terminal中运行pytest报错:E ModuleNotFoundError: No module named

    参考了这个解决办法:https://blog.csdn.net/qq_36829091/article/details/82180866 我的是Windows,linux的和Windows的解决办法有 ...

  9. LinkedList源码(add方法)

    对于要有扎实的java基础,集合是必须掌握的,而且精读这部分的源码很有用,也很有必要.而LinkedList是在java.util包下,和java.io,java.lang都是比较常用,而且比较简单. ...

  10. 【雕爷学编程】Arduino动手做(54)---大按键点动模块

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