这次只有针对 RV31I 指令做解码,
原本希望能让这次加入的 INSTRUCTION_DECODER_INTERFACE
更有扩充性,
可以更方便的支援其他指令集,
参考过 RISC-V-TLM,觉得把解码逻辑都堆在 CPU 不是很好,
但是暂时没想到更好的做法,只能先放到 Decoder 中。
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不是黄金证照,它只是资安专业人员的入门砖。建立这个基本的专业要求...
终於迎来铁人赛的最後一天!!好兴奋呀!! 最後一天要让游戏离开游戏引擎,成为能自己运作的应用程序! ...
做专案最怕就是一连串因应单位政策的改变而变更需求, 原本可以运作达成需求的系统,眼看就要结案, 却需...
回想一下至今认识过的状态机范例里,我们目前所见的,都是针对一个物体、物件的小小部分出发,比如 RPG...
前言 在现实生活中,常见的尺寸单位有公分(cm)、公尺(m)、奈米(nm), 而在网页画面中自己的尺...