RISC-V: 在指令之前的 Register File

昨天已经把程序码稍微整理了一下,
分出两大部分:处理器和记忆体,
以及加上 Formatter 让 Coding Style 能够更一致。
但在开始实作指令集之前,还有更重要的事情。

暂存器简介

RISC-V 的整数暂存器共有 32 个,分别是 x0 - x31,
可以参考 RISC-V ISA 的 Table 25.1 表格。
浮点数的部分是 f0 - f31 ,只有在 F/D 这两个 Extension 用到,不在这次实作范围内。

其中比较特别的是 x0 是永远为 0 的,可以跟其他指令搭配使用。
例如在 RISC-V ISA Table 25.2 提到:

nop  # addi x0, x0, 0
jr rs  # jalr x0, 0(rs)

实际程序

github 页面 Tag: ITDay7
为了 Unit Test,先抽出一个抽象介面 REGISTER_INTERFACE
并在 CPU class 加入一个 set_register_file ,方便 Unit Test 抽换 Mock Instance。

考量到未来加 Unit Test 的时候,要每个用到 Register File 的指令都改过一轮,
在这个时间点就做好准备是必要的。

//registerInterface.h
class REGISTER_INTERFACE
{
public:
	virtual void set_value_integer(unsigned int register_index, int32_t value) = 0;
	virtual int32_t get_value_integer(unsigned int register_index) = 0;
	
	virtual void set_pc(uint32_t value) = 0;
	virtual uint32_t get_pc() = 0;
};

//cpu.h
class CPU : public sc_module
{
...
	void set_register_file(const std::shared_ptr<REGISTER_INTERFACE> &instance);
...
}

另外在其他实作中,常常看到写了 Destructor 只为了 delete Instance,
为了减少猴子手滑漏写的机率,
在设计的时候会使用 shared_ptr 让系统自行释放记忆体。

//cpu.h
class CPU : public sc_module
{
...
	std::shared_ptr<REGISTER_INTERFACE> register_file;
};
//main.cpp
int sc_main(int argc,char** argv)
{
...
	cpu.set_register_file(std::make_shared<REGISTER>());
...
}

<<:  [DAY6]制作容器(五)

>>:  JS 06 - 建构函式

第13章:分析、储存与存取系统日志介绍(二)

前言 继上次介绍了系统日志与相关的介绍後,接下来介绍该如何使用journalctl将日志档案永久的储...

[Day21] 网格交易机器人行前准备

首先先更新登入的部分,之後会需要登入凭证,这边的一些变数可以再利用 然後是网格交易策略那边,一些参数...

[Day4] Tools And Environment

今天来介绍一下渗透测试常用的环境与工具,正所谓工欲善其事,必先利其器。准备好自己熟悉、习惯的作业系统...

TOGAF 的个 六个组件

[开放组] Open Group (http://www.opengroup.org/)架构框架 (...

资料分析商业应用与策略管理 #笔记四

举个平时所接触到的巨量资料例子:金融领域应用,股市、汇市、债市... 有人向银行申请信用卡不过,就是...