当前位置: 首页 > news >正文

数字IC前端学习笔记:近期最少使用(LRU)算法

相关文章

数字IC前端专栏https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482


目录

1.LRU简介

2.LRU的矩阵实现

3.采用矩阵法实现LRU的Verilog代码


1.LRU简介

LRU算法用于cache管理或任何其他需要对访问权进行周期更新的场合。基于时间和空间考虑,cache中存储着近期将会用到的数据项。当cache被用满后,如果有新的数据项到来,需要将某个现有的数据项从cache中清除,为新进入者提供空间。此时通常使用的算法被称为LRU(Least Recently Used,近期最少使用),通过LRU算法可以找到最久未被使用过的数据项,cache将该数据项清除,并将新的数据项写入此处。

另一个会用到LRU算法的地方是网络设备中的路由表管理电路。路由表的地址空间非常大,而在网络设备中用于存储路由表的存储器相对小得多,因此只有一部分路由表表项可以存储在CAM(Content Addressable Memory)存储器中,那么需要采用LRU算法找到当前CAM中最久未用过的表项,将其清楚后把新的表项写入,新的表项成为最新表项。

2.LRU的矩阵实现

在RTL级实现LRU算法的方法有多种。一种采用硬件实现LRU的方法是矩阵法。例如,有一个表,可存储4个表项,当前表项为A,B,C和D。我们的目标是确定哪一个是最久没有被访问过的,具体步骤如下:

  • 构建一个4×4的存储单元矩阵(每个存储单元是一个触发器)。
  • 将所有触发器初始化为零。
  • 无论何时,只要有一个表项被访问,则将其对应的一行全部置1,然后将其对应列全部置0。
  • 只要某个表项被访问,重复上一步操作。
  • 全零的一行对应的表项是近期最少使用者,是要被新的表项代替的对象。

假定访问顺序为A,D,C,A,B,在此情形下,D是最近使用最少的表项,它应该被替换掉。下面用4×4矩阵解释上述算法。

初始条件

ABCD
A0000
B0000
C0000
D0000

参考序列:A

ABCD
A0111
B0000
C0000
D0000

参考序列:A、D

ABCD
A0110
B0000
C0000
D1110

参考序列:A、D、C

ABCD
A0100
B0000
C1101
D1100

参考序列:A、D、C、A

ABCD
A0111
B0000
C0101
D0100

参考序列:A、D、C、A、B

ABCD
A0011
B1011
C0001
D0000

D行为全零,是近期最少使用者。B行的1最多,是近期最多使用者。

3.采用矩阵法实现LRU的Verilog代码

module matrix_lru #(parameter SIZE = 8) (clk, rstb, update_the_entry, update_index, lru_index); input clk; input rstb; input update_the_entry; input [2:0] update_index; output [2:0] lru_index; reg [(SIZE - 1):0] matrix [0:(SIZE - 1)]; reg [(SIZE - 1):0] matrix_nxt [0:(SIZE - 1)]; reg [2:0] lru_index; reg [2:0] lru_index_nxt; generate genvar i; for(i = 0; i < SIZE; i = i + 1) begin always@(posedge clk or negedge rstb) begin if(!rstb) matrix[i] <= 0; else matrix[i] <= matrix_nxt[i]; end end endgenerate generate genvar j, k; for (j = 0; j < SIZE; j = j + 1) begin for(k = 0; k < SIZE; k = k + 1)begin always@(*) begin matrix_nxt[j][k] = matrix[j][k]; if(update_the_entry && (j == update_index) && (k != update_index)) matrix_nxt[j][k] = 1'b1; else if(update_the_entry && (k == update_index)) matrix_nxt[j][k] = 1'b0; end end end endgenerate always@(*) begin lru_index_nxt = lru_index; if(matrix[0] == 8'b0) lru_index_nxt = 0; else if(matrix[1] == 8'b0) lru_index_nxt = 1; else if(matrix[2] == 8'b0) lru_index_nxt = 2; else if(matrix[3] == 8'b0) lru_index_nxt = 3; else if(matrix[4] == 8'b0) lru_index_nxt = 4; else if(matrix[5] == 8'b0) lru_index_nxt = 5; else if(matrix[6] == 8'b0) lru_index_nxt = 6; else if(matrix[7] == 8'b0) lru_index_nxt = 7; end always@(*) begin if(!rstb) lru_index <= 0; else lru_index <= !lru_index_nxt; end endmodule

仿真截图如下所示。

以上内容来源于《Verilog高级数字系统设计技术和实例分析》

http://www.jsqmd.com/news/580202/

相关文章:

  • 如何拯救臃肿的右键菜单?ContextMenuManager的高效极简解决方案
  • ClearerVoice-Studio语音分离实战案例:AVI录播课自动分离教师/学生双声道音频
  • OCAD应用:单反射镜扫描光学系统初始结构设计
  • Qwen3-14B指令遵循效果:COT思维链、工具调用、格式约束生成实测
  • Qwen3-VL-8B-Instruct-GGUF部署避坑指南:常见问题与一键解决方案
  • 毫秒转换神器 ms.js:10分钟掌握智能时间格式转换
  • WarcraftHelper完全指南:从显示异常到性能飞跃的5个关键突破
  • nmapAutomator工具集成:如何自动运行ffuf、gobuster等侦察工具
  • 2026无尘烘箱厂家推荐:技术实力与产品性能解析 - 品牌排行榜
  • 3个革命性的视频自动化剪辑解决方案:从效率瓶颈到批量生产的技术跃迁
  • GTE-Chinese-Large效果展示:同一Query下Top5语义检索结果对比传统BM25的显著优势
  • Phi-3-mini-128k-instruct结合MCP协议:构建可扩展的AI工具生态
  • 突破性阴阳师自动化脚本:一站式解放双手的智能游戏辅助实战指南
  • 如何通过智能助手彻底解放你的智慧树学习时间
  • 公司SEO推广与品牌形象塑造的关系是什么
  • 2026真空干燥箱品牌哪家好?行业实力品牌推荐 - 品牌排行榜
  • 医美可视化新体验:Face3D.ai Pro帮你“预览”术后3D效果
  • 通义千问2.5多场景应用:金融报告生成部署完整指南
  • AgentCPM与PyTorch模型调试:分析训练日志并自动生成实验报告
  • 如何快速使用BBDown下载B站视频:面向新手的完整指南
  • 终极Bootstrap-fileinput应用指南:电商、社交、教育行业10大实战案例
  • LSM303DLHC驱动开发:磁力计校准与六轴姿态解算
  • 3步完成C++27契约安全校验配置迁移:从C++20 contracts TS到N4981标准的ABI兼容性验证清单(含LLVM/EDG双工具链比对)
  • twofi使用教程
  • 如何才能实现长期稳定的 SEO 优化_SEO 优化如何入门
  • 告别网课焦虑:Autovisor让智慧树学习效率提升300%的秘密武器
  • FlowState Lab实操手册:利用Jupyter Notebook进行交互式研究与教学
  • 解决手柄兼容性问题的虚拟手柄驱动方案
  • 包包颜色定制全指南|如何选择最适合你的专属色彩
  • Switch手柄PC适配终极指南:BetterJoy完全使用教程