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. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

  2. 吴恩达机器学习week2

    1.Mean normalization(均值归一化) 我们可以将均值归一化理解为特征缩放的另一种方法. 特征缩放和均值归一化的作用都是为了减小样本数据的波动使得梯度下降能够更快速的寻找到一条'捷径' ...

  3. Day_09【常用API】扩展案例2_测试小字符串在大字符串中出现的次数

    分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: 请输入大字符串: woaiheima,heimabutongy ...

  4. 【Hadoop离线基础总结】CDH版本Hadoop 伪分布式环境搭建

    CDH版本Hadoop 伪分布式环境搭建 服务规划 步骤 第一步:上传压缩包并解压 cd /export/softwares/ tar -zxvf hadoop-2.6.0-cdh5.14.0.tar ...

  5. Linux Kernel Makefiles Kbuild en

    来自Linux kernel docs,顺便整理了一下排版 Linux Kernel Makefiles This document describes the Linux kernel Makefi ...

  6. haskell ide - vscode

    以windows为例(因为手头只有这个系统,linux系统下类似) 1. 下载安装vscode 2. 安装haskell的管理工具stack,将路径添加到环境变量path 3. windows下安装s ...

  7. Vulnhb 靶场系列:Jarbas1.0

    靶场镜像 官网 信息收集 攻击机kali IP地址 通过nmap 进行主机发现,发现目标机IP地址 nmap -sP 192.168.227.1/24 参数说明: -sP (Ping扫描) 该选项告诉 ...

  8. aui移动端UI库

    aui 简介 aui 是一套基于原生javascript开发的移动端UI库,包含常用js方法.字符校验.dialog提示弹窗.侧滑菜单.时间选择器.多级联动.聊天UI.项目常用模板...... 特点 ...

  9. iview tree 绑定数据

    官方文档 :https://www.iviewui.com/components/tree 效果图 1 主体分析 <Tree ref="tree" :data="t ...

  10. Nuget一键打包上传以及高级应用

    Nuget是什么不用多说,大家应该也没少用过Nuget, 不少人也应该使用过工具打Nuget包,接下来先一步步说明如何使用脚本完成Nuget一键打包 Nuget一键打包 配置Nuget环境 下载地址: ...