Merge branch 'XS-MLVP:main' into main

This commit is contained in:
Shio2077 2025-04-01 20:08:57 +08:00 committed by GitHub
commit ec09eb24dc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 120 additions and 77 deletions

View File

@ -49,7 +49,7 @@ check_dut:
$(MAKE) dut DUTS="$$DUT_NAME"; \
fi; \
else \
echo "No DUT mapping found for target: $$t, skipping..." >&2; \
echo "No mapping found for target: $$t in dir_map.f, skipping check" >&2; \
fi; \
done; \
fi
@ -61,7 +61,7 @@ dut: rtl
for d in $(PROCESSED_DUTS); do \
dir=$$(awk -F' --> ' -v dut="$$d" '$$1 == dut {print $$2; exit}' dir_map.f); \
if [ -z "$$dir" ]; then \
echo "No mapping found for '$$d' in dir_map.f, skipping deletion" >&2; \
echo "No mapping found for DUT: $$d in dir_map.f, skipping deletion" >&2; \
continue; \
fi; \
echo "Cleaning dut/$$dir"; \

View File

@ -6,7 +6,7 @@ frontend_ifu_frontend_trigger --> FrontendTrigger --> ut_frontend/ifu/frontend_t
frontend_ifu_pred_checker --> PredChecker --> ut_frontend/ifu/pred_checker
frontend_ifu_predecode --> PreDecode --> ut_frontend/ifu/predecode
frontend_ifu_rvc_expander --> RVCExpander --> ut_frontend/ifu/rvc_expander
frontend_ifu_top --> NewIFU -->
frontend_ifu_top --> NewIFU --> ut_frontend/ifu/ifu_top
frontend_itlb --> TLB --> ut_frontend/itlb/classical_version
frontend_itlb --> TLB --> ut_frontend/itlb/toffee_version
frontend_tlb_fa --> TLBFA --> ut_frontend/itlb/submodules/TLBFA

View File

@ -12,7 +12,6 @@ weight: 13
1. Linux操作系统。建议WSL2下安装Ubuntu22.04。
1. Python。建议Python3.11。
1. picker。按照[快速开始](https://open-verify.cc/mlvp/docs/quick-start/installer/)中的提示安装最新版本。
1. toffee。将在后面自动安装。也可按照[快速开始](https://open-verify.cc/mlvp/docs/mlvp/quick-start/)中的提示手动安装最新版本。
1. lcov。用于后续test阶段报告生成。使用包管理器即可下载`sudo apt install lcov`
**环境配置完成**后clone仓库

View File

@ -26,6 +26,13 @@ RVI指令永远判断为合法。
对于RVC指令的判定详细内容参阅20240411的RISCV手册的26\.8节表格列出的指令条件。
## 常量说明
| 常量名 | 常量值 | 解释 |
| ---- | ---- | ---- |
| XLEN | 64 | 通用寄存器位宽决定指令扩展时使用rv32还是rv64还是rv128 |
| fLen | 64 | 香山支持d扩展故为64 |
## RVCExpander接口说明
### 输入接口
@ -292,6 +299,8 @@ addi的格式形如\| imm\[11\:0\] \| rs1 \| 000 \| rd \| 0010011 \|
lui指令的格式形如 \| imm[31:12] \| rd \| 0110111 \|
当立即数为0时这一字段reserved
当rd为0时为hint也可当作cli进行译码。
当rd为2时为addi16sp指令

View File

@ -4,7 +4,7 @@ linkTitle: IFU
weight: 12
---
**本文档参考[香山IFU设计文档](https://github.com/OpenXiangShan/XiangShan-Design-Doc/blob/master/docs/frontend/IFU/IFU.md)写成**
**本文档参考[香山IFU设计文档](https://github.com/OpenXiangShan/XiangShan-Design-Doc/blob/master/docs/frontend/IFU/index.md)写成**
本文档撰写的内容截至[c670557]

View File

@ -4,11 +4,11 @@ linkTitle: 环境配置
weight: 12
---
## 推荐使用WSL2+Ubuntu22.04+GTKWave
## WSL2+Ubuntu22.04+GTKWaveWindows用户推荐使用
我们推荐Windows10/11用户通过WSL2进行开发在此给出通过此方法进行环境配置的教程集锦仅供参考。如环境安装过程中出现任何问题欢迎在QQ群群号<b>976081653</b>)中提出,我们将尽力帮助解决。此页面将收集大家提出的所有环境配置相关问题并提供解决方案,欢迎随时向我们提问!
我们推荐 Windows10/11 用户通过 WSL2 进行开发在此给出通过此方法进行环境配置的教程集锦仅供参考。如环境安装过程中出现任何问题欢迎在QQ群群号<b>976081653</b>)中提出,我们将尽力帮助解决。此页面将收集大家提出的所有环境配置相关问题并提供解决方案,欢迎随时向我们提问!
## 1、在Windows下安装WSL2Ubuntu22.04
### 1、在 Windows 下安装 WSL2Ubuntu22.04
参考资源:
@ -16,25 +16,83 @@ weight: 12
--- 其它资源:[安装WSL2和Ubuntu22.04版本](https://blog.csdn.net/HHHBan/article/details/126843786)
## 2、打开WSL换源
### 2、打开 WSL换源
推荐使用清华源:[清华大学开源软件镜像站-Ubuntu软件仓库](https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/)
## 3、配置验证环境
### 3、配置验证环境
请参照[开放验证平台学习资源-快速开始-搭建验证环境](https://open-verify.cc/mlvp/docs/quick-start/installer/)配置picker环境。
## 4、使用 GTKWave
使用[重庆大学硬件综合设计实验文档-Windows原生GTKWave](https://co.ccslab.cn/tips/win-gtkwave/)给出的方法可以通过在WSL中输入 `gtkwave.exe wave.fst` 打开在Windows下安装的GTKWave。请注意gtkwave在使用中需要进入fst文件所在文件夹否则会出现无法
initialize的情况。
请参照[开放验证平台学习资源-快速开始-搭建验证环境](https://open-verify.cc/mlvp/docs/quick-start/installer/)配置环境。
以下是示例方法:
```bash
cd out
gtkwave.exe {test_name}.fst
cd ..
# 基本工具包
cd ~ && sudo apt-get update
sudo apt-get install -y build-essential cmake git wget curl lcov autoconf flex bison libgoogle-perftools-dev gcc python3.11 python3.11-dev python3.11-distutils python3-pip python-is-python3
rm -rf /var/lib/apt/lists/*
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11
# verilator
git clone https://github.com/verilator/verilator.git
cd verilator
git checkout v4.218 # 4.218为最低需求版本,可自行查看并选择新版本
autoconf && ./configure && make -j$(nproc) && make install
cd .. && rm -rf verilator
# verible
curl -sS https://github.com/chipsalliance/verible/releases/download/v0.0-3946-g851d3ff4/verible-v0.0-3946-g851d3ff4-linux-static-x86_64.tar.gz -o /tmp/
tar -zxvf /tmp/verible-v0.0-3946-g851d3ff4-linux-static-x86_64.tar.gz -C /tmp/
copy /tmp/verible-v0.0-3946-g851d3ff4/bin/verible-* /usr/local/bin/
sudo chmod +x /usr/local/bin/verible-*
rm /tmp/verible-*
# pcre2
curl -sS https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.45/pcre2-10.45.tar.gz -o /tmp/
tar -zxvf /tmp/pcre2-10.45.tar.gz -C /tmp/
cd /tmp/pcre2-10.45
./configure --prefix=/usr/local && make -j$(nproc) && make install
rm -rf /tmp/pcre2* && cd ~
# swig
# 注意不要使用 apt install swig将会下载不符合最低要求的版本 4.0.2
curl -sS http://prdownloads.sourceforge.net/swig/swig-4.3.0.tar.gz -o /tmp/
tar -zxvf /tmp/swig-4.3.0.tar.gz -C /tmp/
cd /tmp/swig-4.3.0
./configure --prefix=/usr/local && make -j$(nproc) && make install
rm -rf /tmp/swig* && cd ~
# 更新本地包
apt-get update && apt-get -y upgrade
# picker
git clone https://github.com/XS-MLVP/picker.git --depth=1
cd picker
make init && make && make install
cd .. && rm -rf picker
# UnityChipForXiangShan
git clone https://github.com/XS-MLVP/UnityChipForXiangShan.git
cd UnityChipForXiangShan
pip3 install --no-cache-dir -r requirements.txt
```
## 5、使用VSCode插件Live Server查看验证报告
### 4、使用 GTKWave 查看波形文件
使用[重庆大学硬件综合设计实验文档-Windows原生GTKWave](https://co.ccslab.cn/tips/win-gtkwave/)给出的方法可以通过在WSL中输入 `gtkwave.exe wave.fst` 打开在 Windows 下安装的 GTKWave。请注意gtkwave在使用中需要进入 fst 文件所在文件夹,否则会出现无法
initialize 的情况。
```bash
gtkwave.exe /out/{test_name}.fst
```
### 5、使用 VSCode 插件 Live Server 查看验证报告
成功安装插件Live Server后打开文件列表定位到 `/out/report/2025*-itlb-doc-*/index.html` 右键并选择 `Open With Live Server`,之后在浏览器中打开提示的端口(默认为`//localhost:5500`)即可。
## docker一键部署方案MAC用户可用
我们提供了 MAC 可用的 docker 环境,已在 Docker Hub 发布,名称为 `unitychip-env`。安装 Docker Desktop 后在命令行使用以下命令即可获取并打开开发环境。需下载约 500MB 的镜像,展开后约占用 1GB 空间。
```bash
docker search unitychip-env
docker pull dingjunbi/unitychip-env && docker run unitychip-env
cd UnityChipForXiangShan && git pull
```
[Docker Hub使用文档](https://docs.docker.com/docker-hub/)
[Dockerdocker 拉取镜像及查看pull下来的image在哪里](https://blog.csdn.net/sj349781478/article/details/105267887/)

View File

@ -58,8 +58,8 @@ TLB 应当正常接收来自 IFU 与 ICache 的取指令请求,查找自身页
| No. | 名称 | 说明 |
|--------|-------------------|------------------------|
| 1.1 | 接收来自 IFU 请求requestor0、1 | ITLB 根据请求查找自身缓存 TLBuffer返回 hit/miss 结果 |
| 1.2 | 接收来自 ICache 请求requestor2 | 注意此处为阻塞式访问,每次访问后若 miss 应当 reset 后再次访问 |
| 1.1 | 接收来自 ICache 请求requestor0、1 | ITLB 根据请求查找自身缓存 TLBuffer返回 hit/miss 结果 |
| 1.2 | 接收来自 IFU 请求requestor2 | 注意此处为阻塞式访问,每次访问后若 miss 应当 reset 后再次访问 |
| 1.3 | 接收条件判断requestor0、1 | valid 信号 |
| 1.4 | 接受条件判断requestor2 | valid-ready 信号 |

View File

@ -1,6 +1,6 @@
---
title: FTQ顶层
linkTitle: FTQ顶层
linkTitle: 01_FTQ顶层
weight: 12
---
@ -14,7 +14,7 @@ weight: 12
- **fromBackend接受后端执行结果和commit信号的接口CtrlToFtqIO**
- **toBpu向BPU发送训练信息和重定向信息的接口FtqToBpuIO**
- **toIfu向IFU发送取值目标和重定向信息的接口FtqToIfuIO**
- toICache向ICache发送取值目标的接口FtqToICacheIO)
- toICache向ICache发送取值目标的接口FtqToICacheIO
- **toBackend向后端发送取值目标的接口FtqToCtrlIO**
- toPrefetch向Prefetch发送取值目标的接口FtqToPrefetchIO
- mmio

View File

@ -1,12 +1,12 @@
---
title: FTQ子队列
linkTitle: FTQ子队列
linkTitle: 02_FTQ子队列
weight: 12
---
# FTQ子队列
## 文档概述
***请注意:从本篇开始,就涉及待验证的功能点和测试点了***
在之前的介绍中我们采用FTQ项这个术语描述描述FTQ队列中的每一个元素实际上这只是一种便于抽象的说法。
实际上的FTQ队列是由好多个子队列共同构成的一些子队列维护一类信息另一些子队列维护另一类信息相同ftqIdx索引的子队列信息共同构成一个完整的FTQ项。
@ -16,9 +16,10 @@ weight: 12
下面来介绍一些FTQ的主要子队列以及它们内部存储的数据结构。此外FTQ还有一些存储中间状态的更小的队列
## 术语说明
| 名称 | 定义 |
| --- | --- |
| 暂无 | 暂无 |
| 名称 | 定义 |
| -------------------------------------------------------- | ------------------------------------------------------ |
| [FTB项](https://open-verify.cc/xs-bpu/docs/ports/00_ftb/) | 分支预测结果的基本组成项,包含对预测块中分支指令和跳转指令的预测 |
| 取指目标 | 一个预测块内包含的所有指令PC当然它不是直接发送所有PC而是发送部分信号接收方可由该信号推出所有PC |
## 子模块列表
@ -255,7 +256,7 @@ ftq_redirect_mem存储的表项。继承自SpeculativeInfo存储RAS预测器
| 5\.2 | FTQ_META_1R_SRAM | READ | 向多端口中输入renraddr决定是否读以及读取地址从rdata读取 |
## 附录
***虽然列在附录,但实际上这段内容依然十分重要,请一定要查看。***
***虽然列在附录,但实际上这段内容依然十分重要,当你需要的时候请一定要查看。***
### 其余状态子队列
上述存储结构是FTQ中比较核心的存储结构实际上还有一些子队列用来存储一些状态信息也同样都是存储ftqsize个64元素。主要有以下
@ -265,6 +266,8 @@ update_target记录每个FTQ项的跳转目标跳转目标有两种
写入时机上一个周期的bpu_in_fire有效的时候或者说相对于bpu_in_fire有效时延迟一个周期写入。
newest_entry_ptrnewest_entry_target这几个内部信号表明我们当前最新的有效FTQ项。BPU新的写入重定向等等都会对最新FTQ项进行新的安排在相应的文档中对其生成方式做具体的描述。
cfiIndex_vec记录每个FTQ项的发生跳转的指令cficontrol flow instruction指令在其分支预测块中的位置
写入时机相对于bpu_in_fire有效时延迟一个周期写入。

View File

@ -1,11 +1,9 @@
---
title: FTQ接收BPU分支预测结果
linkTitle: FTQ接收BPU分支预测结果
linkTitle: 03_FTQ接收BPU分支预测结果
weight: 12
---
# FTQ接收BPU分支预测结果
## 文档概述
BPU会将分支预测结果和meta数据发给FTQ。
@ -22,7 +20,7 @@ BPU会将分支预测结果和meta数据发给FTQ。
| RAS (Return Address Stack) | 返回地址堆 |
| FTQ Entry | FTQ队列中的单个表项 |
## 模块功能说明
## 模块功能说明
### 1. 新的预测块进队条件
#### **1.1 成功接收数据**

View File

@ -1,12 +1,9 @@
---
title: FTQ向IFU发送取指目标
linkTitle: FTQ向IFU发送取指目标
linkTitle: 04_FTQ向IFU发送取指目标
weight: 12
---
# FTQ向IFU发送取指目标
## 文档概述
IFU需要取FTQ中的项进行取指令操作同时也会简单地对指令进行解析并写回错误的指令
FTQ发送给IFU的信号同时也需发送给ICache一份ICache是指令缓存帮助快速读取指令。

View File

@ -1,12 +1,9 @@
---
title: IFU向FTQ写回预译码信息
linkTitle: IFU向FTQ写回预译码信息
linkTitle: 05_IFU向FTQ写回预译码信息
weight: 12
---
# IFU向FTQ写回预译码信息
## 文档概述
IFU获取来自BPU的预测信息之后会执行预译码并将FTQ项写回FTQ中去。我们会比对FTQ中原BPU预测项和预译码的结果判断是否有预测错误

View File

@ -1,11 +1,9 @@
---
title: FTQ接收后端重定向
linkTitle: FTQ接收后端重定向
linkTitle: 06_FTQ接收后端重定向
weight: 12
---
# FTQ接收后端重定向
## 文档概述
FTQ重定向信息有两个来源分别是IFU 和 后端。两者的 重定向接口大致相似,但重定向的过程有一定区别。

View File

@ -1,12 +1,9 @@
---
title: FTQ接收IFU重定向
linkTitle: FTQ接收IFU重定向
linkTitle: 07_FTQ接收IFU重定向
weight: 12
---
# FTQ接收IFU重定向
## 文档概述
除了后端IFU也会发送重定向相关消息和后端不同IFU的重定向信息来自于预译码写回信息。相同的是它们都是通过BranchPredictionRedirect的接口传递重定向信息。
## 术语说明

View File

@ -1,12 +1,9 @@
---
title: FTQ向后端发送取指目标
linkTitle: FTQ向后端发送取指目标
linkTitle: 08_FTQ向后端发送取指目标
weight: 12
---
# FTQ向后端发送取指目标
## 文档概述
pc取值目标会发给后端pc mem让他自己进行存储之后从自己的pc mem取指此外最新的FTQ项和对应的跳转目标也会发给后端。

View File

@ -1,11 +1,9 @@
---
title: 执行单元修改FTQ状态队列
linkTitle: 执行单元修改FTQ状态队列
linkTitle: 09_执行单元修改FTQ状态队列
weight: 12
---
# 执行单元修改FTQ状态队列
## 文档概述
后端的写回信息,包括重定向信息和更新信息,实际上都是执行之后,由实际执行单元根据结果发回的
## 术语说明

View File

@ -1,12 +1,9 @@
---
title: 冲刷指针和状态队列
linkTitle: 冲刷指针和状态队列
linkTitle: 10_冲刷指针和状态队列
weight: 12
---
# 冲刷FTQ指针和状态队列
## 文档概述
之前讲了后端和IFU重定向写回会修改一些状态队列。此外FtqPtr也是一种比较重要的维护信息。由后端或者IFU引起的重定向需要恢复各种类型用来索引FTQ项的FtqPtr。而当重定向是由后端发起的时候还要修改提交状态队列说明指令已经被执行。
## 术语说明
@ -70,7 +67,7 @@ rob_commits的valid字段有效可以根据其中信息对指令进行提交
| fromIfu | 接收IFU重定向 |
| icacheFlush | 将flush信号转发到icache |
| toIFU | 将后端重定向转发到IFU |
所有顶层信号均在FTQ顶层IO一文中详述。
## 测试点总表
| 序号 | 功能名称 | 测试点名称 | 描述 |

View File

@ -1,12 +1,9 @@
---
title: FTQ向BPU发送更新与重定向信息
linkTitle: FTQ向BPU发送更新与重定向信息
linkTitle: 11_FTQ向BPU发送更新与重定向信息
weight: 12
---
# FTQ向BPU发送更新与重定向信息
## 文档概述
FTQ将已提交指令的更新信息发往BPU进行训练同时转发重定向信息。

View File

@ -1,10 +1,10 @@
---
title: FTQ概述
linkTitle: FTQ概述
linkTitle: FTQ
weight: 12
---
*下文包括所有的FTQ文档中会提到一些关于BPU和IFU的相关知识详情需要去查看对应的文档: *
下文包括所有的FTQ文档中会提到一些关于BPU和IFU的相关知识详情需要去查看对应的文档:
- [BPU文档链接](https://open-verify.cc/xs-bpu/docs/)
- [IFU文档链接](https://open-verify.cc/UnityChipForXiangShan/docs/98_ut/01_frontend/01_ifu/)
@ -67,7 +67,4 @@ FTQ的全名叫取值目标队列队列中的一个项叫做FTQ项BPU写
## 循环队列
FTQ队列实际上是一个循环队列所有类型的FTQ指针都是同一类型ftqPtr的value字段用来表示索引flag字段则用来表示循环轮数flag只有一位进入新的循环时flag位翻转。
这样,我们就可以在一个有限的队列空间内不断更新新的项,以及正确进行比较,判断哪个项在队列中更靠前。
*在香山的代码中设计了isAfter和isBefore的函数来比较指针大小字面上的意思是指针在队列靠后还是在队列靠前的位置但从取指令块来说*
### 最新项
有几个内部信号我想在这里提一下newest_entry_ptrnewest_entry_target这几个内部信号表明我们当前最新的有效FTQ项。BPU新的写入重定向等等都会对最新FTQ项进行新的安排在相应的文档中对其生成方式做具体的描述。
这样,我们就可以在一个有限的队列空间内不断更新新的项,以及正确进行比较,判断哪个项在队列中更靠前或者更靠后。

View File

@ -21,12 +21,12 @@ import inspect
# request to TLB. TLB is expected to return a miss in the next cycle and initiate
# a request to the PTW. At this point, you can simultaneously verify whether the
# vpn in the PTW request is correct.
def test_req_from_icache_rand_vaddr_rand_valid_single_port(tlb_fixture):
def test_req_from_ifu_and_icache_rand_vaddr_rand_valid_single_port(tlb_fixture):
"""
Compare the PTW request with the reference:
rand vaddr
rand valid
single port 0 / 1
Func: Compare the PTW request with the reference:
subfunc1: rand vaddr
subfunc2: rand valid
subfunc3: single port 0 / 1 / 2
"""
# connect to fixture
tlb = tlb_fixture
@ -90,6 +90,7 @@ def test_req_from_icache_rand_vaddr_rand_valid_single_port(tlb_fixture):
######################################################################################
### CASE EXAMPLE
# Running the following test case will show a pass:
def test_req_from_icache_rand_vaddr_rand_valid_muti_port(tlb_fixture):
"""
Func: compare the PTW request with the reference: