RISC-V: 记忆体提前亮相

原本记忆体部分打算在实作 Load/Store 的前一篇写。
但为了阅读方便,调整顺序让接下来指令集的实作变成连续的章节。

P.S. 本来标题是 hart 之间的回忆,
但想想还是不要乱来好了,把文章写好就好 :D

记忆体空间简介

RISC-V 中,每个 hart (Hardware Thread) 都有一块 byte-addressable 的定址空间。
这块定址空间可能对应到三个类型的区域:

  • vacant:未指定,存取会造成 exception
  • main memory:可用的记忆体,明确定义存取後不能有额外的 side-effect
  • one or more I/O device:其他 memory mapped 的装置,可以有 side-effect

多个 hart 之间的定址空间可以完全共用、部分共用,
也可以互相独立不共用。

存取

规格书中区分了两种记忆体存取来源:

  • explict:由 load、store 这类指令触发的记忆体存取
  • implict:由指令以外的来源造成,例如 CPU instruction fetch 产生的记忆体存取

RISC-V 预设的一致性模型为 Weak Memory Ordering (RVWMO),
也可以自行实作规范更强的一致性模型(例如本次实作的为 Strong Ordering)。
RVWMO 明确指出不管是哪一种存取来源,
都要在必要时使用 Fence 或者 Cache Control 指令来确保一致性。
例如 JIT compiler 在 Code Generation 後要 Invalid Cache、
或者 CA 课堂上也常提到相关的范例。

另外,规格书明确写出可被 explict 存取而且可写的区域一定可读。

存取单位

规格书中定义一个 word 的单位是 32-bit,如下所示:

+--------------------------+
|          32-bit          |
+--------------------------+
|           word           |
+--------------------------+
|   halfword  |  halfword  |
+--------------------------+
| byte | byte |            |
+--------------------------+

实际程序

github 页面 Tag: ITDay8
考量到之後可能在 Address Space 加入其他装置,
设计的时候并不会直接把 memory 接在 CPU 上,而是另外用了一层 BUS 转接。

class BUS: public ADDRESS_SPACE_INTERFACE, public sc_module
{
public:
	BUS(sc_module_name name);

	virtual int32_t read(uint32_t addr, uint32_t size) override;
	virtual void write(uint32_t addr, uint32_t data, uint32_t size) override;
private:
	MEMORY memory;
	tlm_utils::simple_initiator_socket<BUS> memory_socket;
};

Register File 一样,这次加了 ADDRESS_SPACE_INTERFACE 当作 BUS 的介面。
也用 shared_ptr 来管理 Instance。

//cpu
class CPU : public sc_module
{
public:
...
	void set_address_space(const std::shared_ptr<ADDRESS_SPACE_INTERFACE> &instance);
...
	std::shared_ptr<ADDRESS_SPACE_INTERFACE> address_space;
};
//main
int sc_main(int argc,char** argv)
{
...
	cpu.set_address_space(std::make_shared<BUS>("bus"));
...
}


<<:  很像JavaScript 的 JSON

>>:  【後转前要多久】# Day07 CSS - 打架该听谁的?CSS权重、继承

DAY19: Stream pipe()做起来!!

今天要接着DAY:18浅谈Stream的概念,实作一些例子来解说。 在这篇的概念中有提到一个例子:文...

Day 01 - 行前说明 — 关於 UI 元件你所该知道的事

大家好,我是读哲学读到写 Web 的 Parker ,到现在约有两年左右的开发经验,遥想当初真的是...

DAY27 - line message API 计费魔鬼细节与使用心得

还记得之前提到的 line message API 吗? 可以建立机器人频道,并且透过 API 推送...

[DAY-21] 获得工作机会 谈条件 做出决定

我爱我的工作! 我爱我的工作! 我爱我的工作! 修完 虫虫 直接开夜车 来胡言乱语 不为过吧 !!...

Day 18 - 取得所有Contract程序范例

使用Shioaji API,第一次接触的人最常遇到的问题就是要如何抓所有的股票资料 在Day 03 ...