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

集成电路流片随笔26:tinyriscv的三级流水线细则pc

`include "defines.v"// PC寄存器模块
module pc_reg(input wire clk,input wire rst,input wire jump_flag_i,                 // 跳转标志input wire[`InstAddrBus] jump_addr_i,   // 跳转地址input wire[`Hold_Flag_Bus] hold_flag_i, // 流水线暂停标志input wire jtag_reset_flag_i,           // 复位标志output reg[`InstAddrBus] pc_o           // PC指针);always @ (posedge clk) begin// 复位if (rst == `RstEnable || jtag_reset_flag_i == 1'b1) beginpc_o <= `CpuResetAddr;// 跳转end else if (jump_flag_i == `JumpEnable) beginpc_o <= jump_addr_i;// 暂停end else if (hold_flag_i >= `Hold_Pc) beginpc_o <= pc_o;// 地址加4end else beginpc_o <= pc_o + 4'h4;endendendmodule

📌 模块功能概述

pc_reg模块负责控制指令地址(PC)的更新。它根据以下几种情况更新或保持PC值:

  1. 复位(Reset)
  2. 跳转(Jump)
  3. 流水线暂停(Hold)
  4. 正常递增

📥 输入端口解释

端口名位宽说明
clk1 bit时钟信号
rst1 bit全局复位信号(高电平有效)
jump_flag_i1 bit跳转使能信号(高电平表示需要跳转)
jump_addr_iInstAddrBus跳转目标地址
hold_flag_iHold_Flag_Bus保持流水线的标志位(如取指阶段暂停)
jtag_reset_flag_i1 bit来自JTAG接口的调试复位信号

📤 输出端口

端口名位宽说明
pc_oInstAddrBus当前PC值(即指令地址)

🔁 always 块说明

always @ (posedge clk)

在每个时钟上升沿,根据以下优先级更新 PC 值:

🥇 1. 复位信号优先
if (rst == `RstEnable || jtag_reset_flag_i == 1'b1)pc_o <= `CpuResetAddr;

当外部复位或JTAG调试复位触发时,PC重置为预设地址(如:0x00000000)。

🥈 2. 跳转信号
else if (jump_flag_i == `JumpEnable)pc_o <= jump_addr_i;

当检测到跳转请求时,将PC设置为跳转目标地址。

🥉 3. 流水线暂停(Hold)
else if (hold_flag_i >= `Hold_Pc)pc_o <= pc_o; // 保持不变

如果当前需要暂停(如因为缓存未命中或其他流水线控制信号),保持PC值不变。

🏁 4. 正常执行(地址加4)
elsepc_o <= pc_o + 4'h4;

如果无跳转或暂停,PC递增4字节,执行下一条指令。


✅ 总结:状态机行为

条件PC更新为
复位 or JTAG复位CpuResetAddr
跳转使能jump_addr_i
暂停标志 >= Hold_Pc保持不变
正常pc_o + 4
http://www.xdnf.cn/news/4942.html

相关文章:

  • 深入解析C++核心特性:运算符重载、继承、多态与抽象类
  • Midscene.js Chrome 插件实战:AI 驱动的 UI 自动化测试「喂饭教程」
  • javax.net.ssl.SSLHandshakeException: No appropriate protocol
  • 湖南大学-操作系统实验5
  • 几款适合Windows的工具,小巧而精致
  • 【软件设计师:多媒体】14.多媒体技术及其应用
  • Excel图表 vs 专业可视化工具:差距有多大?内容摘要
  • Navicat BI 数据分析功能上线 | 数据洞察新方法
  • 计算机网络笔记(十八)——3.5高速以太网
  • Python 打包时包含字库文件的方法
  • 浏览器自动化与网络爬虫实战:工具对比与选型指南
  • 基于springboot的海洋环保知识分享系统的设计与实现
  • 相机的方向和位置
  • 如何在 DataGridView 中加载大型数据集
  • 在一台CentOS服务器上开启多个MySQL服务
  • # 交换排序:从冒泡到快速排序的深度解析
  • WHAT - 简单服务发现
  • 【Bootstrap V4系列】学习入门教程之 组件-表单(Forms)
  • kuka, fanuc, abb机器人和移动相机的标定
  • 03 mysql 连接
  • 使用FastAPI微服务在AWS EKS中构建上下文增强型AI问答系统
  • Istio in action之Envoy Proxy详解
  • React 中二次封装组件时,实现 属性透传、事件透传、插槽透传和 ref 透传
  • iOS App 安全性探索:源码保护、混淆方案与逆向防护日常
  • 互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现
  • 4.1【LLaMA-Factory 实战】医疗领域大模型:从数据到部署的全流程实践
  • clahe算法基本实现
  • Linux 环境通过 tar 多线程压缩和解压
  • 护城河理论——AI与思维模型【100】
  • 5级李克特量表:量化态度的黄金标准