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资源

欢迎加入[追求高效能的CISSP]脸书中文群组!

追求高效能的CISSP! CISSP不是黄金证照,它只是资安专业人员的入门砖。建立这个基本的专业要求...

30.unity输出

终於迎来铁人赛的最後一天!!好兴奋呀!! 最後一天要让游戏离开游戏引擎,成为能自己运作的应用程序! ...

Day10. 如何收拾需求变更的Boss,Blue Prism的降临 -BP改变流程Excel另存新档

做专案最怕就是一连串因应单位政策的改变而变更需求, 原本可以运作达成需求的系统,眼看就要结案, 却需...

Day12 - 状态机与现实世界的落差 - 2: State Explosion(状态大爆炸)

回想一下至今认识过的状态机范例里,我们目前所见的,都是针对一个物体、物件的小小部分出发,比如 RPG...

尺寸单位 px、em、rem

前言 在现实生活中,常见的尺寸单位有公分(cm)、公尺(m)、奈米(nm), 而在网页画面中自己的尺...