原本记忆体部分打算在实作 Load/Store 的前一篇写。
但为了阅读方便,调整顺序让接下来指令集的实作变成连续的章节。
P.S. 本来标题是 hart 之间的回忆,
但想想还是不要乱来好了,把文章写好就好 :D
RISC-V 中,每个 hart (Hardware Thread) 都有一块 byte-addressable 的定址空间。
这块定址空间可能对应到三个类型的区域:
多个 hart 之间的定址空间可以完全共用、部分共用,
也可以互相独立不共用。
规格书中区分了两种记忆体存取来源:
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"));
...
}
>>: 【後转前要多久】# Day07 CSS - 打架该听谁的?CSS权重、继承
今天要接着DAY:18浅谈Stream的概念,实作一些例子来解说。 在这篇的概念中有提到一个例子:文...
大家好,我是读哲学读到写 Web 的 Parker ,到现在约有两年左右的开发经验,遥想当初真的是...
还记得之前提到的 line message API 吗? 可以建立机器人频道,并且透过 API 推送...
我爱我的工作! 我爱我的工作! 我爱我的工作! 修完 虫虫 直接开夜车 来胡言乱语 不为过吧 !!...
使用Shioaji API,第一次接触的人最常遇到的问题就是要如何抓所有的股票资料 在Day 03 ...