risc-v中文社区

 找回密码
 立即注册
查看: 839|回复: 0

[原创] rocketchip高级参数化机制--Config调试实验(6)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-27 15:02:03 | 显示全部楼层 |阅读模式
1)因为要做一个默认的配置以便全局使用,所以在使用的时候需要先从Config类创建一个子类
class MyChipConfig extends Config((v1:View,v2:View,v3:View) => {。。。}
,在实验的main主方法中针对这个配置类要准备一个隐式值:imlicit val params = new MyChipConfig,
正因为有这个隐式值,而new MyChipConfig的时候要初始化Config,且用的是三成员元组转偏函数的参数,
2)所以进入Config的def this(f: (View, View, View) => PartialFunction[Any,Any]),
        它调用Config的主构造器:this(Parameters(f))
3)但在调主构造器之前,还需要先用object Parameters的apply返回Parameters值作为主构造器的参数值,
        即进入object Parameters的apply:def apply(f: (View, View, View) => PartialFunction[Any,Any]): Parameters
4)在这个apply方法,通过实例化一个内部私有类PartialParameters的实例对象返回,即:new PartialParameters(f)
5)这个内部私有类:private class PartialParameters(fView,View,View)=>artialFunction[Any,Any]) extends Parameters
        只需要将Parameters的抽象方法def chain实现即可。(回头再题外分析这个chain的流程:
                val g = f(site,this,tail)(site值是自己的配置类实例MyChipConfig,this的含义?,tail是new TerminalView) 因为内部私有类PartialParameters的主构造参数是一个三元转偏函数的函数字面量,所以执行这个函数返回一个偏函数
                if (g.isDefinedAt(pname)) Some(g.apply(pname).asInstanceOf[T]) else tail.find(pname, site)
                通过偏函数的isDefinedAt来判断pname即待查找的pname属性值存不存在,如果存在,以Option[T]形式将偏函数执行值返回:Some(g.apply(pname).asInstanceOf[T] g.apply其实就是执行用户的配置类中的case语句
                否则继续查找:tail.find(pname,site)
        )
到此,隐式值params已初始化好,配置参数可供用户使用了。
6)开始执行Driver.execute(Array("--target-dir","generated"),()=>new MyChipModule),new用户主模块对象,
        进入用户模块class MyChipModule(implicit parameters) extends Module
7)第一句:val buswidth:Int = p(BUSWIDTH),
        p(BUSWIDTH)这句中,BUSWIDTH是一个case object,用户定义的参数,其继承自抽象类Field[T]:case object BUSWIDTH extends Field[Int](源代码中这样写BUSWIDTH主要是用作一个用户自定义配置参数名称,具体值需要在MyChipConfig中赋值)
        8)所以p(BUSWIDTH)将进入Parameters的父类View的apply[T](pname:Field[T])方法,
        9)再进入另一apply(pname:Field[T],site:View)(注意:此时传到此apply的site是this,其值的string是“MyChipConfig",说白了,就是因为有
                一个最开始的隐式值,它的类型就是MyChipConfig)
        10)在此apply中首先用view这个trait即自身的find查找属性:BUSWIDTH,要注意此时的site值是MyChipConfig类型。可是在View中find是抽象方法,
                它会怎么执行呢?到哪个子类中呢?我们要知道是从p(BUSWIDTH)开始执行的,而p是MyChipConfig,父是Config,所以find就会找MyChipConfig,再
                找Config,Config中没有,再找其父Parameters,在Parameters中找到它实现了父View抽象方法find,源码:
                protected[config] def find[T](pname:Field[T],site:View)={
                        chain(site,new TerminalView,pname)  //还是要注意:调试到此时 site是MyChipConfig这个配置类,pname是BUSWIDTH
                                题外分析:new TerminalView将作为chain方法的tail参数:
                                        private class TerminalView extends View { //因为View中有一个抽象方法find,所以TerminalView实现这个find即可
                                                def find[T](pname:Field[T],site:View):Option[T]= {pname.default} //find方法返回Field[T]的default属性值
                                        }
                }
                        到此又会执行chain方法,很明显,Parameters中的chain是abstract Parameters中新添加的抽象方法,又到哪去分析chain呢?
                        还是回到最初的隐式值implicit params = new MyChipConfig中去找原因,p(BUSWIDTH)一路执行到此chain方法,当此时此刻的View中
                        是抽象方法chain时,发现MyChipConfig的父类Config中有chain的实现:
                        protected[config] def chain[T](site:View,tail:View,pname:Field[T]) = {//此时site是MyChipConfig,tail是TerminalView实例,pname是BUSWIDTH
                                p.chain(site,tail,pname) //p是?chain应该调哪个的chain? 调试发现时入内部类PartialParameters的chain,为什么会这样?
                                //我们知道在配置参数隐式值初始化的时候,object Parameters的apply中会产生一个内部私有类PartialParametersarameters
                                (初始化这个内部私有类时也是用同一个配置用三元转偏函数这个函数字面量作参数)
                                既然已经初始化这个parameters变量,注意:class Config(parameters) extends Parameters 语法,并不是下面这样写的:
                                (val或var parameters),即p参数只能作为类Config的内部变量使用,不能在Config外部使用,即p不是类成员变量
                                有了这样的概念,就知道,当在Config类中出现p时就代表这个内部私有类PartialParameters的实例
                                这样回头再看5)中chain查找,找到则一路返回到7,即val buswidth:Int = p(BUSWIDTH)获得配置值
                        }

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-29 06:31 , Processed in 0.017493 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表