RISC-V: 指令解码器

这次只有针对 RV31I 指令做解码,
原本希望能让这次加入的 INSTRUCTION_DECODER_INTERFACE 更有扩充性,
可以更方便的支援其他指令集,
参考过 RISC-V-TLM,觉得把解码逻辑都堆在 CPU 不是很好,
但是暂时没想到更好的做法,只能先放到 Decoder 中。

RV32I Base Instruction

RV32I 指令集的指令分成 R、I、S、U、B、J 几种格式,
并且让 rs1, rs2, rd 的位置尽量保持一致,
以减少解码的复杂度。
另外为了硬体设计考量,Immediate 值的永远都是 Sign Extended,
而且最高位都放在最高位 (MSB),
这样就可以在 Instruction Decode 也同时做 Sign Extension。

另外也在规格书 2.2 节讨论到 Alignment 的问题,
特别值得一提的是 JUMP、BRANCH 指令跳到未对齐(Misalignment)的位置执行,
会在原指令发生 Exception,但是如果没跳就什麽都不会发生。

实际程序

github 页面 Tag: ITDay9

INSTRUCTION_DECODER_INTERFACE 留下了针对 RV32I 指令集的解码方式,
不够抽象化,但太钻牛角尖会拖慢开发进度,
目前以完成 RV32I 指令集为最优先考量,
并且让介面保留能加入少量扩充指令集又不会难以维护的弹性,
之後支援更多指令集时需要重新设计。

class INSTRUCTION_DECODER_INTERFACE
{
public:
	enum ExtensionType {
		BASE_RV32I,
		UNSUPPORTED,
	};

	void set_instruction(uint32_t value)
...

	INSTRUCTION_DECODER_INTERFACE::ExtensionType extension()
...

	virtual uint32_t get_opcode() = 0;
	virtual uint32_t get_func3() = 0;
	virtual uint32_t get_func7() = 0;

	virtual uint32_t get_rs1() = 0;
	virtual uint32_t get_rs2() = 0;
	virtual uint32_t get_rd() = 0;

	virtual uint32_t get_imm(uint32_t start, uint32_t end) = 0;

protected:
	sc_dt::sc_uint<32> instruction_value;
};

shared_ptr 和做 interface 的理由和之前一样,不再赘述。


<<:  [Day 08] - Spring Boot 实作登入验证(二)(JWT浅析)

>>:  Day 08-在Azure建立Azure Bot资源

Day16|什麽是 HEAD ?

在先前的章节里,我们可以常看见 HEAD 这个名词,它指的是什麽呢? // git 恢复文件到初始状...

电子书阅读器上的浏览器 [Day14] 中文直排阅读模式

这功能对於浏览器来说,应该是个没人(或很少人)想过会存在的功能。 从十几二十年前开始有浏览器以来,浏...

D11-用 Swift 和公开资讯,打造投资理财的 Apps { 台股申购实作.4 - 用 Calendar 物件处理台湾的民国年}

股票申购是和时间有关的 feature,所以需要有一个 DateUtility,这个类别负责所有 D...

OpenSSL

OpenSSL 是一个开源命令行工具,通常用於生成私钥、创建 CSR、安装 SSL/TLS 证书以及...

认识CSS(三):CSS选择器

选择器(Selector)是指用来选择HTML中,哪些内容要套上的样式。 依据对象的不同有不同的写法...