RISC-V: I-type 移位指令

今天又发现新鲜的 Bug 拉!
我养虫,虫养我,
今天的我拯救昨天的我。

幸好 Code Base 还小,
不然每天猴肉测试实在不是办法,
小猴子都快 Debug De 成老猴子了,
好想抽时间补 Unit Test 阿...

I-type

指令格式如下:

|31     20|19   15|14    12|11   7|6       0|
+-------------------------------------------+
|   imm   |  rs1  | funct3 |  rd  | opcode  |
+-------------------------------------------+

SLLI

rd = rs1 << shamt

|31   25|24   20|19   15|14    12|11   7|6       0|
+-------------------------------------------------+
|   0   | shamt |  rs1  |  001   |  rd  | 0010011 |
+-------------------------------------------------+

SRLI

rd = (uint32_t) rs1 >> shamt

|31   25|24   20|19   15|14    12|11   7|6       0|
+-------------------------------------------------+
|   0   | shamt |  rs1  |  101   |  rd  | 0010011 |
+-------------------------------------------------+

SRAI

比较特别的是 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,
另外一部分用来区别 SRLISRAI

//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 给值,
配合 SLLISRLISRAI 几道指令区别不同运算结果,
最後的数值以 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

<<:  Day-12 函式与变数

>>:  Day12# interface

[ 卡卡 DAY 5 ] - Style in React Native - inline style vs StyleSheet

在 React Native 提供两种方式引入样式 写 inline style 运用官方提供的 ...

[Angular] Day1. 认识 Angular

在2020年9月,我正式的从韧体工程师转职成为一位前端工程师,在自学前端的时候我是选择了 React...

D3JsDay19 地图加入了事件,地点资料就呈现—为地图加入互动事件

制作样板 昨天已经绘制出每个淡绿色的点来显示资料中的经纬度在svg地图上面,今天要做的事情是当滑鼠移...

Day 30 - Module

Module 为模组,当网页的程序码越来越多,越来越庞大的时候,会需要把 code 拆分为很多个部分...

D7 - 彭彭的课程#Python 有序列表的基本运算 - List、Tuple

收假症候群大发作XDD 但今天还是有振奋人心的事情可以做啊 你各位有没有去绑定五倍卷了 希望这个艰辛...