以下内容摘自《步步惊芯——软核处理器内部设计分析》一书
图3.1 QMEM在OR1200中的位置
取指令的过程:CPU给出指令的有效地址(EA:Effective Address),IMMU将有效地址翻译为物理地址(PA:PhysicalAddress),然后送到QMEM中,QMEM判断该地址是否位于QMEM的地址范围内,如果是,就直接取出指令送到CPU,如果不是位于QMEM的地址范围内,则将该地址发送给ICache,ICache查看该地址是否被缓存,如果是就直接读出指令送往QMEM,后者直接转发给CPU,如果ICache没有命中,则通过指令WB_BIU模块访问外部存储器获取指令。
加载/存储数据的过程:CPU给出读写数据的有效地址,DMMU将有效地址翻译为物理地址,然后送到QMEM中,QMEM判断该地址是否位于QMEM的地址范围内,如果是,就直接读写指定地址,如果不是位于QMEM的地址范围内,则将该地址发送给DCache,DCache查看该地址是否被缓存,如果是就直接将该数据送往QMEM,后者直接转发给CPU,或者直接写数据,如果DCache没有命中,则会通过SB、数据WB_BIU模块访问外部存储器读写数据。
所以QMEM的作用如图3.2所示,需要注意的是QMEM中只有一个RAM,指令、数据共用这一个RAM。
图3.2 QMEM的作用示意
在OR1200的配置文件or1200_defines.v中关于QMEM的配置选项如下:
`define OR1200_QMEM_IMPLEMENTED `define OR1200_QMEM_IADDR 32‘h0080_0000 `define OR1200_QMEM_IMASK 32‘hfff0_0000 // QMEM中指令存储地址是0x0080000-0x008fffff,所以共1MB `define OR1200_QMEM_DADDR 32‘h0080_0000 `define OR1200_QMEM_DMASK 32‘hfff0_0000 // QMEM中数据存储地址与指令存储地址可以不一样,默认是一样的 `define OR1200_QMEM_BSEL //默认是没有定义,但通过加载存储类指令的分析可知必须有该定义 // QMEM interface acknowledge // To enable qmem_ack port, define this macro. //`define OR1200_QMEM_ACK 不需要这个定义
or1200_qmem_top.v `ifdef OR1200_QMEM_IADDR assign iaddr_qmem_hit = (qmemimmu_adr_i & `OR1200_QMEM_IMASK) == `OR1200_QMEM_IADDR; `else assign iaddr_qmem_hit = 1‘b0; `endif `ifdef OR1200_QMEM_DADDR assign daddr_qmem_hit = (qmemdmmu_adr_i & `OR1200_QMEM_DMASK) == `OR1200_QMEM_DADDR; `else assign daddr_qmem_hit = 1‘b0; `endif
iaddr_qmem_hit = (qmemimmu_adr_i & 32‘hfff0_0000) == 32‘h0080_0000;
此时只要输入地址在0x00800000-0x008fffff(1M大小的空间范围内),都会使得iaddr_qmem_hit为1,表示地址在QMEM范围内,就会从QMEM中读取对应地址指令,反之iaddr_qmem_hit为0。当DMMU将数据地址送入QMEM后,也会进行同样的运算。所以当采用默认配置时QMEM中指令与数据拥有相同的地址空间,地址范围是0x0x00800000至0x008fffff,大小都是1M。
在第2章建立最小系统时,将上面的代码改为:
`ifdef OR1200_QMEM_IADDR assign iaddr_qmem_hit = 1‘b1; `else assign iaddr_qmem_hit = 1‘b0; `endif `ifdef OR1200_QMEM_DADDR assign daddr_qmem_hit = 1‘b1; `else assign daddr_qmem_hit = 1‘b0; `endif
or1200处理器中QMEM模块的作用,布布扣,bubuko.com
原文:http://blog.csdn.net/leishangwen/article/details/22109651