今天又发现新鲜的 Bug 拉!
我养虫,虫养我,
今天的我拯救昨天的我。
幸好 Code Base 还小,
不然每天猴肉测试实在不是办法,
小猴子都快 Debug De 成老猴子了,
好想抽时间补 Unit Test 阿...
指令格式如下:
|31 20|19 15|14 12|11 7|6 0|
+-------------------------------------------+
| imm | rs1 | funct3 | rd | opcode |
+-------------------------------------------+
rd = rs1 << shamt
|31 25|24 20|19 15|14 12|11 7|6 0|
+-------------------------------------------------+
| 0 | shamt | rs1 | 001 | rd | 0010011 |
+-------------------------------------------------+
rd = (uint32_t) rs1 >> shamt
|31 25|24 20|19 15|14 12|11 7|6 0|
+-------------------------------------------------+
| 0 | shamt | rs1 | 101 | rd | 0010011 |
+-------------------------------------------------+
比较特别的是 opcode 和 funct3 都和 SRLI
一样,
需要用 imm 的某个 bit 来判断是哪一种。
rd = rs1 >> shamt
|31 25|24 20|19 15|14 12|11 7|6 0|
+-------------------------------------------------+
| 32 | shamt | rs1 | 101 | rd | 0010011 |
+-------------------------------------------------+
github 页面 Tag: ITDay13
这次的问题是因为漏算了已经先左移的部分,
在跑 Test Binary Code 的 SLLI
会变成 shamt 每次都拿到 8,
修改结果如下:
int32_t INSTRUCTION_DECODER::get_imm(uint32_t end, uint32_t start)
{
return sc_dt::sc_int<32>(instruction_value) << (31-end) >> (31 - end + start);
}
三道指令内容都很单纯是位移,比较特别的是 imm 有一部份用来当 shamnt,
另外一部分用来区别 SRLI
和 SRAI
。
//executor.cpp
...
case INSTRUCTION_DECODER_INTERFACE::SLLI_FN3:
SLLI_E();
break;
case INSTRUCTION_DECODER_INTERFACE::SRLI_FN3://same as INSTRUCTION_DECODER_INTERFACE::SRAI_FN3
if(instruction_decoder->get_imm(30, 30) == 0)
{
SRLI_E();
}
else
{
SRAI_E();
}
break;
...
void EXECUTOR::SLLI_E()
{
auto rs1 = instruction_decoder->get_rs1();
auto rd = instruction_decoder->get_rd();
auto value = register_file->get_value_integer(rs1) << (uint32_t) instruction_decoder->get_imm(24, 20);
register_file->set_value_integer(rd, value);
//TODO: just for test, move these to decoder and logger in future
...
}
void EXECUTOR::SRLI_E()
{
auto rs1 = instruction_decoder->get_rs1();
auto rd = instruction_decoder->get_rd();
auto value = (uint32_t) register_file->get_value_integer(rs1) >> (uint32_t) instruction_decoder->get_imm(24, 20);
register_file->set_value_integer(rd, value);
...
}
void EXECUTOR::SRAI_E()
{
auto rs1 = instruction_decoder->get_rs1();
auto rd = instruction_decoder->get_rd();
auto value = register_file->get_value_integer(rs1) >> (uint32_t) instruction_decoder->get_imm(24, 20);
register_file->set_value_integer(rd, value);
...
}
//instructionDecoderInterface.h
...
SLLI_FN3 = 0b001,
SRLI_FN3 = 0b101,
SRAI_FN3 = 0b101,
...
前面的不重要就省略,从 SLTIU
给值,
配合 SLLI
、SRLI
、SRAI
几道指令区别不同运算结果,
最後的数值以 Signed Integer 表示。
$ make run
./simulator
SystemC 2.3.3-Accellera --- Sep 17 2021 22:09:07
Copyright (c) 1996-2018 by all Contributors,
ALL RIGHTS RESERVED
...
SLTIU
rs1: 2
rd: 2
value: 1
SLLI
rs1: 2
rd: 3
value: -2147483648
SRLI
rs1: 3
rd: 4
value: 1073741824
SRAI
rs1: 3
rd: 5
value: -1073741824
在 React Native 提供两种方式引入样式 写 inline style 运用官方提供的 ...
在2020年9月,我正式的从韧体工程师转职成为一位前端工程师,在自学前端的时候我是选择了 React...
制作样板 昨天已经绘制出每个淡绿色的点来显示资料中的经纬度在svg地图上面,今天要做的事情是当滑鼠移...
Module 为模组,当网页的程序码越来越多,越来越庞大的时候,会需要把 code 拆分为很多个部分...
收假症候群大发作XDD 但今天还是有振奋人心的事情可以做啊 你各位有没有去绑定五倍卷了 希望这个艰辛...