RISC-V --rocket-chip generator介紹及其仿真使用

說明:使用的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波形文件:
    在這裏插入圖片描述

  • 雙擊打開即可看到波形:
    在這裏插入圖片描述

 
 
版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章