riscv co-sim:riscv內核開發集成simulator仿真
1. 原理
a. 確定對比粒度
仿真對比的粒度需要simulator(eg.dromajo、spike)與RTL內核共同狀態確定
simulator與RTL存在的相同狀態(simulator維護的變量與RTL的寄存器狀態)越多,對比相可以越多,也越精細,同樣代價越更大
一般而言,我們維護程序在提交指令後可見的架構寄存器相同(僅在指令提交時進行對比),即可保證simulator與RTL內核行爲一致
如果simulator更加精細,流水線與RTL一致,每級流水線內都有相對應的狀態,我們可以做到每個週期都進行對比,比較對應流水線的狀態
RTL trace interface
將RTL內部需要跟蹤對比的信號拽到testbench中
關鍵信號 | 含義 |
---|---|
valid | 指令提交,架構寄存器已經更新 |
core input signals | 輸入到core內進行計算處理的數據,即影響架構寄存器變化的信號 |
core state signals | 架構寄存器或者其他需要與simulator對比的信號 |
simulator step interface
提取simulator中單步執行的核心函數,包括輸入的形式參數,返回的結果
DPI interface & TestBench
將simulator的單步執行接口使用DPI接口封裝,使TestBench可見
在TestBench中調度。監控valid信號,有效啓動捕獲RTL接口上的信號,並將信息通過DPI接口注入到simulator 單步執行接口中
simulator執行後將返回結果與RTL的結果進行對比,結果一致即可確認RTL與simulator行爲一致,如此循環往復對比
另外,一般而言,simulator與RTL是螺旋更迭的,可以不斷增加simulator與RTL對比的狀態,以使兩者有更多checkpoint,這樣在simulator上跑的所有case能快速在RTL環境移植與debug
b. 系統構建
simulator編譯生成共享庫文件
編譯simulator,獲得靜態鏈接庫(linux上一般以.a爲後綴)
emulator編譯
使用RTL仿真工具(如vcs、verilator、xrun等)將riscv內核、simulator編譯得到的靜態鏈接庫以及帶有對比的TestBench進行編譯,得到可執行的emulator
c. run tests
使用生成的emulator加載二進制文件進行RTL仿真與關鍵狀態對比