我正在尝试编写一个使用riscv的小型软件。我用的是SaxonSoc https://github.com/SpinalHDL/SaxonSoc。这意味着,我可以访问硬件描述和模拟波形。
我正在试着理解为什么这个小测试不起作用?
int main (){
volatile uint32_t * volatile mem=(uint32_t * volatile)( SYSTEM_RAM_A_CTRL+ 0x2000) ;
*mem=0x15;
main_println32x("mem :",*mem);
u32 new_pmpcfg0 =1<<7 ; //setting the L bit so restructions can be applied to M mode
new_pmpcfg0 =(new_pmpcfg0) | 3<<3 ; // A=3=NAPOT ; R=W=X=0
u32 new_pmpaddr0=(u32)( SYSTEM_RAM_A_CTRL+ 0x2000) ;
__asm__ volatile ("csrw pmpaddr0, %0"
: /* output: none */
: "r" (new_pmpaddr0) /* input : from register */
: /* clobbers: none */);
__asm__ volatile ("csrw pmpcfg0, %0"
: /* output: none */
: "r" (new_pmpcfg0) /* input : from register */
: /* clobbers: none */);
*mem=0x19; // I expect an exception here
main_println32x("mem :",*mem);
}仿真表明,正确配置了csr寄存器:

但不幸的是,我没有得到我等待的例外。
知道我在这里错过了什么吗?
发布于 2022-01-13 11:14:09
我的第一个想法是,pmpaddr的设置不正确。在使用NAPOT编码时,开始地址和区域大小按照RiscV特权规范中的表3.10进行编码。
我建议通过设置pmpaddr ='1 (所有地址)来测试它,以覆盖整个地址空间,这样您正在访问的地址将与该pmp区域匹配。然后它应该抛出一个异常,因为它违反了访问权限。
https://stackoverflow.com/questions/70667440
复制相似问题