https://mp.weixin.qq.com/s/OH_Z1gdSUpfgM-tjx0OlrA

 
追溯配置信息的源头。
 
0. HasRocketCoreParameters
 
HasRocketCoreParameters中使用从HasTileParameters中继承的implicit Parameters p获取各个配置项的值。
 
这个p是抽象的,在HasRocketCoreParameters被混入(mixin)的类中实现或者推断(infer)。
 
 
1. class Rocket
 
 
class Rocket的主要构造方法有一个参数列表提供了implicit Parameters p,这个p可以被推断(infer)为HasRocketCoreParameters中的p。
 
 
2. RocketTileModuleImp
 
 
Rocket类在RocketTileModuleImp类中实例化,这里为Rocket类的主要构造方法的implicit Parameters p参数提供的实参为outer.p。
 
下一节追溯RocketTileModuleImp在哪里实例化并传入outer。
 
PS. 这里讲一个Intellij IDEA的细节。
 
按住Ctrl,鼠标左键点击outer.p中的p,跳转到如下位置:
 
outer是RocketTile的实例:
他的方法列表里也有一个implicit p: Parameters。
 
那么为什么点击outer.p的p定位到的不是RocketTile类的p呢?
 
看一下Structure窗口。
LazyModule的如下:
这里的p作为一个数据成员存在;
 
RocketTile的如下:
没有p;
 
如果把RocketTile的定义改一下:
 
这说明类的主要构造方法的参数列表中,以var/val关键字修饰的是类的成员,不带的不是。
 
那么RocketTile类主要构造方法(primary constructor)参数列表中的implicit p: Parameters就不是覆盖父类的数据成员,而只是一个参数。向当前范围(scope)内提供一个Parameters变量,这个变量可以被推断(infer)为HasTileParameters中的p。
 
 
3. RocketTile
 
RocketTileModuleImp在RocketTile类中实例化:
 
RocketTile类的定义如下:
 
他也有一个implicit p: Parameters参数。
 
 
4. HasRocketTiles
 
 
RocketTile在HasRocketTiles中实例化,使用的tp来自于:
 
这个p来自于BaseSubsystem。
 
 
5. BaseSubsystem
 
 
 
6. RocketSubsystem
 
BaseSubsystem的p来自于其子类,如RocketSubsystem:
 
 
7. ExampleRocketSystem
 
RocketSubsystem的p来自于其子类,如ExampleRocketSystem:
 
 
8. TestHarness
 
ExampleRocketSystem在TestHarness中实例化:
 
TestHarness找不到被引用的地方。
 
 
9. Makefrag
 
TestHarness在Makefrag这个Makefile文件中使用:
 
同时注意这里的CONFIG被赋值为DefaultConfig,这是一个配置类。
 
 
这里调用Generator中的main函数,并把MODEL(TestHarness)和CONFIG(DefaultConfig)作为参数传入。
 
 
10. GeneratorApp
 
Generator中没有配置相关的内容,其继承自GeneratorApp:
 
把传入的参数封装成ParsedInputNames:
 
1) 先看CONFIG,亦即DefaultConfig
 
 
fullConfigClass是DefaultConfig加上包名的路径,即:freechips.rocketchip.system.DefaultConfig。
 
这里加载这个类、实例化,并类型转换成为Parameters对象params。
 
2) 再看MODEL,亦即TestHarness
 
 
fullTopModuleClass是TestHarness加上包名的路径,即:freechips.rocketchip.system.TestHarness。
 
elaborate中就比较熟悉了:
 
调用chisel3.Driver.elaborate()返回一个Circuit实例。
 
top是一个无参但返回RawModule的函数:
a. 加载TestHarness类:Class.forName(fullTopModuleClassName)
b. 获取参数为Parameters的构造方法:getConstructor(classOf[Parameters])
c. 调用该构造方法,把params作为参数传入:newInstance(params)
 
即相当于:new TestHarness(params);
 
11. 总结
 
可以发现,配置的源头是用户传入的配置类的类名。
 
 
12. Scala:构造方法中的implicit参数列表
 
CoreModule类只定义了一个参数列表,为什么要多加一个空的参数列表呢?
 
 
这在Scala语言规范中有讲:
If a class has no formal parameter section that is not implicit, an empty parameter section () is assumed.
也就是说,即便没有明写非implicit参数列表(formal parameter section),也默认有一个。实例化时需要加上。
 
参考如下链接:
 
 
 
 

Rocket - config - implicit Parameters的更多相关文章

  1. Rocket - config - Keys & Params

    https://mp.weixin.qq.com/s/Y42EWrO7IoHRD_yHD4iRLA   介绍配置项.配置值以及他们的使用方式.   参考链接: https://docs.qq.com/ ...

  2. Rocket - config - Parameters

    https://mp.weixin.qq.com/s/uLEr9gAFaMDIXa8S9xJVTw   介绍配置类Parameters及其伴生对象的实现.   参考链接: https://docs.q ...

  3. Rocket - config - Configs

    https://mp.weixin.qq.com/s/z2gUYuYQAHQCa_5HZcBszw   介绍各个配置项的组织方式.   参考链接: https://docs.qq.com/sheet/ ...

  4. Rocket - config - DefaultConfig

    https://mp.weixin.qq.com/s/zWW00D0fb8h7_TotGD9YoQ   介绍DefaultConfig类的组成.     1. DefaultConfig   Defa ...

  5. Rocket - config - View

    https://mp.weixin.qq.com/s/b5o3s2DgqOz3-iK8FqPeLQ   介绍配置相关的基础类及其继承关系.   参考链接: https://github.com/fre ...

  6. Scala中的Implicit详解

    Scala中的implicit关键字对于我们初学者像是一个谜一样的存在,一边惊讶于代码的简洁, 一边像在迷宫里打转一样地去找隐式的代码,因此我们团队结合目前的开发工作,将implicit作为一个专题进 ...

  7. HttpRunner学习6--使用parameters参数化

    前言 在使用HttpRunner测试过程中,我们可能会遇到这种场景: 账号登录功能,需要输入用户名和密码,设计测试用例后有 N 种组合情况 如果测试组合比较少,比如只有2个,那我们直接在YAML脚本中 ...

  8. Rocket - diplomacy - AddressAdjuster分析

    https://mp.weixin.qq.com/s/UYVSO3XFJmhe5bUD_XbMLg   先介绍如何使用AddressAdjuster,然后分析UI参数的生成及使用.   ​​   1. ...

  9. Scala HandBook

    目录[-] 1.   Scala有多cool 1.1.     速度! 1.2.     易用的数据结构 1.3.     OOP+FP 1.4.     动态+静态 1.5.     DSL 1.6 ...

随机推荐

  1. 错误:Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.

    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...

  2. leetcode_课程表(BFS、拓扑排序)

    题目描述: 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 .在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹 ...

  3. Android 8.1 关机充电动画(三)Android模式

    system:Android 8.1 platform:RK3326/PX30 uboot kernel system/core/healthd Android 8.1 关机充电动画(一)模式选择 A ...

  4. 关于51单片机IO引脚的驱动能力与上拉电阻设计方案

    转载自:http://bbs.dianyuan.com/article/20312-2 单片机的引脚,可以用程序来控制,输出高.低电平,这些可算是单片机的输出电压.但是,程序控制不了单片机的输出电流. ...

  5. python 基础知识2-数据类型

    1.什么是数据类型? 整数(int) ,字符串(str),布尔值(bool),列表(list),元组(tuple),字典(dict),集合(set). int.数字:主要用于运算.1,2,3... b ...

  6. 学习ASP.NET Core(05)-使用Swagger与Jwt授权

    上一篇我们使用IOC容器解决了依赖问题,同时简单配置了WebApi环境,本章我们使用一下Swagger,并通过Jwt完成授权 一.Swagger的使用 1.什么是Swagger 前后端分离项目中,后端 ...

  7. vue面试常遇到的面试题

    最近面试了好几家公司,总结一下经常被问到的面试题. 首先呢,一开始先来一个自我介绍,没啥好说的. 接下来就是考验你vue技术的问题了 一些常见的面试题 vue的生命周期 一共有八个阶段,分别为创建前后 ...

  8. JAVA异常以及字节流

    异常 JAVA异常可以分为编译时候出现的异常和执行时候出现的异常 JVM默认处理异常的方法是抛出异常 异常处理 //第一种 try{ 可能会出错的代码 }catch{ 发生异常后处置方法 }final ...

  9. Spring全家桶之spring boot(二)

    spring boot的两种配置文件: 虽然spring boot可以帮助我们进行一些配置项,但是有些内容还是需要开发者自己进行配置,因此spring boot提供了配置文件以供开发者配置.sprin ...

  10. Java 代码精简

    Java 代码精简 利用语法 利用三元表达式 普通 String title; if (isMember(phone)) { title = "会员"; } else { titl ...