Rocket-chip-PMP
pmp(Physical Memory Protection CSRs)的介绍可以看:
《The RISC-V Instruction Set Manual Volume II: Privileged Architecture》
重点内容在这里提一下:
- 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。
- 32位的CPU,pmp的匹配地址为32-bit,是正常地址右移两位得出,64位的CPU为64-bit,也是正常地址右移两位得出。因为我没有配置虚拟内存,所以这里的正常地址就是实际的物理地址。
- pmp?cfg为8-bit CSR寄存器,包含L,A,X,W,R位。L表示锁定位,A为2-bit的区域位,X为可执行权限,W为可写权限,R为可读权限。
- 区域配置中包括4种形式,2b’00表示不使用,2’b01表示向上的全部范围,2’b10表示对齐的4字节范围,2’b11表示对齐的2^N字节范围,且要≥8字节。
- 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。
- 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");}
}
代码功能:
- 读取pmp相关的CSR寄存器,并输出值0x6000_0000(mmio)的总线上。
- 配置pmp区域1,地址为0x6000_0000-0x6000_0FFF,不可读,不可写,不可执行。
- 往0x8000_1000-0x8000_118C区域写入数据,证明memory区域没有问题。
- 往0x6000_1000-0x6000_118C区域写入数据,证明配置区域外没有问题。
- 往0x6000_0000地址写0x10086。
- 第五步触发异常,函数调至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相关推荐
- Rocket Chip 介绍
Rocket Chip 是基于 Chisel 开发的一款开源的 SoC 生成器,具有可综合的RTL.通过配置可以生成两种基于 RISC-V 指令集的通用处理器就.Rocket-Chip 中有两种处理 ...
- chisel(Rocket Chip)中如何参数化芯片系统
2021.9.5 有些地方添加了一点自己的理解!!! 0 绪论 前面已经介绍了chisel的初级和高级参数化. 如何把这些东西有效的在系统中组织起来呢?如何在系统中快捷的使用他们?这篇文章主要解决这个 ...
- 芯片开发语言:Verilog 在左,Chisel 在右
来源 | 老石谈芯 在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为"香山"的开源高性能处RISC-V处理器.前不久我有幸和包老师就这个事情做了一次 ...
- 片上总线协议学习(1)——SiFive的TileLink与ARM系列总线的概述与对比
link 片上总线协议学习(1)--SiFive的TileLink与ARM系列总线的概述与对比 finally 27 人赞同了该文章 一.背景介绍 随着超大规模集成电路的迅速发展,半导体工业进入深亚微 ...
- 在“芯片庭院”培育一颗多核异构 RISC-V SOC种子
1 文章导览 本文是简要性的导览chipyard官方手册内容,以及安装开发环境需要注意的的一些地方,最后运行几个简单的官方Demo,希望能对RISC-V有兴趣的小伙伴有所启发帮助,官方网址为https ...
- 降低芯片设计创新门槛——从互联网成功经验看开源芯片生态发展
降低芯片设计创新门槛 --从互联网成功经验看开源芯片生态发展 中国科学院计算技术研究所研究员 包云岗 2018年,中国企业遭遇芯片禁售令而陷入困境,中国半导体产业的现状再次引起各界广泛关注.如何尽快 ...
- 开源RISC-V 项目Freedom在Arty-7-100T开发板上的实现
开源RISC-V 项目Freedom在Arty-7-100T开发板上的实现 1.获取Freedom项目源码 Freedom项目开源的地址为https://github.com/sifive/freed ...
- ARM + RISC-V双核锁步DCLS Lockstep技术总结
基于<A Loosely-Coupled Arm and RISC-V Locksteping Technology>文章总结 一.lockstep技术分类 文中将lockstep技术总结 ...
- 山东大学RISC-V公共开放平台开发记录3
山东大学RISC-V公共开放平台开发记录 RISC-V编译 2 编译优化策略 2.1 RISC-V GCC工具链的(–mcmodel=)选项 目前RISC-V GCC工具链认为,在实际的情形中,一个程 ...
- 简评几款开源RISC-V处理器
RISC-V 能够实现"自主可控"与"普世通用"的国产处理器,中国应该拥抱此技术. 胡振波 转存失败重新上传取消 RISC-V指令集是怎么回事就不多说了.开门见 ...
最新文章
- 新思路保障网络安全 基于平台的网络安全架构体系
- C 库函数 - atoi()
- YBTOJ洛谷P1407:稳定婚姻(强连通分量)
- 计算机网上作业系统论文,网上作业提交系统的设计与实现
- CCIE理论第三篇-LISP技术
- idea添加添加自动添加版本控制
- vue项目小demo
- Node.js 教程第五篇——request
- gitignore文件的几种写法,Git忽略文件规则的配置方法
- android9三星功能,三星开启安卓9.0测试:One UI Beta计划
- python 数学公式显示_python 数学公式·
- SharepointDesigner创建一个工作流
- cad文字递增快捷键_Auto CAD2014数字递增复制快捷键是什么呢?
- OSX: 使用命令行对FileVault2分区恢复
- 飞天系统和linux,用Linux或Windows系统运行抢茅台脚本在性能上有区别吗?
- 威斯康星大学-机器学习导论2020
- 【原创纯手打】如何用微信小程序写留言板(附代码)
- 西安电子科技大学光学工程/电子信息(专业课代码851)考研经验分享
- 争购“学区房”是中国父母对孩子教育的一种焦虑
- 力扣每日一题每天自动邮件提醒