Altifigence Academy

7 / 24 · 概念

存储器请求与响应的时序约定

区分同步读取、延迟后的标签和同地址冲突。

存储器不仅是一个大型寄存器数组

存储器接口既需要容量规定,也需要时序约定。异步读取会在地址变化时改变组合输出。同步读取在时钟沿采样地址,随后改变输出。这两种模型需要不同的调度。能否推导为器件的存储器资源,还取决于编码风格和目标工具。本课程规定一个具有十六个八位条目的存储器,并采用同步读取。

在时钟沿 k 采样地址和标签。对应的数据及延迟后的标签在该时钟沿后出现;最早可在时钟沿 k+1 被使用方接收。单周期读取不意味着即时组合响应。响应 valid 必须具有相同的延迟。把延迟数据与当前输入标签组合,会破坏连续请求的对应关系。

SystemVerilog
logic [7:0] mem [0:15];
logic [7:0] rd_data;
logic [3:0] rd_tag;
logic rd_valid;
always_ff @(posedge clk) begin
  if (wr_en) mem[wr_addr] <= wr_data;
  rd_valid <= req_valid;
  if (req_valid) begin
    rd_data <= mem[req_addr];
    rd_tag <= req_tag;
  end
  if (rst) rd_valid <= 1'b0;
end

在这个行为模型中,同时读写同一地址会返回旧值,因为非阻塞赋值读取旧状态。实际存储器原语具有明确的冲突模式和限制;参阅 AMD UG901 的读写模式,并对照目标器件和综合结果核实预期模式。复位 valid 并不会初始化数组。

时钟沿已接收的请求效果
2addr=3,tag=7采集旧 mem[3]=42
3addr=4,tag=8使用方接收 42,7,并采集下一个值
4无请求清除响应 valid

这个调度假定使用方从不停顿。如果它在时钟沿 3 停顿,下一个响应可能覆盖 rd_data。应添加响应存储,或根据可用容量限制请求,并把已在途的响应计入容量。检查数值前,应明确初始化测试存储器。应验证地址与标签的对应关系,而不只是响应数据;正确数值若对应错误请求,仍然是验证失败。

自己试试

mem[3]=42 时,在同一个时钟沿读取地址 3,并向其写入 99。这个模型的 rd_data 是多少?存储器的新值是多少?为了支持输出停顿,需要增加什么?

阅读解释

rd_data 变为 42,而 mem[3] 变为 99。两项赋值都读取旧状态。停顿需要响应存储,以及把在途响应计入容量的准入控制。实际目标存储器的冲突模式需要另外核实。

你的选择适用于此浏览器,可随时在页脚更改。