介绍创建模块判断逻辑的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. Markdown更改字体、颜色、大小,设置文字背景色,调整图片大小设置居中,插入表格等方法

    Markdown 通过简单标记语法,使普通文本内容具有一定格式.但它本身不支持修改字体.字号与颜色等功能的. 一.更改字体大小.颜色.更改字体 Markdown语法 <font face=&qu ...

  2. 【Scala】利用akka实现Spark启动通信

    文章目录 思路分析 步骤 一.创建maven工程,导包 二.master进程代码开发 三.worker进程代码开发 思路分析 1.首先启动master,然后依次启动worker 2.启动worker时 ...

  3. Day_08【面向对象】扩展案例2_测试旧手机新手机类,并给新手机实现玩游戏功能

    分析以下需求,并用代码实现 1.定义手机类 行为: 打电话,发短信 2.定义接口IPlay 行为: 玩游戏 3.定义旧手机类继承手机类 行为: 继承父类的行为 4.定义新手机继承手机类实现IPlay接 ...

  4. xml(4)

    schema约束 dtd语法:<!ELEMENT 元素名称 约束> schema符合xml的语法,xml语句 一个xml中可以有多个schema,多个schema用名称空间区分(类似jav ...

  5. web2

    0x01 <?php $miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"; funct ...

  6. RocketMQ Windows 搭建

    一.rocketMQ 下载 官网:http://rocketmq.apache.org/ 本人使用是v4.3.0版本,百度网盘下载地址链接:https://pan.baidu.com/s/1qWewB ...

  7. 学习ASP.NET Core(06)-Restful与WebAPI

    上一篇我们使用Swagger添加了接口文档,使用Jwt完成了授权,本章我们简答介绍一下RESTful风格的WebAPI开发过程中涉及到的一些知识点,并完善一下尚未完成的功能 .NET下的WebAPI是 ...

  8. DRF版本组件

    1.DRF版本组件配置类局部使用 局部配置: 方式一:直接配置versioning_class=QueryParameterVersioning 方式二:直接配置versioning_class=UR ...

  9. nginx+vue+uwsgi+django的前后端分离项目部署

    Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...

  10. excel导入DataTable

    http://www.cnblogs.com/top5/archive/2010/03/12/1684559.html --下载excel的dll http://bbs.csdn.net/topics ...