說明:使用的rocket-chip generator的版本爲:a8d573beeb8a33bb5dac0673ec68b82852a24d63
rocket-chip generator介紹
-
rocket-chip generator的一級目錄結構:
bootrom : 在BootROM的bootloader第一階段所使用的代碼
csrc Verilator: 仿真用的C代碼
emulator Verilator :用來編譯和跑仿真的工作目錄
project Scala: 構建工具sbt用來構建Scala的工作目錄
regression: 定義的持續的整合和一套nightly regression
scripts: 用來分析仿真的輸出或者處理代碼文件的內容
vsim VCS: 用來編譯和跑仿真的工作目錄
vsrc Verilog: 代碼,包含接口、測試框架和Verilog過程接口VPI
chisel3 :包含Chisel自定義的各種類和規則,用來生成RTL
firrtl: 存放Chisel編譯器處理代碼而生成的一種中間表示,由中間表示能生成Verilog代碼或C++代碼
hardfloat: 用chisel寫成的浮點單元
riscv-tools: 支持RISC-V的一套軟件,與生成RTL有關
torture: 用來生成壓力測試所需的一些隨機指令
src/main/scala: 構築rocket-chip的代碼 -
rocket-chip generator電路構築代碼的目錄結構:
amba amba: 協議的實現代碼,包括AXI4,AHB-lite,APB
config: 提供能配置Generator的Scala的接口
coreplex: 包含Rocket核、系統總線、coherence agents、debug設備、中斷處理、面向外部的外設、時鐘同步處理和TileLink到外設總線轉換
devices: 一些外設,包括debug模塊和各種掛在TileLink的從設備
diplomacy: 用來擴展Chisel,通過允許對硬件進行兩個階段的闡述,可以讓參數在模塊之間協調傳遞
groundtest: 生成可綜合的硬件測試平臺,通過發出隨機的訪問存儲器指令流,進行對核外的存儲器系統進行壓力測試
jtag: 用來生成JTAG總線接口
regmapper: 用來生成帶有能訪問內存映射寄存器的標準接口的從設備
rocket: 用來生成順序核Rocket、L1指令cache和L1數據cache
tile: 包含可以與Rocket核組成tile的組件,如FPU和RoCC協處理器
tilelink: 用來生成TileLink總線(協議),包含一些適配器和轉其他總線(協議)的轉換器
system Rocket Chip的頂層代碼包,同時也是用作測試的硬件平臺的頂層代碼包
unittest: 用作生成硬件測試平臺來測試單獨的一個個模塊
util: 提供一些能被其他代碼包調用的通用的Scala和Chisel結構
rocket-chip generator使用
-
在src/main/scala/coreplex/Configs.scala的類都是構築rocket-chip的“部件”。需要在src/main/scala/system/Configs.scala中將“部件”類和“底板”類BaseConfig組合起來,每一個都是一種配置方案。具體的方法就是利用“++”這個函數,寫法參考該文件的其他類寫法即可。
生成Verilog代碼及測試用的入口用到的命令:cd emulator
make CONFIG=DefaultConfig -
其中CONFIG=後面接的是在src/main/scala/system/Configs.scala寫好的類名。若編譯沒有錯誤,則會生成以下文件和文件夾:
-
generated-src文件夾包括生成的Verilog文件和一些測試用的文件,verilator文件夾包含仿真工具verilator的源碼和安裝文件。emulator-freechips.rocketchip.system-DefaultConfig是可執行文件,是測試程序的入口。圖中圈着的文件夾是測試進行的環境,.v文件就是生成的rocket-chip的Verilog代碼。
rocket-chip generator仿真C或C++程序
1. 使用risc-v工具鏈編譯仿真
-
寫好的一個測試的C或C++程序如下:
-
使用命令編譯測試程序:
riscv64-unknown-elf-gcc helloworld.c -o helloworld
-
然後將生成的helloworld可執行文件放到emulator工作目錄,再在emulator工作目錄下執行命令:
./emulator-freechips.rocketchip.system-DefaultConfig pk helloworld
-
等待幾分鐘(具體等待時間取決於程序的大小)後,終端輸出“Hello World”
2.利用rocket的方法如下(比之前的跑的更快,而且能看波形)
-
在rocket-chip/riscv-tools/riscv-tests/benchmarks中新建測試程序的文件夾helloworld,並在其中寫好一個測試程序helloworld:
-
修改在rocket-chip/riscv-tools/riscv-tests/benchmarks中的Makefile,修改其中的bmarks變量,使其新值爲新建的文件夾名字helloworld:
-
退出到rocket-chip/riscv-tools/riscv-tests/benchmarks執行命令make,得到.riscv可執行文件:
-
將.riscv文件移到rocket-chip/emulator文件夾中:
-
執行命令:
./emulator-freechips.rocketchip.system-DefaultConfig helloworld.riscv
-
等待少於一分鐘的時間,得到輸出:
-
執行命令:
./emulator-freechips.rocketchip.system-DefaultConfig +max-cycles=100000000 +verbose helloworld.riscv 2> helloworld.riscv.out
-
得到指令執行過程信息:
-
執行命令:
./emulator-freechips.rocketchip.system-DefaultConfig-debug +max-cycles=100000000 --vcd=helloworld.riscv.vcd helloworld.riscv
-
得到.vcd波形文件:
-
雙擊打開即可看到波形: