跳转至

实验要求

数据排序2

要求配置如下:

  • 原始数据:1024个*32位的数据

  • 以1024长,宽度为32bits( =4字节)的BRAM来存储

    hint : 在BRAM的AXI接口中,将s_axi_arsize接口接3'b010,就可以一次读4个字节(32位)

  • 存储数据的BRAM的要求

  • 法一:使用遵守AXI总线协议的BRAM(IP核中选择)

  • 法二:使用普通的BRAM,但是每次连续请求前面需要自行等待数个时钟

    hint : 即,将普通的BRAM再人为包装一层,要求达到第一次访问需要停止几个时钟的效果

  • Cache基础配置

  • 直接映射(无替换策略)

  • 8个块

  • 每个块有128bits,即可以存储4个有效数据

  • 不限制写回方式

    hint : 提示一些具体的细节

    数据BRAM的地址空间是1024 = $$ 2^{10} $$

    如果考虑字节地址,最低位还有两位0

    输入给AXI接口BRAM的地址是字节地址,需要在字地址后补两位0

    以下考虑12位的字节地址,其中前10位是字地址

    11 10 9 8 7 6 5 4 3 2 1 0
    1 0
    低两位是一起拼凑出一个完整数据的地址,
    而我们在Cache中的最小粒度是一个数据,
    (BRAM的粒度是字,但AXI接口可以指定到字节的写)实际上Cache对低两位失明
    例如:数据0,数据1是前两个数据,实际上是:
    000,001,010,011构成数据0,
    100,101,110,111构成数据1
    3 2
    这两位对应Cache的一个块中的4个数据 一般用名字offset表示
    6 5 4
    这三位对应Cache的8个块的选择 用于查询某条地址对应的数据的所属块
    以及从主存取出的数据放在哪个块
    一般用名字index表示
    11 10 9 8 7

    这5位为Tag,用于校验对应的块是否是想要找的块。例如:

    块0存储的是11111_000的4个数据

    但是现在排序请求11110_000_00,发现Tag域 1111111110,不同,所以需要重新从主存请求数据

  • Valid域和Dirty域,两者都各需要一个bit来表示。(本次实验建议使用写直达策略,当写入cache时,Cache立刻写BRAM,所以可以不做Dirty域,同时AXI接口BRAM的s_axi_awlen设为0,每次写请求只写一拍一字)

设计提示

本质上就是修改了读和写的逻辑

助教的提示,如何快速迭代,完成任务

  • 修改排序器的状态机,使得在后期能够确保一定是Cache的问题
  • 需要仿真一个Cache
    • why: 仿真的Cache与排序器的交互信号与真实的Cache一样
    • How:
    • 排序器在状态并不知道Cache几个时钟内能够给出地址对应的数据——使用valid信号交互。
    • 真实的Cache的行为见状态机的实现
    • 仿真的Cache,实现方法是在普通的BRAM基础上,加上一层模块,使得每次访问会有延迟(固定的就行了),但是排序器需要认为是不确定的周期返回数据(模拟致盲)
  • 这样,我们获得了一个功能正确的排序器2.0
  • 实现Cache,不接上排序器
  • 测试:自行编写仿真文件,给出一些读写的请求,测试读写的正确性
  • 重点还是在状态机
  • 将Cache替换上面的模拟Cache,联调,对齐时序
  • 至此结束,完成设计

hint: 3个重点

  1. 状态机思想:
  2. 排序器有无状态机,在重新构造新的逻辑上面的好处。抽象思想与分层思想
  3. Cache的状态机,本质上是辅助测试的
  4. Cache的模块测试:
  5. 需要自己思考到底哪里会容易出现问题,针对性的构建测试样例进行测试
  6. 全方面的测试
  7. 两个模块的对齐。时序是关键,反复强调时序

合理的拆分任务,分阶段的实现,综合性的联调,在工程实现总非常常见。拆分的合理性和不同模块的merge往往是关键。

检查要求

  1. 同Lab4 一样,检查排序的正确性,不再检查时钟数目
  2. 对Cache的理解和设计,建议准备好状态机和设计模块图接受检查
  3. AXI总线交互的理解
  4. 使用SDU查看BRAM的内容,能查看cache的存储器内容会更好

对于使用AXI接口的BRAM,一种可行的实现方式:

可以使用一个拨动开关(如sw0)来切换模式,1则SDU读模式,0则排序模块读模式。在SDU读模式下,设置BRAM的awvalid和wvalid为0,不可写入,arvalid和rready为1,常态读,arlen为0,每次读一拍,并将araddr设置为{20'h0, sdu_addr[9:0], 2'h0},即BRAM的读地址是SDU根据PC串口传输获取到的地址(sdu_dm模块的addr输出信号)。这样,在SDU读模式下,AXI接口的BRAM的行为表现和一般接口的BRAM基本一致。在排序模式下araddr为cache提供的地址,同实验介绍中给出的样例。

查看cache的存储器的方法类似,通过合理接线,允许拨动开关选择sdu查看cache存储器内容。