【RISC-V设计-05】- RISC-V处理器设计K0A之GPR
【RISC-V设计-05】- RISC-V处理器设计K0A之GPR
文章目录
- 【RISC-V设计-05】- RISC-V处理器设计K0A之GPR
- 1.简介
- 2.设计顶层
- 3.内部结构
- 4.端口说明
- 5.设计代码
- 6.总结
1.简介
通用寄存器(General Purpose Register)是处理器设计中的重要组成部分,在数据处理和指令执行过程中发挥着关键作用,对于计算机系统的整体性能和效率有着至关重要的影响。通用寄存器用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。本模块内含有15个32bit的寄存器,一个写操作端口,两个读操作端口,读写可同时操作。
2.设计顶层

3.内部结构

4.端口说明
| 序号 | 端口 | 方向 | 位宽 | 说明 |
|---|---|---|---|---|
| 1 | core_clk | input | 1 | 内核时钟 |
| 2 | idu2gpr_we | input | 1 | 通用寄存器组写使能,高有效 |
| 3 | idu2gpr_waddr | input | 4 | 通用寄存器组写地址 |
| 4 | idu2gpr_wdata | input | 32 | 通用寄存器组写数据 |
| 5 | idu2gpr_raddr1 | input | 4 | 通用寄存器组读地址1 |
| 6 | gpr2idu_rdata1 | output | 32 | 通用寄存器组读数据1 |
| 7 | idu2gpr_raddr2 | input | 4 | 通用寄存器组读地址2 |
| 8 | gpr2idu_rdata2 | output | 32 | 通用寄存器组读数据2 |
5.设计代码
// -------------------------------------------------------------------------------------------------
// Copyright 2024 Kearn Chen, kearn.chen@aliyun.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------
// Description :
// 1. General Purpose Register, 32bit * 15 = 480bit
// -------------------------------------------------------------------------------------------------module k0a_core_gpr (input core_clk ,input idu2gpr_we ,input [3:0] idu2gpr_waddr ,input [31:0] idu2gpr_wdata ,input [3:0] idu2gpr_raddr1 ,output [31:0] gpr2idu_rdata1 ,input [3:0] idu2gpr_raddr2 ,output [31:0] gpr2idu_rdata2
);reg [31:0] x1_ra;
reg [31:0] x2_sp;
reg [31:0] x3_gp;
reg [31:0] x4_tp;
reg [31:0] x5_t0;
reg [31:0] x6_t1;
reg [31:0] x7_t2;
reg [31:0] x8_s0;
reg [31:0] x9_s1;
reg [31:0] xa_a0;
reg [31:0] xb_a1;
reg [31:0] xc_a2;
reg [31:0] xd_a3;
reg [31:0] xe_a4;
reg [31:0] xf_a5;wire x1_rd1 = (idu2gpr_raddr1 == 4'h1);
wire x2_rd1 = (idu2gpr_raddr1 == 4'h2);
wire x3_rd1 = (idu2gpr_raddr1 == 4'h3);
wire x4_rd1 = (idu2gpr_raddr1 == 4'h4);
wire x5_rd1 = (idu2gpr_raddr1 == 4'h5);
wire x6_rd1 = (idu2gpr_raddr1 == 4'h6);
wire x7_rd1 = (idu2gpr_raddr1 == 4'h7);
wire x8_rd1 = (idu2gpr_raddr1 == 4'h8);
wire x9_rd1 = (idu2gpr_raddr1 == 4'h9);
wire xa_rd1 = (idu2gpr_raddr1 == 4'ha);
wire xb_rd1 = (idu2gpr_raddr1 == 4'hb);
wire xc_rd1 = (idu2gpr_raddr1 == 4'hc);
wire xd_rd1 = (idu2gpr_raddr1 == 4'hd);
wire xe_rd1 = (idu2gpr_raddr1 == 4'he);
wire xf_rd1 = (idu2gpr_raddr1 == 4'hf);wire x1_rd2 = (idu2gpr_raddr2 == 4'h1);
wire x2_rd2 = (idu2gpr_raddr2 == 4'h2);
wire x3_rd2 = (idu2gpr_raddr2 == 4'h3);
wire x4_rd2 = (idu2gpr_raddr2 == 4'h4);
wire x5_rd2 = (idu2gpr_raddr2 == 4'h5);
wire x6_rd2 = (idu2gpr_raddr2 == 4'h6);
wire x7_rd2 = (idu2gpr_raddr2 == 4'h7);
wire x8_rd2 = (idu2gpr_raddr2 == 4'h8);
wire x9_rd2 = (idu2gpr_raddr2 == 4'h9);
wire xa_rd2 = (idu2gpr_raddr2 == 4'ha);
wire xb_rd2 = (idu2gpr_raddr2 == 4'hb);
wire xc_rd2 = (idu2gpr_raddr2 == 4'hc);
wire xd_rd2 = (idu2gpr_raddr2 == 4'hd);
wire xe_rd2 = (idu2gpr_raddr2 == 4'he);
wire xf_rd2 = (idu2gpr_raddr2 == 4'hf);wire x1_wr = (idu2gpr_waddr == 4'h1) & idu2gpr_we;
wire x2_wr = (idu2gpr_waddr == 4'h2) & idu2gpr_we;
wire x3_wr = (idu2gpr_waddr == 4'h3) & idu2gpr_we;
wire x4_wr = (idu2gpr_waddr == 4'h4) & idu2gpr_we;
wire x5_wr = (idu2gpr_waddr == 4'h5) & idu2gpr_we;
wire x6_wr = (idu2gpr_waddr == 4'h6) & idu2gpr_we;
wire x7_wr = (idu2gpr_waddr == 4'h7) & idu2gpr_we;
wire x8_wr = (idu2gpr_waddr == 4'h8) & idu2gpr_we;
wire x9_wr = (idu2gpr_waddr == 4'h9) & idu2gpr_we;
wire xa_wr = (idu2gpr_waddr == 4'ha) & idu2gpr_we;
wire xb_wr = (idu2gpr_waddr == 4'hb) & idu2gpr_we;
wire xc_wr = (idu2gpr_waddr == 4'hc) & idu2gpr_we;
wire xd_wr = (idu2gpr_waddr == 4'hd) & idu2gpr_we;
wire xe_wr = (idu2gpr_waddr == 4'he) & idu2gpr_we;
wire xf_wr = (idu2gpr_waddr == 4'hf) & idu2gpr_we;assign gpr2idu_rdata1 = ({32{x1_rd1}} & x1_ra) | ({32{x2_rd1}} & x2_sp) |({32{x3_rd1}} & x3_gp) | ({32{x4_rd1}} & x4_tp) |({32{x5_rd1}} & x5_t0) | ({32{x6_rd1}} & x6_t1) |({32{x7_rd1}} & x7_t2) | ({32{x8_rd1}} & x8_s0) |({32{x9_rd1}} & x9_s1) | ({32{xa_rd1}} & xa_a0) |({32{xb_rd1}} & xb_a1) | ({32{xc_rd1}} & xc_a2) |({32{xd_rd1}} & xd_a3) | ({32{xe_rd1}} & xe_a4) |({32{xf_rd1}} & xf_a5) ;assign gpr2idu_rdata2 = ({32{x1_rd2}} & x1_ra) | ({32{x2_rd2}} & x2_sp) |({32{x3_rd2}} & x3_gp) | ({32{x4_rd2}} & x4_tp) |({32{x5_rd2}} & x5_t0) | ({32{x6_rd2}} & x6_t1) |({32{x7_rd2}} & x7_t2) | ({32{x8_rd2}} & x8_s0) |({32{x9_rd2}} & x9_s1) | ({32{xa_rd2}} & xa_a0) |({32{xb_rd2}} & xb_a1) | ({32{xc_rd2}} & xc_a2) |({32{xd_rd2}} & xd_a3) | ({32{xe_rd2}} & xe_a4) |({32{xf_rd2}} & xf_a5) ;always @(posedge core_clk) if(x1_wr) x1_ra <= idu2gpr_wdata;
always @(posedge core_clk) if(x2_wr) x2_sp <= idu2gpr_wdata;
always @(posedge core_clk) if(x3_wr) x3_gp <= idu2gpr_wdata;
always @(posedge core_clk) if(x4_wr) x4_tp <= idu2gpr_wdata;
always @(posedge core_clk) if(x5_wr) x5_t0 <= idu2gpr_wdata;
always @(posedge core_clk) if(x6_wr) x6_t1 <= idu2gpr_wdata;
always @(posedge core_clk) if(x7_wr) x7_t2 <= idu2gpr_wdata;
always @(posedge core_clk) if(x8_wr) x8_s0 <= idu2gpr_wdata;
always @(posedge core_clk) if(x9_wr) x9_s1 <= idu2gpr_wdata;
always @(posedge core_clk) if(xa_wr) xa_a0 <= idu2gpr_wdata;
always @(posedge core_clk) if(xb_wr) xb_a1 <= idu2gpr_wdata;
always @(posedge core_clk) if(xc_wr) xc_a2 <= idu2gpr_wdata;
always @(posedge core_clk) if(xd_wr) xd_a3 <= idu2gpr_wdata;
always @(posedge core_clk) if(xe_wr) xe_a4 <= idu2gpr_wdata;
always @(posedge core_clk) if(xf_wr) xf_a5 <= idu2gpr_wdata;endmodule
6.总结
本文实现了一个基本的通用寄存器组,支持一写双读操作。对于一写双读操作,这可以显著提高数据处理的并行性,在诸如流水线处理等场景中能够提高系统的性能。比如,在一个 CPU 的指令执行阶段,可能同时需要读取两个寄存器的值进行运算,而新的数据又可以在同一周期被写入另一个寄存器。
每个寄存器都是32位宽,包含0地址寄存器,总共有16个的寄存器。设计中的寄存器全部采用无复为寄存器,优化时序,减少面积。无复位寄存器的选择可能会简化电路结构,但也需要在系统初始化和异常处理时特别注意数据的初始状态和稳定性。例如,在系统启动时,需要通过软件初始化来确保寄存器中的值是合理的起始值。事实上,软件也不应该依赖于寄存器的默认值。
在综合时,工具会为15个寄存器插入时钟门控Clocke Gating Cell,以降低动态功耗。由于汇编代码中使用的为ABI名称,所以寄存器命名带有ABI名称,方便调试和查看。通过逐一对每个寄存器编写逻辑代码,避免了对X0寄存器的译码,减少综合后电路面积。
相关文章:
【RISC-V设计-05】- RISC-V处理器设计K0A之GPR
【RISC-V设计-05】- RISC-V处理器设计K0A之GPR 文章目录 【RISC-V设计-05】- RISC-V处理器设计K0A之GPR1.简介2.设计顶层3.内部结构4.端口说明5.设计代码6.总结 1.简介 通用寄存器(General Purpose Register)是处理器设计中的重要组成部分,在…...
Linux/C 高级——shell脚本
1. shell脚本基础概念 1.1概念 shell使用方式:手动下命令和脚本 脚本本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(它不需要编译)。 shell脚本本质:shell命…...
SpringBoot面试题整理(1)
面试整理 前置知识 ApplicationContextInitializerApplicationListenerBeanFactoryBeanDefinitionBeanFactoryPostProcessorAwareInitializingBean/DisposableBeanBeanPostProcessor 面试题 SpringBoot启动流程IOC容器初始化流程Bean声明周期Bean循环依赖SpringMVC执行流程…...
LVS原理及实例
目录 LVS原理 LVS概念 lvs集群的类型 lvs-nat 解释 传输过程 lvs-dr 解释 传输过程 特点 lvs-tun LVS(Linux Virtual Server)常见的调度算法 防火墙标记(Firewall Marking)结合轮询调度 实战案例 lvs的nat模式配置 …...
Spring统一功能处理:拦截器、响应与异常的统一管理
目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核⼼功能之⼀,主要⽤来拦截⽤⼾的请求,在指定⽅法前后,根据业务需要执⾏预先设定的代码。 也就是说,允许开发⼈员提前预定义⼀些逻辑…...
深入理解小程序的渲染机制与性能优化策略
一、小程序的渲染机制 小程序的渲染机制主要由两部分组成:渲染层和逻辑层。渲染层负责页面的渲染,逻辑层负责处理业务逻辑和数据处理。两者通过一个安全的、高效的通信机制进行数据传输和事件通知。 渲染层:在渲染层,WXML 模板会…...
Linux:多线程(二.理解pthread_t、线程互斥与同步、基于阻塞队列的生产消费模型)
上次讲解了多线程第一部分:Linux:多线程(一.Linux线程概念、线程控制——创建、等待、退出、分离,封装一下线程) 文章目录 1.理解Linux下线程——理解tid2. Linux线程互斥2.1相关概念2.2引入问题分析问题解决思路 2.3L…...
Pandas中`str`对象解析与应用实例
在数据科学领域,字符串操作是数据清洗和处理中不可或缺的一部分。Pandas的str对象为我们提供了一个强大而灵活的字符串操作方法集。本文将深入探讨str对象的各种应用,并通过代码示例和输出展示如何有效地处理字符串数据。 关键词 Pandas, 字符串操作, …...
C语言典型例题29
《C程序设计教程(第四版)——谭浩强》 习题2.6 设圆半径r1.5,圆柱高h3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。 scanf输入结果,输出计算结果,输出时要有文字说明,取小数点后两位数…...
Docker 常规安装简介
Docker常规安装简介 欢迎关注我的B站:https://space.bilibili.com/379384819 1. 安装mysql 1.1 docker hub上面查找mysql镜像 网址: https://hub.docker.com/_/mysql 1.2 从docker hub上(阿里云加速器)拉取mysql镜像到本地标…...
理解张量拼接(torch.cat)
拼接 维度顺序:对于 3D 张量,通常可以理解为 (深度, 行, 列) 或 (批次, 行, 列)。 选择一个dim进行拼接的时候其他两个维度大小要相等 对于三维张量,理解 torch.cat 的 dim 参数确实变得更加抽象,但原理是相同的。让我们通过一…...
指针基础知识(笔记)
文章目录 1. 概念理解2. 空指针和野指针3. 计算4. 小结5. size_t6. 案例一: 指针查找并返回指定元素索引7. 指针访问多维数组(涉及 int (*ptr)[3]解析)8. 指针数组9. 函数的值传递与地址引用传递① 函数的值传递(pass by value)② 地址传递(pass by reference) 10. 案例二&…...
[Python学习日记-3] 编程前选择一个好用的编程工具
[Python学习日记-3] 编程前选择一个好用的编程工具 简介 PyCharm IDE的安装 PyCharm IDE安装后的一些常规使用 简介 在踏上 Python 编程的精彩旅程之前,选择一款得心应手的编程工具无疑是至关重要的一步。这就如同战士在出征前精心挑选趁手的武器,它将…...
智能化的Facebook未来:AI如何重塑社交网络的面貌?
随着人工智能(AI)技术的飞速发展,社交网络的面貌正在经历深刻的变革。Facebook(现Meta Platforms)作为全球最大的社交媒体平台之一,正积极探索如何利用AI技术来提升用户体验、优化内容管理并推动平台创新。…...
安全启动的原理
安全启动(Secure Boot)是一种用于确保设备只运行经过认证的软件的安全机制。其核心原理和步骤如下: 1. **硬件信任根(Root of Trust, RoT)**: - 安全启动过程始于硬件信任根,通常是设备上的…...
【ML】pre-train model 是什么如何微调它,如何预训练
【ML】pre-train model 是什么如何微调它,如何预训练 0. 预训练模型(Pre-trained Model)0.1 预训练模型的预训练过程0.2 如何微调预训练模型0.3 总结 1. Contextualized word Embedding2. 怎么 让 bert 模型变小3. 如何微调模型 0. 预训练模型…...
leetcode代码练习——Java的数据结构(具体使用)
注:Java中所有的泛型必须是引用类型 如<Integer>而不是<int> java提供的数学方法: 求最大值Math.max(10,15),最小值Math.min(10,15) 看取值范围: int范围:-2^31-2^31-1 double范围:-2^63-2^63-1 long范围:-2^63-2…...
sqlserver导出数据脚本
文章目录 sqlserver导出数据脚本任务-生成脚本 sqlserver导出数据脚本 任务-生成脚本...
html+css 实现hover中间展开背景
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…...
Java 怎么获取支付宝Open ID
在Java中获取支付宝用户的OpenID,通常是通过支付宝的开放平台API来完成的。OpenID是支付宝用于唯一标识一个支付宝用户的字符串,它在OAuth授权流程中被用来获取用户的身份和权限。 下面我将给出一个基于Java使用Spring Boot框架和支付宝开放平台SDK来获…...
力扣日刷47-补
236.二叉树的最近公共祖先这一题的逻辑说句实话也是非常地难懂。下面我来做一个总结吧:首先,我们的边界条件是,如果节点为空或者节点是pq其中一个返回节点的值。然后我们进行后序的遍历。这个遍历相当于是去刨根问底一定要找到p或者q或者所有…...
如何比较不同注册商的域名注册价格_如何查看域名的SEO数据和排名信息
如何比较不同注册商的域名注册价格 在互联网时代,域名已经成为网站的“门面”,是网站建设的重要一步。不同注册商的域名注册价格差异较大,如何在保证性价比的前提下选择合适的注册商成为了一个重要的问题。本文将详细探讨如何比较不同注册商…...
【稀缺首发】PyTorch 3.0静态图分布式训练性能基线报告(A100×8实测:静态图提速2.7×,通信开销下降63%)
第一章:PyTorch 3.0静态图分布式训练配置概览PyTorch 3.0 引入了原生静态图(Static Graph)支持,通过 torch.compile() 默认后端 inductor 与分布式运行时深度协同,显著提升多卡训练的启动速度与稳定吞吐。静态图模式下…...
TypeC接口改造全攻略:从MicroUSB到TypeC的电路设计与PCB制作(含免费设计文件)
Type-C接口改造全攻略:从MicroUSB到Type-C的电路设计与PCB制作 最近整理工作室时翻出一堆老设备,清一色配备MicroUSB接口。看着手边越来越多的Type-C线材,突然意识到是时候给这些"老伙计"升级接口了。作为硬件开发者,我…...
AI辅助开发新范式:描述需求,快马AI自动生成免安装的免费应用
AI辅助开发新范式:描述需求,快马AI自动生成免安装的免费应用 最近想做一个天气查询小工具,但自己从头写代码太费时间。听说InsCode(快马)平台的AI辅助开发功能很强大,就尝试用它来生成这个项目。整个过程让我很惊喜,完…...
矽力杰 Silergy SY8810 降压稳压器 佰祥电子
突破算力供电瓶颈:SY8810单芯片15A大电流与IC数字调压全景拆解导语:在边缘计算SoC、高速光模块(如QSFP-DD)以及企业级SSD的主板设计中,核心处理器的供电轨正面临着极其苛刻的物理学挑战。随着先进制程工艺不断演进&…...
毕业工具怎么选?一张表对比选题、写作、降重、排版、答辩核心功能
从选题到答辩,选对工具能省下80%的无效劳动。本文聚焦毕业全流程各环节的核心功能,帮你快速定位适合自己的工具组合。一、毕业全流程功能总览一个完整的毕业论文写作流程通常包括以下几个阶段,每个阶段都有对应的工具功能可以提效:…...
告别手算!用Matlab快速搞定高斯光束的ABCD矩阵(附常用光学系统代码)
用Matlab高效构建光学系统:高斯光束ABCD矩阵实战指南 光学仿真工程师们常常面临一个困境:理论推导严谨但繁琐,手动计算容易出错且效率低下。特别是在处理复杂光学系统时,反复验证ABCD矩阵的正确性会消耗大量时间。本文将分享一套经…...
WINFORM - DevExpress -> 从安装到汉化:DevExpress全流程实战指南
1. DevExpress简介与环境准备 DevExpress是一套功能强大的.NET用户界面控件库,特别适合WinForms、WPF等桌面应用开发。我第一次接触DevExpress是在2015年,当时就被它丰富的UI组件和流畅的动画效果惊艳到了。经过这些年的版本迭代,现在的DevEx…...
S2-Pro大模型一键部署实战:基于Ubuntu20.04的保姆级环境配置教程
S2-Pro大模型一键部署实战:基于Ubuntu20.04的保姆级环境配置教程 1. 开篇:为什么选择S2-Pro 最近在开源大模型领域,S2-Pro凭借其优秀的推理性能和轻量化设计吸引了不少开发者关注。作为一个在本地部署过多个大模型的老手,我发现…...
