以下内容摘自《步步惊芯——软核处理器内部设计分析》一书
5 IMMU使用情景
前几章通过对OR1200处理器中各类指令执行过程的分析,实现了对CPU模块的剖析,本章将采用情景分析法,通过对使用IMMU的各种情景的分析以实现对IMMU模块剖析。使用IMMU的情景有如下几种:
(1)使用IMMU进行地址翻译,同时ITLB命中,且没有违反页保护策略
(2)使用IMMU进行地址翻译,但是ITLB未命中
(3)使用IMMU进行地址翻译,虽然ITLB命中,但是违反了页保护策略
(4)l.mtspr指令写特殊寄存器ITLBW0MRx、ITLBW0TRx
(5)l.mfspr指令读取特殊寄存器ITLBW0MRx、ITLBW0TRx
上述五种情景中,情景(1)、(2)、(3)在流水线的取指阶段使用到了IMMU,情景(4)、(5)在流水线的执行阶段使用到了IMMU。本章在后续部分将给出一个示例程序,其中涉及了IMMU的大部分使用情景,结合该示例程序分析在上述几种情景下IMMU的工作过程,从而理解IMMU的代码与原理。
6 分析用例
1、修改最小系统
为了使读者朋友对IMMU的作用有一个直观的认识,本节将给出一个示例程序,该示例程序展示了IMMU初始化、IMMU地址翻译、ITLB失靶异常、违反页保护策略而引发指令页失效异常等多种情况。在使用该示例程序之前,需要修改or1200_defines.v文件中的如下定义以启用IMMU:
or1200_defines.v
//`define OR1200_NO_IMMU 注释掉此处的宏定义,表示需要IMMU
这样我们的最小系统就修改成如图10.11所示,在CPU与QMEM模块之间添加了IMMU模块。CPU模块的指令Wishbone总线接口分为两部分:一部分在CPU与IMMU之间,一部分在CPU与QMEM之间,参考图3.7可以更加清晰的了解这一点。
此外,使用IMMU进行地址翻译时,由于地址翻译是以页为单位的(查询页表),页的大小是8KB,而QMEM中RAM的默认大小就是8KB,也就是只有1页,无法进行仿真,为此需要改变QMEM中RAM的大小。修改步骤如下:
(1)修改or1200_spram_2048x32.v中的地址宽度参数aw,修改为13,使得QMEM中RAM的大小变为32KB,共4页。
or1200_spram_2048x32.v
parameter aw = 13; //地址线的宽度,原值为11,新值为13
parameter dw = 32;
(2)修改QMEM中or1200_spram_2048x32的例化代码,如下:
or1200_qmem_top.v
or1200_spram_2048x32 or1200_qmem_ram(
.clk(clk), .rst(rst),
`ifdef OR1200_BIST
.mbist_si_i(mbist_si_i), .mbist_so_o(mbist_so_o),
.mbist_ctrl_i(mbist_ctrl_i),
`endif
`ifdef OR1200_QMEM_BSEL
.sel(qmem_sel),
`endif
`ifdef OR1200_QMEM_ACK
.ack(qmem_ack),
`endif
//将.addr(qmem_addr[12:2])改为.addr(qmem_addr[14:2])
.addr(qmem_addr[14:2]), .ce(qmem_en),
.we(qmem_we), .oe(1'b1),
.di(qmem_di), .doq(qmem_do)
);
修改结束后,需要在ModelSim中重新编译才可进行仿真。
2、示例程序
本节将给出一个示例程序,该程序涉及了IMMU的大部分使用情景,包括:ITLB命中且无页错误、ITLB失靶、ITLB命中但是有页错误、指令l.mtspr写IMMU中特殊寄存器等,读者借助于该程序可以更加具体的认识IMMU。
示例程序如下,共分为8步,读者朋友可以按照第1步、第2步、第3步……第8步这样的顺序阅读,便于理解:
.section .text,"ax"
.global _start
####################### 第7步 ########################
.org 0x000C
l.movhi r1,0x12
l.movhi r1,0x13 #第6步修改ITLB后,有效地址0x6010被翻译为0x0010
l.movhi r1,0x14
l.movhi r1,0x15
l.ori r2,r0,0x8040 #r2=0x8040
l.movhi r1,0x9
l.mtspr r0,r2,0x0011 #将0x8040写入SR,从而使得处理器进入用户模式
l.movhi r1,0x16 #在设置处理器进入用户模式之前已经读取到本指令进入
#流水线,所以不受影响
l.movhi r1,0x17 #在设置处理器进入用户模式之前已经读取到本指令进入
#流水线,所以不受影响
l.movhi