Altifigence Academy

14 / 24 · 概念

Ready/valid 与停顿状态

输出级保持 A,out_ready=0,同时输入 B 有效。下一个时钟沿,该级和生产方必须怎样处理?

只有传送时才推进

生产方在当前数据项可用时置位 valid。使用方能接收该数据项时置位 ready。两个信号同时有效的上升沿发生一次传送。只有此时才推进像素坐标、行缓冲状态及对应累加输入。仅根据 valid 推进会在使用方暂停时丢失数据;仅根据 ready 推进会统计不存在的输入。

valid 为高、ready 为低时,保持相同数据和 valid。如果要在输出受阻时继续接收输入,就要提供存储,并根据剩余容量推导 ready。RTL 示例是单数据项级:为空或当前数据项可以离开时,接收新数据项。

传送顺序示例

周期零到四,valid=[0,1,1,1,1]、ready=[0,1,0,1,1] 得到 fire=[0,1,0,1,1]。五个时钟只接收三个像素。周期二停顿的数据项一直保持到周期三。宽度四的行计数器尚未完成第一行。统计时钟而非传送,会使后续每个窗口坐标都错位。

该级保持 A、out_valid 为高且 out_ready 为低时,in_ready 为低,A 继续存储。out_ready 变高后,可以在同一个时钟沿发送 A 并接收 B。如果没有替换输入,就清除输出 valid。应记录是否允许同时替换,以及相应延迟。

复位既清除数据,也清除有效性。新帧需要明确的坐标和窗口有效状态复位。收到最后输入不同于取走最后输出;过早置位 done,可能让新帧覆盖未完成工作。

代码是传送级,不是完整卷积引擎。如果已安装流程支持 SystemVerilog 编辑和仿真,可手动创建文件,测试暂停期间稳定性和同时替换。此处没有宣称执行过 RTL 仿真器。示意图说明 fire,不是捕获的硬件轨迹。

SystemVerilog
module sample_stage (
  input logic clk, reset,
  input logic in_valid,
  output logic in_ready,
  input logic signed [7:0] in_data,
  output logic out_valid,
  input logic out_ready,
  output logic signed [7:0] out_data
);
  assign in_ready = !out_valid || out_ready;
  always_ff @(posedge clk) begin
    if (reset) begin
      out_valid <= 1'b0;
      out_data <= '0;
    end else if (in_ready) begin
      out_valid <= in_valid;
      if (in_valid) out_data <= in_data;
    end
  end
endmodule
暂停期间被接收的传送
查看波形数据
波形数据:每个字符表示一个区间,点表示保持前一状态,p 表示一个时钟周期。
信号波形总线值
clockp....
valid01111
ready01011
fire01011

自己试试

输出级保持 A,out_ready=0,同时输入 B 有效。下一个时钟沿,该级和生产方必须怎样处理?

阅读解释

该级将 in_ready 拉低,并保持 A 和 out_valid。生产方保持 B 和 in_valid。稳定的数据项之后可以各传送一次。

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