Skip to main content

爬香山,重走前人路

前言:通过阅读xiangshan的各个commit来逐步了解香山并学习chisel的写法

通过使用git rebase -i –root,然后将所有pick改成edit,然后通过git rebase –continue来自动切换下一个commit(类似断点?),通过git rebase –abort来退出这个模式

commit2 ==========core: add basic ALU===========

简单ALU,用def定义变量名可以学习一下,在scala中似乎很常用,最后两个通过一个或门来减少编码?说实话我有点不懂这里

commit3 ================core,ALU: add MuxTree option=============

muxtree是什么?似乎就是mux1h,为什么不用muxlookup而使用mux1h呢?

尝试进行yosys评估,发现Mux1h面积更小(给输入输出添加寄存器,muxlookup面积为 2328.564,频率为1129.742;而mux1h面积为2312.072,频率为1114.420)

凭感觉来说,树嘛,肯定组合逻辑更大一点,但是由于是使用多个简单的mux组合而成,面积会小一点

commit4 ============core: compiled modules=================

一个core的雏形出现了,其实还出现了一个从没见过的unit,isu,issue unit,发射!🚀

看了一点点,后悔了,当时为什么没有看余老师写的代码而是去参考了riscv-mini,感觉余老师写的就是那种很如鱼得水,很灵活的代码风格,特别值得人学习,而且最值得感慨的是很具有可扩展性,因为内容过多,就不丢代码片段截图了

前端看着还是很熟悉的,然后就来到了isu,现在的isu似乎很简单,就是把读寄存器的部分移到这边了,然后其他的都还是不变,但是这用class不用module以及用match case打包ctrl信号来传输以增加模块性的方式都挺值得我学习

余博还实现了一个ListLookup的函数,使用.map实现

commit5 ================core: add tester for NOOP=====================

之前还只是有一个过时的alutester,这次commit就添加了core的tester,这是一个使用scala编写的testbench,而我只使用过cpp编写,所以很有必要学习一下

其实也是通过读取core的raddr,然后灌给他相应的指令,然后这个step也不需要像c++中自己来编写,最主要的是这个不存在什么dpi-c函数,而全是通过读取core的输入输出来做事情

但是他如何dump波形呢?这个稍微有点不懂

感觉这个tester可能有点过时了

commit6 ==============core,NOOPTester: read binary image from file==================

添加了如下内容:

不会java,看不懂(狗头

commit7 ====================core,NOOPTester: better message format=================

commit8==============core,NOOPTester: use expect() to check the trap state at the end=======

commit9=======core,NOOPTester: add imgPath to specify the memory image===========

commit10========Makefile: add IMAGE argument for test================

commit11=========Makefile: add emu rule for running with verilator==============

之后由于commit太多太杂,我打算只挑选一些很值得学习的写法以做记录

虽然编译报错,我估计是版本问题,但是他这根本没写一行cpp代码,而是通过chisel测试框架,选择–backend-name verilator来自动生成cpp文件以及自动产生波形,漂亮!

看着很舒服,也很容易看懂

之后还添加了一个JNA接口,可以在scala中调用c/c++,感觉很方便,至少这个chiseltest可以兼容nvboard了hhhh

之后有一个重构,将所有的const变量分组,每一个组都是一个trait(包括分组所有的译码),然后不同的class不使用import而是extend这些trait来获得这些常量,既有灵活性而且模块化,然后我发现所有文件的import全部消失了(当然除了import chisel)

后面有一个makefile的一个保留变量.DEFAULT_GOAL用于指定默认目标

io.ro.r.valid := Counter(io.ro.r.ready, 1)._2

还能这么写!