Chisel后篇-Riscv-Rocketchip使用介紹


參考博文:https://blog.csdn.net/a_weiming/article/details/84594781

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?

這節的主要內容是教大家如何自由配置一個rocket-chip。

以下是我對rocket-chip修改后實現的特殊功能(部分我會以例子的形式進行說明):
1、 將reset_vector信號引到頂層,可以根據該信號使rocket-chip從不同地址啟動。
2、 在rocket-chip的頂層引出一套采用Tilelink的SRAM,這套SRAM按物理地址訪問。
3、 修改各總線(mem/MMIO)的物理訪問地址。
4、 將各總線(mem/MMIO)的AXI4協議改為AHB協議。
5、 將local interrupt的信號引到rocket-chip的頂層,使除了PLIC外,還能使用local interrupt。
6、 修改ROCC的功能,擴展custom0、custom1、custom2和custom3的功能。
7、 加入DCache enable的CSR寄存器,並實現相應功能,使DCache的功能變為可選。

現在先對rocket-chip的Scala代碼進行簡單的介紹。

 

 我決定以從頂到底的方式解釋rocket-chip的Scala代碼,此外我不會每個Scala文件都一一說明,某些測試的Scala文件我會跳過的。

首先說明的是/rocket-chip/src/main/scala/system目錄:

 Generator.scala & RocketTestSuite.scala 這兩個文件是測試相關的,所以我不做說明。

第一個看的Scala文件是:TestHarness.scala

帶//注釋的就是解釋。

下圖是 TestHarness.scala 生成的連接圖。

第二個看的Scala文件是:ExampleRocketSystem.scala
可以知道 TestHarness.scala 就是testbench,而 ExampleRocketSystem.scala 生成的才是我們關注的SOC, ExampleRocketSystem.scala 包括Core以外的其他外設&總線。

 

 第三個看的Scala文件是:Configs.scala

TestHarness.scala 就是testbench,而 ExampleRocketSystem.scala 就是SOC的層次,包括Core以外的其他外設&總線,Configs.scala 就是核心Core的配置。Configs.scala 的配置比較多,我挑幾個來說明。

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波形文件:

在這里插入圖片描述

雙擊打開即可看到波形:

在這里插入圖片描述

附錄:Chisel3 & Scala & Rocket-chip verilog的生成

  Scala是一門多范式的編程語言,一種類似java的編程語言,設計初衷是實現可伸縮的語言、並集成面向對象編程和函數式編程的各種特性[1]。

  Chisel(Constructing Hardware In a Scala Embedded Language)是一種嵌入在高階編程語言 Scala 中用來構造硬件的語言。Chisel實際上只是一組特殊的用Scala 事先定義的類、對象 和使用慣例,所以寫一份Chisel程序的時候,你實際上在寫一份Scala程序[2]。

  Rocket Chip is an open-source Sysem-on-Chip design generator that emits synthesizable RTL. It leverages the Chisel hardware construction language to compose a library of sophisticated generators for cores, caches, and interconnects into an integrated SoC[3].

  由上面描述,應該可以知道,Rocket Chip是一個開源的SOC生成器,可以根據自己的配置生成不同的SOC(RTL),而Rocket Chip是基於Chisel完成的,最后Chisel是在Scala中定義的特殊類和對象,因此修改Rocket Chip的源代碼就是修改Scala代碼,利用Chisel編譯出的文件為*.fir,要將*.fir轉換為verilog RTL還需要firrtl這個工具。

  Rocket Chip整個項目的Scala編譯都基於sbt的,而sbt是基於java的,因此要生成Rocket-chip RTL,要先安裝java,sbt,chisel3和firrtl。注意Rocket-chip RTL的生成不會用到工具鏈,需要編譯工具鏈時才需要設置環境變量。

Rocket-chip verilog RTL生成步驟:
1、 克隆項目:

$ git clone https://github.com/ucb-bar/rocket-chip.git
$ cd rocket-chip
$ git submodule update --init
2、 安裝java,下面是以Ubuntu為例子。

sudo apt-get install default-jdk
3、 安裝sbt,安裝sbt過程中可能因為網速或鏈接的問題會出現下載失敗的現象,多試幾次就好:

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
sudo apt-get update
sudo apt-get install sbt
4、 下載Rocket Chip項目的sbt依賴庫,下載過程中可能因為網速或鏈接的問題會出現下載失敗的現象,多試幾次就好:

$ cd rocket-chip
$ sbt
直到彈出這樣的提示就證明成功了,然后輸入exit退出:

sbt:rocketchip>
5、 編譯&安裝chisel3:

$ cd rocket-chip/chisel3
$ sbt
直到彈出這樣的提示就證明成功了,然后輸入exit退出:

sbt:chisel3>
6、 編譯&安裝firrtl:

$ cd rocket-chip/firrtl
$ sbt
直到彈出這樣的提示就證明成功了,然后輸入exit退出:

sbt:firrtl>
7、 生成rocket-chip verilog RTL

$ cd rocket-chip/vsim
$ make verilog CONFIG=DefaultSmallConfig
漫長等待后,RTL生成

$cd rocket-chip/vsim/generated-src
這個目錄下有很多剛生成的東西,下面再對這個目錄生成的文件進行說明。

生成文件的說明:
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式文件說明

RISC-V編譯環境搭建

1. JTAG調試器設置
將JTAG調試器連接PC,並斷開主機連接將其連接到UBUNTU虛擬機,運行

lsusb

應該有以下這個設備:

Bus 002 Device 010: ID 0403:6010 Future Technology Devices International, Ltd FT2232C Dual USB-UART/FIFO IC

設置udev rules,使JTAG調試器可以被plugdev group訪問

sudo gedit /etc/udev/rules.d/99-vmware-scsi-udev.rules

在里面添加

ATTR{idVendor}=="0403", ATTR{idProduct}=="6010", MODE="660", GROUP="plugdev"

使用如下命令查看該USB設備是否屬於plugdev group

ls -l / /dev/ttyUSB1

2. 將用戶名添加到plugdev group中
whoami
sudo usermod -a -G plugdev username
確認自己的用戶名是否屬於plugdev group

groups

將gnu-mcu-eclipse-openocd-0.10.0-8-20180724-1118-centos64.tgz放到~/根目錄下,並解壓

     cd ~/
     tar -xzvf gnu-mcu-eclipse-openocd-0.10.0-8-20180724-1118-centos64.tgz 
     cd ~/e200_opensource/sirv-e-sdk/
     mkdir -p work/build/opencd/prefix
     cd work/build/opencd/prefix/
     ln -s ~/gnu-mcu-eclipse/openocd/0.10.0-8-20180724-1118/bin/ bin
     cd ~/e200_opensource/sirv-e-sdk/
     mkdir -p work/build/riscv-gnu-toolchain/risc32-unknown-elf/prefix/
     cd work/build/riscv-gnu-toolchain/risc32-unknown-elf/prefix/
     ln -s ~/gnu-mcu-eclipse/riscv-none-gcc/7.2.0-2-20180111-2230/bin/ bin

3. 編譯demo_gpio程序,命令如下:

cd ~/e200_opensource/sirv-e-sdk/
make software PROGRAM=demo_gpio BOARD=sirv-e203-arty

如何建立自己的RISC-V編譯環境?

1.RISC-V編譯環境框架
這是我RISC-V編譯環境的架構:

build case common toolchain

2.各目錄內容介紹
2.1 toolchain:工具鏈目錄我不打算介紹,如果有不明白的,可以看這個博客:
rocket-chip工具鏈的編譯與使用(https://blog.csdn.net/a_weiming/article/details/84801051)

2.2 project:這個目錄就是放你的項目代碼的。每個項目建立一個目錄。在這個例子中,我放的是test目錄,test的源代碼如下(修改於/riscv-tests/benchmarks/vvadd):

 

2.3 common:這個目錄比較重要,而且改動的地方比較多。

2.3.1 encoding.h:這個目錄不解釋,就是RISC-V各重要CSR寄存器的定義。

2.3.2 program.ld:這個文件是修改於/riscv-tests/benchmarks/common/test.ld。

 

2.3.3 program.S:這個文件改動比較大(修改於/riscv-tests/benchmarks/common/crt.S),這個文件改動需要注意以下幾點:

1)擴展名必須為大寫的S,大寫的S可以使gcc自動識別匯編程序中的C預處理命令,像#include、#define、#ifdef、 #endif等,也就是說,使用gcc進行編譯,你可以在匯編程序中使用C的預處理命令。
2)因為我生成的rocket-chip是不使用浮點的,不使用虛擬內存,不使用ROCC的,所以很多內容我直接刪改了,而且棧和異常入口都是根據我生成的rocket-chip來設定的,大家可以根據自己的情況進行修改。

 

 

 

 2.4 bulid:這個目錄最主要的是Makefile腳本,用於調用工具鏈編譯project。我只貼部分代碼,是生成elf的代碼,生成bin、hex和dump的方法大家參考/riscv-tests/benchmarks/Makefile。

部分代碼:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM