zipline 压缩 lz77 rtl 算法实现

zipline lz77 conpressor 的rtl/spec 的整体架构如下:
image
lz77 算法中我们想得到 压缩后的literal/offset/length等信息,

从整体架构中主要是分为三个过程, 1:find matches(并行4B比较 + Bitmap/Thermometer) -> 2.select winner (分层筛选 :Tile -> Cluser -> ME) -> 3.output (压缩结果)

阶段一
1:find matches(并行4B比较 + Bitmap/Thermometer)

  • 当前的4B与历史中的位置(offset)并行比较(128个tiles);
  • 生成bm_per_offset_raw -> bm_per_offset ;
  • 生成 连续匹配的 thermometer;
  • 通过LPO跨周期积累,得到每个offset的向前匹配(fwd_therm);

阶段二
2.select winner (分层筛选 :Tile -> Cluser -> ME)

  • Tile 内: Search Tree + LPO选出Tile Candidata ;
  • CLuster : 16个Tile 的候选汇总,选出Cluster Candidate ;
  • MAtch Engine : CIF -> MDL -> MSM, 最终决定决胜者;

阶段三
3.output (压缩结果)

  • 输出literal 或 pointer (type , length ,offset );
  • 产生DMW / 非接控制信号 ;
  • 发送给后级编码器;

关键参数(当前RTL)

  • IN_BYTES = 4 ;
  • OFFSET_PRE_TILE =512 ;
  • TILE_PRE_CLUSTER =16 ;
  • CLUSTERS = 8 ;
  • Full history capacity = 64KB ;

首先引入一个概念: overlap : 解决的是一个match 能不能超过offset,源区域和输出区域能不能重叠;
Continuation 解决的是“这个 match 在硬件处理过程中还没结束,能不能继续往后延长”。

举例子: overlap 关注的是source 和 output 的空间关系。source值得是输入,待处理的数据,output是 输出数据,这里应该 是liter /<offset , length>
现在 offset = 2 ;
length = 8 ;
历史buffer 中: a b ;
因为 length 8 > offset 2 所以会复制 a b -> a b a b a b a b ;

即后面生成出来的 a b 又被继续当成 source。这就是 overlap。cOverlap

source区域和output区域重叠

整体的lz77算法 的 rtl 的微架构如下:
image
首先是

实际上,从 Spec + RTL 看,Zipline 更准确的理解应该是:
4B 输入 → 128 个 Tile 并行搜索 → Tile 内大量 LPO/虚拟 LPO 并行产生匹配 → Tile/Cluster 分层筛选 → Match Engine 做最终决策 → 决策结果通过反馈回到 LPO/Tile,形成 3-cycle feedback loop。

posted on 2026-09-28 10:50  狐狸耳朵FOX  阅读(6)  评论(0)    收藏  举报

导航