Logger: Code Stream Logger

指令的部分终於完结了!
今天就来做 Logger 吧,
目标是要有一致性和一定程度的可读性,
让之後的 Code Stream 分析比较轻松。

RISC-V I 指令集在 Instruction List 总共列出 40 道指令,
加上还没决定怎麽区分的 (SHIMM、FENCE) 目前列出有 41 个类别,
为了让之後的分析比较好做,
目前会放在指令执行时加入 runtime 资讯。

先支援 Memory Access 和 Branch Prediction,
Out of Order 需要更多的资讯 (例如 Multi-path Fetching 需要未执行到的指令),
目前只能支援 Branch Prediction 神预测永远猜对的情况。

实际程序

github 页面 Tag: ITDay26

Decoder 本身不知道硬体运作的情况,
这边会带入指令执行的时候才知道的 Runtime 资讯:

//instructionDecoder.cpp
void INSTRUCTION_DECODER::log_instruction(uint32_t current_pc, uint32_t target_pc, uint32_t rs1Value, uint32_t rs2Value, uint32_t rdValue,int32_t immValue)
{

	auto instructionName = instruction_name_map[get_instruction()];
	auto rd = get_rd();
	auto rs1 = get_rs1();
	auto rs2 = get_rs2();

	std::cout << "current_pc: 0x" << std::hex << current_pc
	          << " target_pc: 0x" << std::hex << target_pc
		  << " " << instructionName
		  << " " << std::dec  << rs1
		  << " " << std::dec  << rs2
		  << " " << std::dec  << rd
	          << " rs1Value: 0x" << std::hex << rs1Value
	          << " rs2Value: 0x" << std::hex << rs2Value
	          << " rdValue: 0x" << std::hex << rdValue
	          << " immValue: 0x" << std::hex << immValue
		  << std::endl;
}

也因为这样,必须放在每一个指令执行的地方,
一开始有考量要做成每个指令独立一个 class,
可以在 Cpu 很简单的呼叫 execute 和 log 就好,
但因为会有很多 object create/destroy 拖慢模拟速度,
指令分类也会带入过多不必要的复杂度。

反正不管怎麽做猴子都会遇上麻烦,
就先依照 "You aren't gonna need it!" (YAGNI) 原则,
采用简单粗暴的 Switch Statement,
现在就需要为这个决策付出代价了!

//executor.cpp
...
void EXECUTOR::ANDI_E()
{
	auto rs1 = instruction_decoder->get_rs1();
	auto rd = instruction_decoder->get_rd();
	auto imm = instruction_decoder->get_imm(31, 20);

	auto value = register_file->get_value_integer(rs1) & imm;
	register_file->set_value_integer(rd, value);

	instruction_decoder->log_instruction(
	    register_file->get_pc(),
	    new_pc,
	    register_file->get_value_integer(rs1),
	    0,
	    register_file->get_value_integer(rd),
	    imm);
}
...

Executor 的部分让猴子逃避一下赶工中,晚点补上,
大家双十节快乐!

昨晚写到一半突然发现自己看着一个指令实作发呆 5 分钟,
决定不补 Code 先补眠。

睡眠不足真的很难做这种单调又要集中精神的事情,
实验证实咖啡对猴子大概没什麽用,
猴子只能睡觉。


<<:  day25_如何采购 ARM 版本的 Windows 电脑呢

>>:  25. 懒、没耐心、傲慢是工程师最好的美德

Day28 深入解析Elasticsearch Query DSL Match query Part1

Hello大家, 台北阴雨绵绵, 早上到公司裤管都湿答答的="= 不舒服... 今天我们来...

Day 23. Server Side Rendering

Server side rendering 在一般的 Vue 专案里可能会有一个App.vue,里面...

Swift纯Code之旅 Day13. 「TableView(4) - 使用两个TableViewCell」

前言 现在我们就差第四个栏位需要让他有开关的效果,由於这边是使用TableView实作的, 因此我打...

[NestJS 带你飞!] DAY14 - Custom Decorator

装饰器 (Decorator) 是一种设计模式,有些程序语言会直接将此设计模式实作出来,TypeSc...

基本操作 - 下单

建立订单 from shioaji.constant import * # 股票 order = ...