指令的部分终於完结了!
今天就来做 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 电脑呢
Hello大家, 台北阴雨绵绵, 早上到公司裤管都湿答答的="= 不舒服... 今天我们来...
Server side rendering 在一般的 Vue 专案里可能会有一个App.vue,里面...
前言 现在我们就差第四个栏位需要让他有开关的效果,由於这边是使用TableView实作的, 因此我打...
装饰器 (Decorator) 是一种设计模式,有些程序语言会直接将此设计模式实作出来,TypeSc...
建立订单 from shioaji.constant import * # 股票 order = ...