Documentation
¶
Overview ¶
Package instruction 提供 ChampSim 乱序 CPU 模型的指令定义
Package instruction 提供 ChampSim 指令模型的 Go 实现 ¶
这个包定义了乱序执行 CPU 模型中使用的指令数据结构和类型。 主要包括: - 分支类型定义 - 物理寄存器 ID - 特殊寄存器常量
Index ¶
Constants ¶
const ( // RegStackPointer 栈指针寄存器 (RSP/ESP) RegStackPointer = 6 // RegFlags 标志寄存器 (RFLAGS/EFLAGS) RegFlags = 25 // RegInstructionPointer 指令指针寄存器 (RIP/EIP) RegInstructionPointer = 26 )
特殊寄存器常量 (用于分支类型识别)
这些常量对应 x86 架构的特殊寄存器编号。 ChampSim 通过检查指令是否读写这些寄存器来识别分支类型。
const ( // NumInstrDestinations 标准 trace 格式的目标寄存器/内存数量 NumInstrDestinations = 2 // NumInstrDestinationsSparc SPARC/CloudSuite 格式的目标数量 NumInstrDestinationsSparc = 4 // NumInstrSources 源寄存器/内存数量 NumInstrSources = 4 )
Trace 指令格式常量
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type BranchType ¶
type BranchType int
BranchType 定义分支指令的类型
ChampSim 通过分析指令的寄存器读写模式来识别分支类型。 这些类型对应 x86 架构的典型分支模式。
const ( // BranchDirectJump 直接跳转 (JMP target) // 特征: 写 IP,不读 SP、Flags,不读其他寄存器 BranchDirectJump BranchType = iota // BranchIndirect 间接跳转 (JMP *reg) // 特征: 写 IP,读其他寄存器,不读 SP、IP、Flags BranchIndirect // BranchConditional 条件分支 (JZ, JNE 等) // 特征: 读 IP,写 IP,读 Flags 或其他寄存器 BranchConditional // BranchDirectCall 直接调用 (CALL target) // 特征: 读写 SP,读写 IP,不读 Flags 和其他寄存器 BranchDirectCall // BranchIndirectCall 间接调用 (CALL *reg) // 特征: 读写 SP,读写 IP,读其他寄存器 BranchIndirectCall // BranchReturn 函数返回 (RET) // 特征: 读 SP,写 SP 和 IP,不读 IP BranchReturn // BranchOther 其他分支类型 // 不符合以上分类的写 IP 指令 BranchOther // NotBranch 非分支指令 NotBranch )
type OOOModelInstr ¶
type OOOModelInstr struct {
// InstrID 全局唯一的指令 ID (程序顺序)
// 用于跟踪指令的程序顺序,即使在乱序执行中也能保持
InstrID uint64
// IP 指令地址 (Program Counter)
IP uint64
// CPUID 执行该指令的 CPU 核心 ID
CPUID uint8
// ASID 地址空间标识符 [虚拟ASID, 物理ASID]
// 用于多地址空间和虚拟化支持
ASID [2]uint8
// ReadyTime 指令准备好执行的时间 (周期数)
// 当所有依赖解除后设置
ReadyTime uint64
// IsBranch 该指令是否为分支
IsBranch bool
// BranchTaken 分支是否跳转 (从 trace 读取或实际执行结果)
BranchTaken bool
// BranchPrediction 分支预测结果
BranchPrediction bool
// BranchMispredicted 分支是否预测错误
// 即使方向预测正确,如果目标地址错误也算预测错误
BranchMispredicted bool
// BranchType 分支指令的类型
BranchType BranchType
// BranchTarget 分支目标地址
// 对于直接分支,这是固定的;对于间接分支,运行时确定
BranchTarget uint64
// DIBChecked 是否已检查 DIB (Decoded Instruction Buffer)
DIBChecked bool
// FetchIssued 是否已发出取指请求
FetchIssued bool
// FetchCompleted 取指是否完成
FetchCompleted bool
// Decoded 是否已译码
Decoded bool
// Scheduled 是否已调度到执行单元
Scheduled bool
// Executed 是否已执行完成
Executed bool
// Completed 所有操作(包括内存)是否完成
Completed bool
// DestRegisters 目标物理寄存器 ID 列表
// 由寄存器重命名 (Register Renaming) 分配
DestRegisters []PhysicalRegisterID
// SrcRegisters 源物理寄存器 ID 列表
SrcRegisters []PhysicalRegisterID
// DestMemory 写内存地址列表 (store 操作)
DestMemory []uint64
// SrcMemory 读内存地址列表 (load 操作)
SrcMemory []uint64
// CompletedMemOps 已完成的内存操作数量
// 当等于总内存操作数时,指令可以标记为 Completed
CompletedMemOps int
// NumRegDependent 有多少指令依赖于我的寄存器结果
NumRegDependent int
// RegistersInstrsDependOnMe 寄存器依赖于我的指令列表
// 当我的寄存器结果就绪时,需要唤醒这些指令
RegistersInstrsDependOnMe []*OOOModelInstr
}
OOOModelInstr 表示乱序执行 CPU 模型中的一条指令
这个结构对应 ChampSim 的 ooo_model_instr,包含了指令在流水线中 执行所需的所有信息:基本属性、分支信息、流水线状态、操作数和依赖关系。
流水线阶段标记:
DIBChecked -> FetchIssued -> FetchCompleted -> Decoded -> Scheduled -> Executed -> Completed -> (退休时从 ROB 移除)
func NewOOOModelInstrFromCloudSuite ¶
func NewOOOModelInstrFromCloudSuite( ip uint64, isBranch uint8, branchTaken uint8, destRegs []uint8, srcRegs []uint8, destMem []uint64, srcMem []uint64, asid [2]uint8, ) *OOOModelInstr
NewOOOModelInstrFromCloudSuite 从 CloudSuite trace 格式创建 OOOModelInstr
func NewOOOModelInstrFromInput ¶
func NewOOOModelInstrFromInput( cpuID uint8, ip uint64, isBranch uint8, branchTaken uint8, destRegs []uint8, srcRegs []uint8, destMem []uint64, srcMem []uint64, ) *OOOModelInstr
NewOOOModelInstrFromInput 从标准 trace 格式创建 OOOModelInstr
这个构造函数会: 1. 复制基本字段 2. 过滤掉值为 0 的寄存器和内存地址 3. 通过寄存器读写模式识别分支类型
参数:
- cpuID: CPU 核心 ID
- ip: 指令地址
- isBranch: 是否为分支 (来自 trace,可能不准确)
- branchTaken: 分支是否跳转
- destRegs: 目标寄存器数组
- srcRegs: 源寄存器数组
- destMem: 目标内存地址数组
- srcMem: 源内存地址数组
func (*OOOModelInstr) IsStore ¶
func (instr *OOOModelInstr) IsStore() bool
IsStore 返回该指令是否包含 store 操作
func (*OOOModelInstr) NumMemOps ¶
func (instr *OOOModelInstr) NumMemOps() int
NumMemOps 返回该指令的内存操作总数 (load + store)
func (*OOOModelInstr) ProgramOrder ¶
func (instr *OOOModelInstr) ProgramOrder(other *OOOModelInstr) bool
ProgramOrder 比较两条指令的程序顺序 返回 true 如果 instr 在程序顺序上早于 other
type PhysicalRegisterID ¶
type PhysicalRegisterID int16
PhysicalRegisterID 物理寄存器标识符
使用 int16 允许用 -1 表示无效寄存器。 物理寄存器由寄存器分配器 (Register Allocator) 管理。
const ( // InvalidRegister 无效寄存器 ID InvalidRegister PhysicalRegisterID = -1 )
func (PhysicalRegisterID) IsValid ¶
func (id PhysicalRegisterID) IsValid() bool
IsValid 返回寄存器 ID 是否有效