查看: 1242|回复: 0
收起左侧

RISC-V处理器:1.取指令 RTL 代码分析

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2020-8-24 11:35:16 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 皋陶 于 2020-8-27 13:58 编辑

    RISC-V处理器:
    1.取指令 RTL 代码分析1. 取指特点
    • 指令在存储空间中所处的地址,称为它的指令PC(Program Counter)
    • 取指是指处理器将指令,按照其指令PC,从存储器中读取出来的过程
    • 处理器从存储器中取出指令的目标是:快速和连续不断
    • 指令分为普通指令,非分支跳转指令和分支跳转指令
    • 对于非分支跳转指令,即便是对于地址不对齐的32位指令,也要求能够连续不断的从一个周期内读取出来
    • 对于分支跳转指令,要能够迅速判断是否需要跳转。若果需要跳转,则从新的指令PC地址处快速取出指令。


    2. 快速取指

    首先应该保证存储器的读延迟越小越好:


    • 片外DDR或者Flash存储器可能需要几十个周期的延时
    • 片上的SRAM也可能需要几个周期的延时


    我们采取 ITCM 和 I-Cache 的方法:

    • ITCM(Instruction Tightly Coupled Memory)
      指令紧耦合存储器,指配置一小段容量很小(即使KB)的存储器(通常为SRAM),用于存储指令,且在物理上,举例处理器核很近,并且专属于处理器核,因此能够取得很小的访问延迟。这种方式只能用来存放容量大小有限的关键程序指令;
    • I-Cache(Instruction Cache)
      指令缓存,利用软件程序的时间局部性和空间局部性,将容积量巨大的外部指令存储器空间,动态映射到容量有限的指令缓存中,将访问指令存储器的平均延迟降低到最小。但是因为缓存的容量有限,因此访问缓存存在着相当大的不确定性。



    TIPS:

    大多数的低功耗处理器应用场景都应用实时性较高的场景,因此更加倾向于使用延迟确定的 ITCM 。


    3. 处理非对齐指令

    非对齐指令:32位指令PC数值无法被4整除


    因为作为存储器的 ITCM 或者 I-Cache 往往使用SRAM,而SRAM读端口的宽度是固定的。对于32位SRAM,一个时钟只能读出1个32位的数据,如果一个32位的长指令地址不对齐,则需要两个时钟周期才能取出,之后各取一部分,拼接为真正需要的32位指令。


    我们要做的,就是令处理器在一个周期内取出这条指令。以普通指令非对齐和分支跳转指令讨论:


    1.普通指令的非对齐


    这种指令可以按顺序取指,地址连续增长,利用剩余缓存(Leftover Buffer)保存上次取指令没有用完的比特位,供下次使用。


    2. 分支跳转指令的非对齐

    如果跳转的目标地址和32位地址边界不对齐,并且需要取出一个32位的指令字,剩余缓存不能使用,因为剩余缓存只能在按顺序取指的情况下,才能够提前预存上次没有用完的指令字。


    常见的解决方式是,采用多体化(Bank)的SRAM进行指令存储。其中,奇偶交错的方式最为常见。使用32位宽的SRAM交错进行存储。


    这样地址不对齐的32位地址,在一个周期内,可以同时访问两块SRAM,取出两个连续的32位指令字。各取一部分拼成真正需要的32位指令字。



    4. 处理分支指令

    RISC-V架构处理器的分支指令类型:


    • 无条件跳转/分支指令:
      无条件直接跳转指令:jal(jump and link):


    1. jal x5,offset // 此为汇编示例,jal使用编码在指令字中的20位立即数(有
    2.                              // 符号)作为offset偏移量。offset x 2,之后与当前指令所在地址
    3.                              // 相加
    复制代码

    无条件间接跳转指令: jalr(jump and link-register) :


    1. jalr x1,x6,offset // 将指令字中的12位立即数作为偏移量(offset),
    2.                    //与另一个寄存器索引的操作数相加,得到最终的跳转目标地址
    复制代码

    • 带条件跳转/分支:
      带条件直接跳转指令
      带条件间接跳转指令



    对于分支指令,处理器采用分支预测方式:


    是否需要跳转,简称为预测方向。这是对带条件跳转语句来说的。


    如果跳转,目标地址是什么?简称为预测地址。


    5. 简单的带条件直接跳转指令

    beq:两个整数操作数相同则跳转


    bne:两个整数不相等则跳转


    blt:第一个有符号数小于第二个有符号数,则跳转


    blut:第一个无符号数小于第二个无符号数,则跳转


    bge:第一个有符号数大于第二个有符号数,则跳转


    bgru:第一个无符号数大于第二个无符号数,则跳转


    本篇完,感谢关注:RISC-V单片机中文网





    上一篇:E203 蜂鸟 RISC-V处理器代码阅读笔记 之 CPU csr寄存器组 e203_ex
    下一篇:RISC-V 六种基本指令格式
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-19 07:28 , Processed in 2.393020 second(s), 45 queries .

    快速回复 返回顶部 返回列表