diff --git a/documents/content/zh-cn/docs/98_UT/00_standard/Caddi4spn.png b/documents/content/zh-cn/docs/98_UT/00_standard/Caddi4spn.png new file mode 100644 index 0000000..84ecc5f Binary files /dev/null and b/documents/content/zh-cn/docs/98_UT/00_standard/Caddi4spn.png differ diff --git a/documents/content/zh-cn/docs/98_UT/00_standard/_index.md b/documents/content/zh-cn/docs/98_UT/00_standard/_index.md index f28c9d1..d49c5cf 100644 --- a/documents/content/zh-cn/docs/98_UT/00_standard/_index.md +++ b/documents/content/zh-cn/docs/98_UT/00_standard/_index.md @@ -2,12 +2,12 @@ title: 验证文档规范 linkTitle: 验证文档规范 weight: 1 -draft: true +draft: false --- {{% pageinfo %}} 本规范规定了“万众一芯”验证文档的必要形式和结构(不是验证报告的模板),已发布和将来将要发布的文档都需要遵循这一规范。 -{{% pageinfo %}} +{{% /pageinfo %}} # 万众一芯验证文档格式规范 @@ -15,11 +15,15 @@ draft: true ## 文档概述 -**【必选项】** 在该部分对整个文档进行简约描述,例如内容概述,待验证模块的基本功能、特殊需求、特定规格、目标读者、知识前置等。目的是通过对该部分,读者便了解是否具有其感兴趣的内容。例如本文档是对验证文档的编写要求进行描述,便于多文档协作,规范验证的数据输入,特定数据标签等。 +文档概述标题请用二号标题格式(两个#)。 + +**【必填项】** 在该部分对整个文档进行简约描述,例如内容概述,待验证模块的基本功能、特殊需求、特定规格、目标读者、知识前置等。目的是通过对该部分,读者便了解是否具有其感兴趣的内容。例如本文档是对验证文档的编写要求进行描述,便于多文档协作,规范验证的数据输入,特定数据标签等。 ## 术语说明 -**【必选项】** 该部分需要列出术语和关键概念解释,方便读者参考。 +术语说明标题请用二号标题格式(两个#)。 + +**【必填项】** 该部分需要列出术语和关键概念解释,方便读者参考。 1. 优先解释模块专有缩写(如TLB, FIFO等) 2. 对容易混淆的概念请务必明确(如虚拟地址和物理地址等) 3. 示例格式如下: @@ -32,85 +36,151 @@ draft: true 如果有其他补充情况请在此说明,例如:上述命名描述仅针对香山处理器,不代表RISC-V标准或者其他处理器。 +## 前置知识 + +前置知识标题请用二号标题格式(两个#)。 + +**【可选项】** 在阅读文档或进行验证之前,建议掌握一些关键前置知识,以便更深入理解相关内容。例如,在撰写LoadStoreQueue(LSQ)文档时,讲述RAW(Read After Write)违例有助于理解操作之间的依赖关系。在撰写Icache或L2Cache文档时,介绍缓存层级、替换策略和一致性模型等基本概念也有助于读者理解。如果涉及复杂算法,也应对其进行简要描述。 + +基本要求: +1. 该部分内容应简洁,易于理解。如篇幅较长,可将内容移至附录。 +2. 针对较为复杂的内容,可以通过图像、伪代码和案例进行解释,以降低理解难度。 + +下面是一个举例: + +## 前置知识 +### st-ld违例 +在现代处理器中,Load 和 Store 指令通常采用乱序执行的方式进行处理。这种执行策略旨在提高处理器的并行性和整体性能。然而,由于 Load 和 Store 指令在流水线中的乱序执行,常常会出现 Load 指令越过更早的相同地址的 Store 指令的情况。这意味着,Load 指令本应通过前递(forwarding)机制从 Store 指令获取数据,但由于 Store 指令的地址或数据尚未准备好,导致 Load 指令未能成功前递到 Store 的数据,而 Store 指令已被提交。由此,后续依赖于该 Load 指令结果的指令可能会出现错误,这就是 st-ld 违例。 + +考虑以下伪代码示例: + +```mips +ST R1, 0(R2) ; 将 R1 的值存储到 R2 指向的内存地址 +LD R3, 0(R2) ; 从 R2 指向的内存地址加载值到 R3 +ADD R4, R3, R5 ; 使用 R3 的值进行计算 +``` + +假设在这个过程中,Store 指令由于某种原因(如缓存未命中)未能及时完成,而 Load 指令已经执行并读取了旧的数据(例如,从内存中读取到的值为 `0`)。此时,Load 指令并未获得 Store 指令更新后的值,导致后续计算的数据错误。 + +通过上述例子,可以清楚地看到 Store-to-Load 违例如何在乱序执行的环境中导致数据一致性问题。这种问题强调了在指令调度和执行过程中,确保正确的数据流动的重要性。现代处理器通过多种机制来检测和解决这种违例,以维护程序的正确性和稳定性。 + ## 整体框图 -**【可选项】** 该部分可选章节,若模块含多个子模块或复杂数据流,需提供框图辅助说明。 +整体框图标题请用二号标题格式(两个#)。 + +**【可选项】** 该部分为可选章节,若模块含多个子模块或复杂数据流,需提供框图辅助说明,便于读者理解。 基本要求: 1. 图必须清晰,最好为矢量图,可使用Visio/Draw.io等工具绘制,导出为PNG/SVG格式; 2. 图中需标注关键信号流向; -3. 框图中子模块命名需与“子模块列表”章节严格一致。 -4. 需要图题目,位置居中 +3. 框图中子模块命名需与“子模块列表”章节严格一致; +4. 图像和图表标题的位置需要居中; +5. 如果有多个图表,图表题目需要添加相应标号,如图1、图2等; -

【图】

-

示例整体框图

+示例: +

+ 示例图像 +

+

示例图1:IFU 整体框图

## 流水级示意图 -**【可选项】** 若为流水线型模块,需说明各级流水功能与时序关系。* +流水级示意图标题请用二号标题格式(两个#)。 + +**【可选项】** 若为流水线型模块,需说明各级流水功能与时序关系。 **编写要求**: -1. 可使用Visio/Draw.io等工具绘制,导出为PNG/SVG格式; -2. 涉及到的模块名称需要保持一致性 -3. 重要数据除了列出名称以外,还需要标明位宽等信息 +1. 图必须清晰,最好为矢量图,可使用Visio/Draw.io等工具绘制,导出为PNG/SVG格式; +2. 涉及到的模块名称需要与上下文保持一致; +3. 重要信号除了列出信号名称以外,还需要标明位宽等信息; +4. 图像和图表标题的位置需要居中; +5. 如果有多个图表,图表题目需要添加相应标号,如图1、图2等。 + +示例: +

+ 示例图像 +

+

示例图2:LSU-LoadUnit 流水线架构图

## 子模块列表 -\[可选项\]*若模块由多个子模块组成,需在此列出* +子模块列表标题请用二号标题格式(两个#)。 + +**【可选项】** 如果一个模块由多个子模块组成,则需要在此处列出所有相关的子模块,并进行简要说明。这有助于清晰地展示模块的结构和功能,便于读者理解各个子模块之间的关系及其在整体系统中的作用。 以下是IFU top文档中的一个示例: | 子模块 | 描述 | | --------------------------- | ---------------------- | -| [PreDecoder](01_predecode.md) | 预译码模块 | -| [F3Predecoder](02_f3predecoder.md) | F3阶段预译码模块 | -| [RVCExpander](03_ifu_rvc_exp.md) | RVC指令扩展模块 | -| [PredChecker](04_pred_checker.md) | 预检查模块 | -| [FrontendTrigger](05_frontend_trigger.md) | 前端断点模块 | +| [PreDecoder](01_predecode.md) | 预译码模块,用于生成有效指令标识和类型信息 | +| [F3Predecoder](02_f3predecoder.md) | F3阶段预译码模块,从PreDecoder中时序优化出来的模块,负责判定CFI指令的类型 | +| [RVCExpander](03_ifu_rvc_exp.md) | RVC指令扩展模块,负责对传入的指令进行指令扩展,并解码计算非法信息 | +| [PredChecker](04_pred_checker.md) | 预检查模块,校验并修正预测信息 | +| [FrontendTrigger](05_frontend_trigger.md) | 前端断点模块,用于在前端设置硬件断点和检查 | ## 模块功能说明 -\[必填项\] *需按功能树形式逐级分解,每个功能点需对应后续测试点。* +模块功能说明标题请用二号标题格式(两个#)。 +**【必填项】** 需采用功能树形式逐级分解DUT的各项功能,并对所有功能进行描述,确保每个功能点都对应相应的测试点。这种结构化的方法不仅有助于全面覆盖所有功能,还便于后续文档的维护和更新。 **编写规则:** -1. 请用包裹整个“模块功能说明”部分。 -2. 采用X.Y.Z多级编号(如1.2.3表示主功能1→子功能2→测试点3,也可以继续细分) -3. 功能描述需明确输入条件、处理过程、输出结果 +1. 请使用 标签包裹整个“模块功能说明”部分; +2. 采用 X.Y.Z 多级编号(如 1.2.3 表示主功能 1 → 子功能 2 → 测试点 3,且可进一步细分); +3. 多级编号的标题格式按照级别增加,例如:“1. 读FIFO操作”应为三号标题格式 “1.1. 常规读取”应为四号标题格式; +4. 功能描述应清晰列出输入条件、处理过程和输出结果。 +5. 针对每个功能进行测试点分解,应详细列出每个测试点,明确其目的和预期结果。 +6. 如果测试点较多可以先列一个小表格。 -具体来说,可以按照如下的格式写作: +具体来说,可以按照如下的格式写作(示例内容仅供参考,并不代表实际逻辑或内容): -## 模块功能说明 +## 示例:FIFO模块功能说明 -该章节需要对待验证模板的所有功能进行描述,并且每个功能点 +### 示例1. 读FIFO操作 -### 1. 功能A说明 -针对功能A分解测试点 +#### 示例1.1. 常规读取 +**功能描述**:当rd_en=1且empty=0时,在时钟上升沿输出rdata -如果测试点较多可以先列一个小表格 +**建议观测点**: +- 读指针递增逻辑 +- rdata与预期数据匹配 -### 2. 功能B说明 +### 示例2. 写FIFO操作 -针对功能B分解测试点 +#### 示例2.1. 常规写入 -如果测试点较多可以先列一个小表格 +**功能描述**:当wr_en=1且full=0时,在时钟上升沿存储wdata -### 3. 功能C说明 +**观测点**: +- 写指针递增逻辑 +- 存储阵列数据更新 -针对功能C分解测试点 +### 示例3. 接收FTQ取指令请求(F0流水级) -如果测试点较多可以先列一个小表格;针对每个测试点,给出设置cov_group的建议 +​在F0流水级,IFU接收来自FTQ以预测块为单位的取指令请求。请求内容包括预测块起始地址、起始地址所在cache line的下一个cache line开始地址、下一个预测块的起始地址、该预测块在FTQ里的队列指针、该预测块有无taken的CFI指令(控制流指令)和该taken的CFI指令在预测块里的位置以及请求控制信号(请求是否有效和IFU是否ready)。每个预测块最多包含32字节指令码,最多为16条指令。IFU需要置位ready驱动FTQ向ICache发送请求。 + +#### 示例3.1. F0流水级接收请求 + +IFU应当能向FTQ报告自己已ready。 + +所以,对于这一测试点我们只需要在发送请求后检查和ftq相关的的ready情况即可。 + +| 序号 | 功能名称 | 测试点名称 | 描述 | +|---|----|-------|---------------------| +| 1\.1 | IFU_RCV_REQ | READY | IFU接收FTQ请求后,设置ready | ## 常量说明 -\[可选项\] *需列出模块中所有可配置参数及其物理意义* +常量说明标题请用二号标题格式(两个#)。 + +**【可选项】** 需要列出模块中所有可配置参数及其物理意义,以便于用户理解各参数的作用和影响。 **示例:** @@ -120,7 +190,10 @@ draft: true | FIFO_DEPTH | 8 | 深度配置 | ## 接口说明 -\[必填项\] *详细解释各种接口的含义、来源* + +接口说明标题请用二号标题格式(两个#)。 + +**【必填项】** 详细解释各种接口的含义和来源,包括接口的功能、用途。这有助于用户理解各接口的工作原理和应用场景,从而更有效地使用这些接口。 **编写规则** @@ -130,13 +203,34 @@ draft: true ## 接口时序 -*\[可选项\] 对复杂接口,提供波形图的案例* +接口时序标题请用二号标题格式(两个#)。 -示例可参考IFU top文档的[时序说明](./01_frontend/01_ifu/_index.md#接口时序)。 +**【可选项】** 针对复杂接口,可以提供波形图案例,以直观展示信号变化和时间关系。 + +以下是节选自IFU top文档的一个例子: + +## 接口时序 +### FTQ 请求接口时序示例 + +

+ port1 +

+ +上图示意了三个 FTQ 请求的示例,req1 只请求缓存行 line0,紧接着 req2 请求 line1 和 line2,当到 req3 时,由于指令缓存 SRAM 写优先,此时指令缓存的读请求 ready 被指低,req3 请求的 valid 和地址保持直到请求被接收。 + +### ICache 返回接口以及到 Ibuffer 和写回 FTQ 接口时序示例 + +

+ port2 +

+ +上图展示了指令缓存返回数据到 IFU 发现误预测直到 FTQ 发送正确地址的时序,group0 对应的请求在 f2 阶段了两个缓存行 line0 和 line1,下一拍 IFU 做误预测检查并同时把指令给 Ibuffer,但此时后端流水线阻塞导致 Ibuffer 满,Ibuffer 接收端的 ready 置低,goup0 相关信号保持直到请求被 Ibuffer 接收。但是 IFU 到 FTQ 的写回在 tio_toIbuffer_valid 有效的下一拍就拉高,因为此时请求已经无阻塞地进入 wb 阶段,这个阶段锁存的了 PredChecker 的检查结果,报告 group0 第 4(从 0 开始)个 2 字节位置对应的指令发生了错误预测,应该重定向到 vaddrA,之后经过 4 拍(冲刷和重新走预测器流水线),FTQ 重新发送给 IFU 以 vaddrA 为起始地址的预测块。 ## 测试点总表 -\[必填项\] *针对细分的测试点,列出表格* +测试点总表标题请用二号标题格式(两个#)。 + +**【必填项】** 对模块功能说明中细分的测试点进行综合整理,采用表格形式列出,便于用户快速查阅和理解。 **表格规范**: 1. 请用``标签包裹测试点总表,方便我们后续使用脚本提取测试点 @@ -148,16 +242,53 @@ draft: true **表格示例**: -以下是节选自IFU top文档的一个例子 +以下是节选自IFU top文档的一个例子: | 序号 | 功能名称 | 测试点名称 | 描述 | | ----- |-----------------|---------------------|------------------------------------| -| 1\.1 | [IFU_RCV_REQ](#1-接收ftq取指令请求f0流水级) | READY | IFU接收FTQ请求后,设置ready | -| 2\.1\.1| [IFU_F1_INFOS](#21-f1流水级计算信息和切分指针) | PC | IFU接收FTQ请求后,在F1流水级生成PC | +| 1\.1 | IFU_RCV_REQ | READY | IFU接收FTQ请求后,设置ready | +| 2\.1\.1| IFU_F1_INFOS | PC | IFU接收FTQ请求后,在F1流水级生成PC | | 2\.1\.2| IFU_F1_INFOS | CUT_PTR | IFU接收FTQ请求后,在F1流水级生成后续切取缓存行的指针 | -| 2\.2\.1 | [IFU_F2_INFOS](#22-f2流水级获取指令信息) | EXCP_VEC | IFU接收ICache内容后,会根据ICache的结果生成属于每个指令的异常向量 | +| 2\.2\.1 | IFU_F2_INFOS | EXCP_VEC | IFU接收ICache内容后,会根据ICache的结果生成属于每个指令的异常向量 | +## 附录 + +附录标题请用二号标题格式(两个#)。 + +**【可选项】** 此部分用于存放正文的补充内容,以便进行扩展和详细说明,旨在使文档格式更加清晰,排版更加合理。 + +以下是节选自IFU RVCExpander文档的一个例子: + +## RVC扩展辅助阅读材料 + +为方便参考模型的书写,在这里根据20240411版本的手册内容整理了部分指令扩展的思路。 + +对于RVC指令来说,op \= instr\(1, 0\);funct \= instr\(15, 13\) + +| op\\funct | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | +| ----- | --- | --- | --- | --- | --- | --- | ---| --- | +| 00 | addi4spn | fld | lw | ld | lbu
lhu;lh
sb;sh | fsd | sw | sd | +| 01 | addi | addiw | li | lui
addi16sp
zcmop | ARITHs
zcb | j | beqz | bnez | +| 10 | slli | fldsp | lwsp | ldsp | jr;mv
ebreak
jalr;add | fsdsp | fwsp | sdsp | + +在开始阅读各指令的扩展规则时,需要了解一些RVC扩展的前置知识,比如: + +rd', rs1'和rs2'寄存器:受限于16位指令的位宽限制,这几个寄存器只有3位来表示,他们对应到x8~x15寄存器。 + +### op \= b'00' + +#### funct \= b'000': ADDI4SPN + +

+ addi4spn +

+ +该指令将一个0扩展的非0立即数加到栈指针寄存器x2上,并将结果写入rd' + +其中,nzuimm\[5\:4\|9\:6\|2\|3\]的含义是: +··· + diff --git a/documents/content/zh-cn/docs/98_UT/01_frontend/01_ifu/01_predecode.md b/documents/content/zh-cn/docs/98_UT/01_frontend/01_ifu/01_predecode.md index e9fdd79..2dc53d4 100644 --- a/documents/content/zh-cn/docs/98_UT/01_frontend/01_ifu/01_predecode.md +++ b/documents/content/zh-cn/docs/98_UT/01_frontend/01_ifu/01_predecode.md @@ -150,8 +150,8 @@ CFI类型的判定则时序优化到了F3PreDecoder中。 最后,预译码还需要生成两种指令开始向量: | 序号 | 名称 | 描述 | |-----|------------|-------------------------| -| 2\.3\.1| 有效指令开始向量计算1 | 对预测块,假定第一条指令为一条有效指令的开始,对每条指令计算其是否为有效指令开始 | -| 2\.3\.2| 有效指令开始向量计算2 | 对预测块,假定第一条指令为一条有效指令的结束,对每条指令计算其是否为有效指令开始 | +| 3\.1| 有效指令开始向量计算1 | 对预测块,假定第一条指令为一条有效指令的开始,对每条指令计算其是否为有效指令开始 | +| 3\.2| 有效指令开始向量计算2 | 对预测块,假定第一条指令为一条有效指令的结束,对每条指令计算其是否为有效指令开始 | ## **测试点汇总** @@ -181,7 +181,7 @@ CFI类型的判定则时序优化到了F3PreDecoder中。 | 2\.4\.3\.2\.1 | ret、call判定 | RVC\.JALR为Ret | 传入RVC\.JALR指令,必定为call | | 2\.4\.3\.2\.2\.1 | ret、call判定 | RVC\.JR且rs为link | 传入RVC\.JR指令,rs为1或5,应判定为ret | | 2\.4\.3\.2\.2\.2 | ret、call判定 | RVC\.JR且rs不为link | 传入RVC\.JR指令,rs不为1或5,不应判定为ret | -| 2\.3\.1| 计算有效指令开始向量 | 有效指令开始向量计算1 | 对预测块,假定第一条指令为一条有效指令的开始,对每条指令计算其是否为有效指令开始 | -| 2\.3\.2| 计算有效指令开始向量 | 有效指令开始向量计算2 | 对预测块,假定第一条指令为一条有效指令的结束,对每条指令计算其是否为有效指令开始 | +| 3\.1| 计算有效指令开始向量 | 有效指令开始向量计算1 | 对预测块,假定第一条指令为一条有效指令的开始,对每条指令计算其是否为有效指令开始 | +| 3\.2| 计算有效指令开始向量 | 有效指令开始向量计算2 | 对预测块,假定第一条指令为一条有效指令的结束,对每条指令计算其是否为有效指令开始 | \ No newline at end of file diff --git a/documents/static/docs/98_ut/00_standard/port1.png b/documents/static/docs/98_ut/00_standard/port1.png new file mode 100644 index 0000000..89b7bc5 Binary files /dev/null and b/documents/static/docs/98_ut/00_standard/port1.png differ diff --git a/documents/static/docs/98_ut/00_standard/port2.png b/documents/static/docs/98_ut/00_standard/port2.png new file mode 100644 index 0000000..5933bf6 Binary files /dev/null and b/documents/static/docs/98_ut/00_standard/port2.png differ