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

【RISC-V设计-06】- RISC-V处理器设计K0A之ALU

【RISC-V设计-06】- RISC-V处理器设计K0A之ALU

文章目录

  • 【RISC-V设计-06】- RISC-V处理器设计K0A之ALU
    • 1.简介
    • 2.顶层设计
    • 3.内部结构
    • 4.端口说明
    • 5.操作码说明
    • 6.设计代码
    • 7.总结

1.简介

算术逻辑单元(Arithmetic Logic Unit,简称 ALU)是计算机中央处理器(CPU)的核心组成部分之一,负责执行各种算术和逻辑运算。在本设计中,ALU模块具有两个作用,一是对所有运算指令操作数的处理,二是对跳转指令地址的处理。

2.顶层设计

3.内部结构

ALU模块包含两个加法器,分别称之为运算加法器地址加法器,运算加法器在本设计中具有多重用途,如下

  1. 执行加法运算,本设计中包含一个33bit+33bit的全加器,含最低位进位;
  2. 执行减法运算,根据规则,减去一个数等于加上这个数的取反再加一;
  3. 执行无符号比较运算,根据规则,小数减大数需要向高位借位;
  4. 执行有符号比较运算,根据规则,补码变换为移码后,单调性不变,再应用3)无符号比较运算;

考虑到在执行条件跳转指令时,既需要ALU执行比较运算(也即加法运算),同时又需要计算地址偏移,一个加法器显然是不夠的,因此,ALU内部还包含一个20bit+20bit的加法器,用于地址的运算。此加法器为20bit加法器,位宽相对较小,不经过其它复用逻辑,直接运算,可为执行加载存储指令的地址的送出提供一定的时序裕量。

ALU内部包含两个移位电路,分别是逻辑左移和逻辑右移。为了节省资源,算术右移并没有单独再使用一个移位器,而是通过同时调用逻辑左移和逻辑右移来实现。如下图

ALU内部包含一个异或电路,用来执行异或指令,同时,也用于判断两个操作数rs1和rs2是否相等,异或逻辑的输出后接了一级和0比较的比较器。如下图

ALU内部包含一个逻辑与电路和一个逻辑或电路,用于执行与、或等逻辑指令。考虑到与、或逻辑相对比较简单,为了时序上的优化,所以CSR相关的指令并没使用ALU。如下图

4.端口说明

序号端口位宽方向说明
1idu2alu_op4输入ALU的操作码,来自指令译码单元
2idu2alu_rs132输入运算的第一操作数,来自指令译码单元
3idu2alu_rs232输入运算的第二操作数,来自指令译码单元
4alu2idu_res32输出数值运算的结果,送给指令译码单元
5alu2idu_cmp1输出比较运算的结果,送给指令译码单元
6idu2alu_addr120输入地址运算的第一操作数
7idu2alu_addr220输入地址运算的第二操作数
8idu2alu_addro20输出地址运算的输出结果

5.操作码说明

操作码指令功能数值结果比较结果指令
4‘b0000add算术运算,加法res = rs1 + rs2----add, addi, auipc
4’b1000sub算术运算,减法res = rs1 - rs2----sub
4’b0001sll逻辑运算,左移res = rs1 << rs2[4:0]----sll, slli
4‘b1010slt比较运算,有符号小于----cmp = rs1 < rs2 ? 1’b1 : 1’b0slt, slti
4’b0011sltu比较运算,无符号小于----cmp = rs1 < rs2 ? 1’b1 : 1’b0sltu, sltiu
4’b0100xor逻辑运算,异或res = rs1 ^ rs2----xor, xori
4’b0101srl逻辑运算,逻辑右移res = rs1 >> rs2[4:0]----srl, srli
4’b1101sra逻辑运算,算术右移res = rs1 >>> rs2[4:0]----sra, srai
4’b0110or逻辑运算,或res = rs1 | rs2----or, ori
4’b0111and逻辑运算,与res = rs1 & rs2----and, andi
4‘b0100beq条件转移,相等跳转----cmp = rs1 == rs2?1’b1:1’b0beq
4‘b0100bne条件转移,不等跳转----cmp = rs1 == rs2?1’b1:1’b0bne
4’b1010blt条件转移,有符号小于跳转----cmp = rs1 < rs2?1’b1:1’b0blt
4’b0011bltu条件转移,无符号小于跳转----cmp = rs1 < rs2?1’b1:1’b0bltu
4’b1010bge条件转移,有符号大于等于跳转----cmp = rs1 < rs2?1’b1:1’b0bge
4’b0011bgeu条件转移,无符号大于等于跳转----cmp = rs1 < rs2?1’b1:1’b0bgeu
注:1)操作码的定义基本沿用了指令集中的操作码,指令译码器可以直接从指令中提取操作码,减少指令译码器的译码逻辑电路。2)在执行auipc指令时,由于是32位运算,且执行此指令时ALU加法器并未工作,借用了ALU中运算加法器。

6.设计代码

// -------------------------------------------------------------------------------------------------
// 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. Arithmetic and Logic Unit
// -------------------------------------------------------------------------------------------------module k0a_core_alu (input  wire [3:0]   idu2alu_op    ,input  wire [31:0]  idu2alu_rs1   ,input  wire [31:0]  idu2alu_rs2   ,output wire [31:0]  alu2idu_res   ,output wire         alu2idu_cmp   ,input  wire [19:0]  idu2alu_addr1 ,input  wire [19:0]  idu2alu_addr2 ,output wire [19:0]  alu2idu_addro
);wire op_add  = idu2alu_op[2:0] == 3'b000;
wire op_sll  = idu2alu_op[2:0] == 3'b001;
wire op_slt  = idu2alu_op[2:0] == 3'b010;
wire op_sltu = idu2alu_op[2:0] == 3'b011;
wire op_xor  = idu2alu_op[2:0] == 3'b100;
wire op_srl  = idu2alu_op[2:0] == 3'b101;
wire op_or   = idu2alu_op[2:0] == 3'b110;
wire op_and  = idu2alu_op[2:0] == 3'b111;wire [31:0] alu_and = idu2alu_rs1 & idu2alu_rs2;
wire [31:0] alu_or  = idu2alu_rs1 | idu2alu_rs2;
wire [31:0] alu_xor = idu2alu_rs1 ^ idu2alu_rs2;wire [31:0] alu_inv = idu2alu_rs2 ^ {32{idu2alu_op[3]}};wire [32:0] alu_in1 = {1'b0, op_slt ^ idu2alu_rs1[31], idu2alu_rs1[30:0]};
wire [32:0] alu_in2 = {idu2alu_op[3], op_slt ^ alu_inv[31], alu_inv[30:0]};wire [32:0] alu_add = alu_in1 + alu_in2 + idu2alu_op[3];wire [31:0] alu_srs = idu2alu_op[3] ? {{31{idu2alu_rs1[31]}}, 1'b0} : idu2alu_rs1;wire [31:0] alu_sll = alu_srs << alu_inv[4:0];
wire [31:0] alu_srl = idu2alu_rs1 >> idu2alu_rs2[4:0];
wire [31:0] alu_sra = {32{idu2alu_op[3]}} & alu_sll | alu_srl;wire alu_zero = alu_add[31:0] == 32'd0;wire alu_slt = (op_slt | op_sltu) & alu_add[32];assign alu2idu_res = {32{op_add}} & alu_add[31:0]  | {32{op_and}} & alu_and |{32{op_xor}} & alu_xor        | {32{op_or }} & alu_or  |{32{op_sll}} & alu_sll        | {32{op_srl}} & alu_sra |{31'd0, alu_slt};assign alu2idu_cmp = op_add & alu_zero | alu_slt;assign alu2idu_addro = idu2alu_addr1 + idu2alu_addr2;endmodule

7.总结

本文介绍了RISC-V架构所需的基本算术和逻辑运算的ALU实现。通过不同的操作码,可以执行多种运算,支持处理器的指令集执行。得益于较为规整的RISCV指令集,ALU的op操作码的定义和指令集的定义基本一致,避免了指令译码器先译码再编码的过程,操作码可直接从指令中提取,简化了逻辑,优化了时序和面积;多功能复用的运算加法器,通过一个加法器,实现了加法、减法、无符号、有符号比较等多种运算的统一,避免了逻辑功能的重复与浪费;算术右移逻辑复用同时复用了逻辑左移和逻辑右移,避免了再使用一个移位器,进一步压缩了面积。

相关文章:

【RISC-V设计-06】- RISC-V处理器设计K0A之ALU

【RISC-V设计-06】- RISC-V处理器设计K0A之ALU 文章目录 【RISC-V设计-06】- RISC-V处理器设计K0A之ALU1.简介2.顶层设计3.内部结构4.端口说明5.操作码说明6.设计代码7.总结 1.简介 算术逻辑单元&#xff08;Arithmetic Logic Unit&#xff0c;简称 ALU&#xff09;是计算机中…...

MyIP:强大且简单好用!

在这个数字化的时代&#xff0c;IP地址就像是我们的网络身份证。各位在日常的工作中&#xff0c;肯定会会遇到需要和 IP 地址相关的需求。 今天和大家聊一聊一个非常好用的开源 IP 工具项目 - MyIP。 简介 MyIP一个开源IP工具箱&#xff0c;提供了一系列的网络检测工具&…...

Redis作为缓存,如何与MySql的数据进行同步?

允许延时一致的业务 概念 采用异步通知使用MQ作为中间件&#xff0c;更新数据之后通知缓存删除利用canal中间件&#xff0c;不需要修改业务代码&#xff0c;伪装成Mysql的一个从节点&#xff0c;canal通过读取binlog数据更新缓存 强一致性业务 概念 采用Redission提供的读写锁…...

Android 通知栏推送功能

Android 通知栏推送功能 Android 通知栏推送功能 让消息在用户的通知栏上显示&#xff0c;并且点击后跳转到指定的页面 MainActivity.Java import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import andro…...

【LVS】防火墙mark标记解决调度问题

实验环境是在之前部署DR模式集群的基础上做的&#xff0c;参考如下 部署DR模式集群 以http和https为例&#xff0c;当我们在webserver中同时开放80和443端口&#xff0c;那么默认控制是分开轮询的&#xff0c;就会出现了一个轮询错乱的问题&#xff1a; 当第一次访问80被轮询…...

算法笔记|Day20回溯算法II

算法笔记|Day20回溯算法II ☆☆☆☆☆leetcode 39. 组合总和题目分析代码 ☆☆☆☆☆leetcode 40.组合总和II题目分析代码 ☆☆☆☆☆leetcode 131.分割回文串题目分析代码 ☆☆☆☆☆leetcode 39. 组合总和 题目链接&#xff1a;leetcode 39. 组合总和 题目分析 本题采用回…...

Oracle认证1Z0-071线上考试注意事项

目录 一、前言二、回顾过往战绩第一次 裸考&#x1f412;第二次 背题库硬考&#xff01;&#x1f412;第三次 软件卡住&#xff0c;寄&#xff01;&#x1f648;第四次 汇总纠错&#xff0c;通过&#xff01;&#x1f31a; 三、考试流程四、考试注意事项1. 是否需要科学上网2. …...

【C++ 面试 - 基础题】每日 3 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…...

影响LabVIEW工作效率的因素有哪些

影响LabVIEW工作效率的因素可以分为多个方面&#xff0c;涵盖硬件、软件、开发环境和编程习惯等。以下是一些常见的影响因素&#xff1a; 1. 硬件因素 处理器性能&#xff1a;处理器的速度和核心数量对LabVIEW程序的执行效率有很大影响。 内存大小&#xff1a;足够的内存可以保…...

linux 裸机.之SPV5210,dnw,usb,sdk,fastboot刷机(一)

linux 裸机.之SPV5210&#xff0c;dnw&#xff0c;usb&#xff0c;sdk&#xff0c;fastboot刷机&#xff08;一&#xff09;...

性能测试工具LoadRunner

前言&#x1f440;~ 上一章我们介绍了性能测试的一些基本概念&#xff0c;重要的是性能测试的各项指标&#xff0c;今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么&#xff1f; LoadRunner安装 LoadRunner脚本录制 1.录…...

智能归来:深入探索人工智能回归模型的奥秘

人工智能之回归模型 1. 回归模型的数学基础1.1 回归分析的基本原理1.1.1 目标变量与预测变量的关系1.1.2 线性回归模型 1.2 矩阵形式的回归模型1.2.1 回归方程的矩阵表示1.2.2 矩阵运算的基本性质及其在回归分析中的应用 1.3 总结 2. 最小二乘法 (Ordinary Least Squares, OLS)…...

swift 中,对象() 和 对象.init() 的共同点和异同点

在阅读同事的代码时&#xff0c;不同人对对象的初始化方式是不一样的&#xff0c;例如存在一个对象AController, 有些人创建的方式如下&#xff1a; let controller AController()也有人创建的方式如下&#xff1a; let controller AController.init()下面来说明一下&#…...

Google安装JSON-handle扩展

JSON-hande下载地址&#xff1a; JSON-Handle 官网 - 打开json格式文件的浏览编辑器 1. 重命名扩展文件(crx)后缀 为 zip。 2. 解压zip成文件夹&#xff0c;保存到指定目录。 3. Google浏览器地址栏输入 “chrome://extensions/”回车。然后开启 开发者模式。 4. 点击“加载…...

剖析算法内部结构----------贪心算法

什么是贪心算法&#xff1f; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在问题求解过程中&#xff0c;每一步都采取当前状态下最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…...

uni-app开发微信小程序注意事项,不要用element-ui

前端扩展组件千万不要用element-ui&#xff0c;开发的时候不报错&#xff0c;发布的时候会报错无法发布。 可以用vant weapp【注意是weapp】 iView weapp 附上hbuilder官方文档 组件的概念 | uni-app官网 (dcloud.net.cn)...

Hibernate的检索策略(lazy、fetch、batch-size)

Hibernate的检索策略包括立即检索和延迟检索&#xff0c;可以在配置文件中通过对lazy、fetch、batch-size属性的设置来进行控制。一对多、多对多、多对一和一对一关系下的不同检索策略将影响对数据库访问的效率。 检索策略 立即检索&#xff0c;立即加载检索方法指定的对象延…...

算法训练(leetcode)第四十六天 | 110. 字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长

刷题记录 *110. 字符串接龙105. 有向图的完全可达性邻接矩阵邻接表 106. 岛屿的周长深搜简化代码 *110. 字符串接龙 题目地址 使用广搜。 本题相当于求最短路径&#xff0c;因此使用广搜。如何应用广搜是一个难点&#xff0c;因为题目给的是字符串而非图的表示&#xff08;邻…...

自定义Mybatis-Plus分布式ID生成器(解决ID长度超过JavaScript整数安全范围问题)

自定义MyBatis-Plus分布式ID生成器&#xff08;解决ID长度超过JavaScript整数安全范围问题&#xff09; 版本 MyBatis-Plus 3.4.1 问题 MyBatis-Plus 默认生成的是 64bit 长整型&#xff0c;而 JS 的 Number 类型精度最高只有 53bit&#xff0c;如果以 Long 类型 ID 和前端…...

2024剪辑神器盘点:四大热门剪辑软件推荐!

亲爱的朋友们&#xff0c;想要制作出精彩短视频&#xff0c;却苦于找不到合适的剪辑工具&#xff1f;别担心&#xff0c;今天要向大家推荐几款剪辑软件&#xff0c;它们能帮助大家更好地完成视频创作&#xff01; 福昕视频剪辑 链接&#xff1a;www.pdf365.cn/foxit-clip/ 对…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...