pmp(Physical Memory Protection CSRs)的介绍可以看:
《The RISC-V Instruction Set Manual Volume II: Privileged Architecture》

重点内容在这里提一下:

  1. 32位CPU最多具有8个可配置的pmp,配置寄存器分别为pmp0cfg,pmp1cfg,pmp2cfg,pmp3cfg,pmp4cfg,pmp5cfg,pmp6cfg和pmp7cfg,它们都是8-bit的,而pmpcfg0管理着mp0cfg-mp3cfg,pmpcfg1管理着pmp4cfg-pmp7cfg,pmpcfg0和pmpcfg1是32-bit的。若CPU为64位,则最多可以具有16个可配置的pmp,pmp0cfg-pmp15cfg,同时多了pmpcfg2和pmpcfg3。
  2. 32位的CPU,pmp的匹配地址为32-bit,是正常地址右移两位得出,64位的CPU为64-bit,也是正常地址右移两位得出。因为我没有配置虚拟内存,所以这里的正常地址就是实际的物理地址。
  3. pmp?cfg为8-bit CSR寄存器,包含L,A,X,W,R位。L表示锁定位,A为2-bit的区域位,X为可执行权限,W为可写权限,R为可读权限。
  4. 区域配置中包括4种形式,2b’00表示不使用,2’b01表示向上的全部范围,2’b10表示对齐的4字节范围,2’b11表示对齐的2^N字节范围,且要≥8字节。
  5. L表示锁定位尤为重要。
    当L置1后,只有系统复位才能清除。
    当L置1后,对应的pmp?cfg和pmpaddr?都不能再配置,写入值被忽略。
    当pmp?cfg.A配置为TOR时,这里的pmp?cfg,pmpaddr?和pmp?cfg和pmpaddr?-1都不能配置了。(if pmpicfg.A is set to TOR, writes to pmpaddri-1 are ignored.)
    当L置1后,全部模式(M,S和U)都必须执行pmp?cfg的配置。
    当L为0时,只有(S和U)执行pmp?cfg的配置,M模式不执行,且能自由修改配置。
    注意:?表示pmp的编号,例如0-7。
  6. pmp具有优先级,编号越低优先级越高,pmp0>pmp1>pmp2,当pmp0和pmp1设置的地址具有重叠部分,那么pmp0起效,pmp1不起效。

测试代码如下。

#include "encoding.h"#define U32 *(volatile unsigned int *)
#define DEBUG_SIG   0x70000000
#define DEBUG_VAL   0x70000004//--------------------------------------------------------------------------
// handle_trap functionvoid handle_trap()
{asm volatile ("nop");U32(0x60003000) = 0x2021314;U32(DEBUG_SIG) = 0xFF;while(1);
}//--------------------------------------------------------------------------
// pmp configuration functionvoid pmp_config()
{unsigned int i;U32(0x60000000) = read_csr(pmpcfg0);U32(0x60000004) = read_csr(pmpcfg1);U32(0x60000010) = read_csr(pmpaddr0);U32(0x60000014) = read_csr(pmpaddr1);U32(0x60000018) = read_csr(pmpaddr2);U32(0x6000001c) = read_csr(pmpaddr3);U32(0x60000020) = read_csr(pmpaddr4);U32(0x60000024) = read_csr(pmpaddr5);U32(0x60000028) = read_csr(pmpaddr6);U32(0x6000002c) = read_csr(pmpaddr7);//addr0 -> 0x6000_0000write_csr(pmpaddr0,0x60000000>>2);//addr1 -> 0x6000_1000write_csr(pmpaddr1,0x60001000>>2);//pmp1cfg: L=1 A=1(TOR) X-0 W-0 R-0write_csr(pmpcfg0 ,0x00008800);for ( i = 0; i < 100; i++ )U32(0x80001000+4*i) = i + 1;for ( i = 0; i < 100; i++ )U32(0x60001000+4*i) = i + 1;U32(0x60000000) = 0x10086;
}//--------------------------------------------------------------------------
// Mainvoid main()
{pmp_config();while(1) {asm volatile ("wfi");}
}

代码功能:

  1. 读取pmp相关的CSR寄存器,并输出值0x6000_0000(mmio)的总线上。
  2. 配置pmp区域1,地址为0x6000_0000-0x6000_0FFF,不可读,不可写,不可执行。
  3. 往0x8000_1000-0x8000_118C区域写入数据,证明memory区域没有问题。
  4. 往0x6000_1000-0x6000_118C区域写入数据,证明配置区域外没有问题。
  5. 往0x6000_0000地址写0x10086。
  6. 第五步触发异常,函数调至handle_trap(),往0x6000_3000输出0x2021314,同时结束仿真。

仿真波形如下图。

  • 红色箭头:读取pmp相关的CSR寄存器,并输出值0x6000_0000(mmio)的总线上,共8次,pmpcfg0,pmpcfg1和pmpaddr0-pmpaddr7。
  • 蓝色箭头:往0x6000_1000-0x6000_118C区域写入数据,证明配置区域外没有问题。
  • 黄色箭头:往0x6000_0000地址写0x10086,触发异常,异常为7(Store/AMO access fault)。
  • 白色箭头:往0x6000_3000输出0x2021314,同时结束仿真。

Rocket-chip-PMP相关推荐

  1. Rocket Chip 介绍

    Rocket  Chip 是基于 Chisel 开发的一款开源的 SoC 生成器,具有可综合的RTL.通过配置可以生成两种基于 RISC-V 指令集的通用处理器就.Rocket-Chip 中有两种处理 ...

  2. chisel(Rocket Chip)中如何参数化芯片系统

    2021.9.5 有些地方添加了一点自己的理解!!! 0 绪论 前面已经介绍了chisel的初级和高级参数化. 如何把这些东西有效的在系统中组织起来呢?如何在系统中快捷的使用他们?这篇文章主要解决这个 ...

  3. 芯片开发语言:Verilog 在左,Chisel 在右

    来源 | 老石谈芯 在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为"香山"的开源高性能处RISC-V处理器.前不久我有幸和包老师就这个事情做了一次 ...

  4. 片上总线协议学习(1)——SiFive的TileLink与ARM系列总线的概述与对比

    link 片上总线协议学习(1)--SiFive的TileLink与ARM系列总线的概述与对比 finally 27 人赞同了该文章 一.背景介绍 随着超大规模集成电路的迅速发展,半导体工业进入深亚微 ...

  5. 在“芯片庭院”培育一颗多核异构 RISC-V SOC种子

    1 文章导览 本文是简要性的导览chipyard官方手册内容,以及安装开发环境需要注意的的一些地方,最后运行几个简单的官方Demo,希望能对RISC-V有兴趣的小伙伴有所启发帮助,官方网址为https ...

  6. 降低芯片设计创新门槛——从互联网成功经验看开源芯片生态发展

    降低芯片设计创新门槛 --从互联网成功经验看开源芯片生态发展 中国科学院计算技术研究所研究员  包云岗 2018年,中国企业遭遇芯片禁售令而陷入困境,中国半导体产业的现状再次引起各界广泛关注.如何尽快 ...

  7. 开源RISC-V 项目Freedom在Arty-7-100T开发板上的实现

    开源RISC-V 项目Freedom在Arty-7-100T开发板上的实现 1.获取Freedom项目源码 Freedom项目开源的地址为https://github.com/sifive/freed ...

  8. ARM + RISC-V双核锁步DCLS Lockstep技术总结

    基于<A Loosely-Coupled Arm and RISC-V Locksteping Technology>文章总结 一.lockstep技术分类 文中将lockstep技术总结 ...

  9. 山东大学RISC-V公共开放平台开发记录3

    山东大学RISC-V公共开放平台开发记录 RISC-V编译 2 编译优化策略 2.1 RISC-V GCC工具链的(–mcmodel=)选项 目前RISC-V GCC工具链认为,在实际的情形中,一个程 ...

  10. 简评几款开源RISC-V处理器

    RISC-V 能够实现"自主可控"与"普世通用"的国产处理器,中国应该拥抱此技术. 胡振波 转存失败重新上传取消 RISC-V指令集是怎么回事就不多说了.开门见 ...

最新文章

  1. 新思路保障网络安全 基于平台的网络安全架构体系
  2. C 库函数 - atoi()
  3. YBTOJ洛谷P1407:稳定婚姻(强连通分量)
  4. 计算机网上作业系统论文,网上作业提交系统的设计与实现
  5. CCIE理论第三篇-LISP技术
  6. idea添加添加自动添加版本控制
  7. vue项目小demo
  8. Node.js 教程第五篇——request
  9. gitignore文件的几种写法,Git忽略文件规则的配置方法
  10. android9三星功能,三星开启安卓9.0测试:One UI Beta计划
  11. python 数学公式显示_python 数学公式·
  12. SharepointDesigner创建一个工作流
  13. cad文字递增快捷键_Auto CAD2014数字递增复制快捷键是什么呢?
  14. OSX: 使用命令行对FileVault2分区恢复
  15. 飞天系统和linux,用Linux或Windows系统运行抢茅台脚本在性能上有区别吗?
  16. 威斯康星大学-机器学习导论2020
  17. 【原创纯手打】如何用微信小程序写留言板(附代码)
  18. 西安电子科技大学光学工程/电子信息(专业课代码851)考研经验分享
  19. 争购“学区房”是中国父母对孩子教育的一种焦虑
  20. 力扣每日一题每天自动邮件提醒

热门文章

  1. 无线路由器文件服务器,用无线路由器构建FTP服务器
  2. 国科大计算机学院元旦晚会,电子所2016年度研究生元旦晚会欢乐上演
  3. 九龙证券|遭特斯拉叫停合作?比亚迪紧急回应!亚太股市几乎全线下跌
  4. Pyhon - pyh 库 解决中文乱码问题
  5. 用python60行代码写一个简单的笔趣阁爬虫!三分一章?
  6. UGUI实现街机摇杆及技能判定
  7. 火山PC多线程学习教程第一章
  8. 4G网络 LTE、 FDD 和TD网络格式区别
  9. VMware虚拟机封装windows10:系统封装
  10. 台湾股市泡沫的前车之鉴