Altifigence Academy

14 / 24 · 概念

设计单槽弹性寄存器

接收输入到空槽,或替换同一时钟沿被取走的数据项。

根据可用存储推导 ready

单槽缓冲包含一个 full 位和一个载荷寄存器。为空时,即使接收端停顿,也能接收输入。已满时,如果接收端在该时钟沿取走现有输出,就能接收替换项。因此 input-ready 为 !full OR output-ready,output-valid 为 full。这个寄存式缓冲没有组合数据直通。

input-ready 为高时,下一 full 等于 input-valid。有输入时采集载荷,否则将槽置空。input-ready 为低时,保持 full 和载荷。如果只因为输出发生传送就清除 full,会丢失同时到达的替换项。仅根据 input-valid 采集,会覆盖已满且停顿的槽。

SystemVerilog
module elastic_byte (
  input logic clk, rst,
  input logic in_valid,
  output logic in_ready,
  input logic [7:0] in_data, in_tag,
  output logic out_valid,
  input logic out_ready,
  output logic [7:0] out_data, out_tag
);
  logic full;
  assign in_ready = !full || out_ready;
  assign out_valid = full;
  always_ff @(posedge clk) begin
    if (rst) full <= 1'b0;
    else if (in_ready) begin
      full <= in_valid;
      if (in_valid) begin
        out_data <= in_data;
        out_tag <= in_tag;
      end
    end
  end
endmodule
旧 fullout-readyin-valid动作
001存储输入
101拒绝输入并保持输出
111交付旧项并存储替换项
110交付旧项并将槽置空

时钟沿 0 存储 tag0,y9。时钟沿 1 停顿。时钟沿 2 取走 tag0,并存储 tag1,y12;槽仍然已满。时钟沿 3 取走 tag1,如果没有输入则置空。替换操作允许每周期传送一个事务。

连接多个级会产生向后的组合 ready 路径。将 ready 寄存后,需要额外存储容纳停顿通知生效前到达的数据。应另外检查特定总线对组合路径的限制。不论载荷位宽如何,数据和所有伴随字段都应在相同条件下存储,并验证全部四种更新情况。

自己试试

某个时钟沿 full=1、out-ready=1、in-valid=1,取走 tag7,同时提供 tag8。下一 full 和 out-tag 是多少?如果每次取走数据都清除 full,会出什么问题?

阅读解释

Input-ready 为高,因此存储 tag8,并保持 full=1。Out-tag 变为 8。总在取走数据时清除 full,会在已经接收 tag8 后将其丢失。

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