cisen / blog

Time waits for no one.
129 stars 20 forks source link

rocket-chip 相关 #1049

Open cisen opened 3 years ago

cisen commented 3 years ago

https://github.com/chipsalliance/rocket-chip https://zhuanlan.zhihu.com/p/140360043 https://github.com/ucb-bar/chipyard

cisen commented 2 years ago

问答

为什么会有src\main\scala\tilelink\Nodes.scala这种一堆case class和object的文件?

s1s2s3代表什么?

scratchpad特征是什么?

为什么tagcode要用ecc编码?这样跟普通的直接使用数据作为tag有什么好处吗?

s0和s1、s2各代表什么?

vaddr和paddr代表什么?

什么是ITIM/DTIM

TLB是什么?

Bundle->ParameterizedBundle with HasCoreParameters ->CoreBundle -> ICacheBundle -> LazyModuleImp with HasL1ICacheParameters-> ICacheModule -> ICache(LazyModule) -> Frontend(LazyModule) -> HasICacheFrontend(CanHavePTW) -> RocketTile extends BaseTile with SinksExternalInterrupts SourcesExternalNotifications HasLazyRoCC HasHellaCache HasICacheFrontend -> RocketTileParams extends -> InstantiableTileParams -> WithNBigCores -> DefaultConfig -> DefaultRV32Config extends Config(new WithRV32 ++ new DefaultConfig)

val addressBits = log2Ceil(maxAddress) io.resp.paddr := Cat(ppn, io.req.bits.vaddr(pgIdxBits-1, 0))

https://blog.csdn.net/ibless/article/details/118994430?spm=1035.2023.3001.6557&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-2.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-2.nonecase

为什么icache里面既有paddr又有vaddr?

为什么icache的s2_vaddr是在Dcache中设置的?

s0_vaddr是从cpu/TLB出来的直接地址?为什么还要传给icache?

// frontend.scala // npc: next pc icache.io.req.bits.addr := io.cpu.npc


**io.cpu.npc的npc是什么?**
- next pc,就是下一条指令的地址

**io.req是什么?**
- 也是在bundle中定义好的:`val req = Decoupled(new ICacheReq).flip`
- req最主要的参数是:valid、fire、addr,是最原始的请求,不会延时,是s0。s1会延时1个时钟去获取参数和计算tag、是否命中,s2会输出

**既然s0和s1相差一个tick,为什么`  s1_valid := s0_valid`**

**Field是什么?值又是什么?**
- https://github.com/cisen/chisel-doc/blob/master/17.%20chisel(Rocket%20Chip)%E4%B8%AD(Site-Here-Up)%E6%9C%BA%E5%88%B6%E5%8E%9F%E7%90%86(config%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB).md#%E4%B8%80fieldt%E7%B1%BB
- 未来组合继承基本的数据类型

**如何调试rocket-chip?**

**Parameters如何传入?**
- `new Helloworld()(Parameters.empty)`

**lazymodule是如何开始执行的?**
```scala
// 执行module外围的语句
val ldut = LazyModule(new AdderTestHarness())
// 真正开始执行module
val dut  = Module(ldut.module)

LazyModule、LazyModuleImp相当于闭包?

req是什么?

resp是什么?

EECS-2016-129.pdf

xiaolingyi commented 2 years ago

请问rocket中和l1cache里的tag比较的是物理地址还是虚拟地址呢?