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,不是捕获的硬件轨迹。
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查看波形数据
| 信号 | 波形 | 总线值 |
|---|---|---|
| clock | p.... | |
| valid | 01111 | |
| ready | 01011 | |
| fire | 01011 |
自己试试
输出级保持 A,out_ready=0,同时输入 B 有效。下一个时钟沿,该级和生产方必须怎样处理?
阅读解释
该级将 in_ready 拉低,并保持 A 和 out_valid。生产方保持 B 和 in_valid。稳定的数据项之后可以各传送一次。