7 / 24 · 概念
存储器请求与响应的时序约定
区分同步读取、延迟后的标签和同地址冲突。
课时内容可免费阅读,选课后可保存学习进度。
存储器不仅是一个大型寄存器数组
存储器接口既需要容量规定,也需要时序约定。异步读取会在地址变化时改变组合输出。同步读取在时钟沿采样地址,随后改变输出。这两种模型需要不同的调度。能否推导为器件的存储器资源,还取决于编码风格和目标工具。本课程规定一个具有十六个八位条目的存储器,并采用同步读取。
在时钟沿 k 采样地址和标签。对应的数据及延迟后的标签在该时钟沿后出现;最早可在时钟沿 k+1 被使用方接收。单周期读取不意味着即时组合响应。响应 valid 必须具有相同的延迟。把延迟数据与当前输入标签组合,会破坏连续请求的对应关系。
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 并不会初始化数组。
| 时钟沿 | 已接收的请求 | 效果 |
|---|---|---|
| 2 | addr=3,tag=7 | 采集旧 mem[3]=42 |
| 3 | addr=4,tag=8 | 使用方接收 42,7,并采集下一个值 |
| 4 | 无请求 | 清除响应 valid |
这个调度假定使用方从不停顿。如果它在时钟沿 3 停顿,下一个响应可能覆盖 rd_data。应添加响应存储,或根据可用容量限制请求,并把已在途的响应计入容量。检查数值前,应明确初始化测试存储器。应验证地址与标签的对应关系,而不只是响应数据;正确数值若对应错误请求,仍然是验证失败。
自己试试
mem[3]=42 时,在同一个时钟沿读取地址 3,并向其写入 99。这个模型的 rd_data 是多少?存储器的新值是多少?为了支持输出停顿,需要增加什么?
阅读解释
rd_data 变为 42,而 mem[3] 变为 99。两项赋值都读取旧状态。停顿需要响应存储,以及把在途响应计入容量的准入控制。实际目标存储器的冲突模式需要另外核实。
✓ 已学习