instruction

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 3, 2026 License: MIT Imports: 1 Imported by: 0

Documentation

Overview

Package instruction 提供 ChampSim 乱序 CPU 模型的指令定义

Package instruction 提供 ChampSim 指令模型的 Go 实现

这个包定义了乱序执行 CPU 模型中使用的指令数据结构和类型。 主要包括: - 分支类型定义 - 物理寄存器 ID - 特殊寄存器常量

Index

Constants

View Source
const (
	// RegStackPointer 栈指针寄存器 (RSP/ESP)
	RegStackPointer = 6

	// RegFlags 标志寄存器 (RFLAGS/EFLAGS)
	RegFlags = 25

	// RegInstructionPointer 指令指针寄存器 (RIP/EIP)
	RegInstructionPointer = 26
)

特殊寄存器常量 (用于分支类型识别)

这些常量对应 x86 架构的特殊寄存器编号。 ChampSim 通过检查指令是否读写这些寄存器来识别分支类型。

View Source
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
)

func (BranchType) IsBranch

func (bt BranchType) IsBranch() bool

IsBranch 返回该类型是否为分支指令

func (BranchType) String

func (bt BranchType) String() string

String 返回分支类型的字符串表示

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) HasMemOp

func (instr *OOOModelInstr) HasMemOp() bool

HasMemOp 返回该指令是否有内存操作

func (*OOOModelInstr) IsLoad

func (instr *OOOModelInstr) IsLoad() bool

IsLoad 返回该指令是否包含 load 操作

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

func (*OOOModelInstr) String

func (instr *OOOModelInstr) String() string

String 返回指令的字符串表示 (用于调试)

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 是否有效

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL