首页 > 其他分享 >RISC-V学习1.0

RISC-V学习1.0

时间:2023-08-30 13:22:05浏览次数:43  
标签:wire 1.0 op1 op2 RISC 学习 funct3 result ALU

Membership – RISC-V International (riscv.org)

 

RISC-V China – RISC-V International (riscv.org)

tommythorn/yarvi: Yet Another RISC-V Implementation (github.com)

alu.v

// -----------------------------------------------------------------------
//
// A purely combinatorial RV32I ALU (assumes predecoded steering)
//
// ISC License
//
// Copyright (C) 2014 - 2022  Tommy Thorn <tommy-github2@thorn.ws>
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
// -----------------------------------------------------------------------

/* The width comparisons in Verilator are completely broken. */
/* verilator lint_off WIDTH */

`define ADDSUB          0
`define SLL             1
`define SLT             2
`define SLTU            3
`define XOR             4
`define SR_             5
`define OR              6
`define AND             7

/* The function selector of the ALU is kept close to the RISC-V ISA,
   but it assumes a lot of instructions translate their opcodes into
   the ALU appropriate ones and feed the ALU with the relevant operands.

   Further improvement possible:
   - multi-cycle shifter (eg. migrate shifter out of this ALU)
*/

`default_nettype none

module alu(sub, ashr, funct3, w, op1, op2, result, eq, lt, ltu);
   parameter XLEN = 64;
   parameter XMSB = XLEN-1;
   parameter X2MSB = ($clog2(XLEN)-1);

   input  wire           sub;
   input  wire           ashr;
   input  wire [    2:0] funct3;
   input  wire           w;
   input  wire [XMSB:0]  op1;
   input  wire [XMSB:0]  op2;
   output reg  [XMSB:0]  result;
   output wire           eq;
   output wire           lt;
   output wire           ltu;

   // sum = op1 + op2 or op1 - op2
   wire [XLEN:0]         sum = op1 + ({XLEN{sub}} ^ op2) + sub;
   wire                  s   = sum[XMSB];
   wire                  c   = sum[XLEN];
   wire                  v   = op1[XMSB] == !op2[XMSB] && op1[XMSB] != s;

   assign                eq  = op1 == op2;
   assign                lt  = s ^ v;
   assign                ltu = !c;

always @(*) begin
   case (funct3)
     `SLT:    result = {{XMSB{1'd0}}, lt}; // $signed(op1) < $signed(op2)
     `SLTU:   result = {{XMSB{1'd0}}, ltu}; // op1 < op2

`ifndef NO_SHIFTS
     `SR_:    if (XLEN != 32 && w)
                result = $signed({op1[31] & ashr, op1[31:0]}) >>> op2[4:0];
              else
                result = $signed({op1[XMSB] & ashr, op1}) >>> op2[X2MSB:0];
     `SLL:    result = op1 << op2[X2MSB:0];
`endif

     `AND:    result = op1 & op2;
     `OR:     result = op1 | op2;
     `XOR:    result = op1 ^ op2;
     default: result = 'hX;
   endcase

   if (funct3 == `ADDSUB)
     result = sum[XMSB:0];

   if (XLEN != 32 && w) result = {{XLEN/2{result[XLEN/2-1]}}, result[XLEN/2-1:0]};
   end
endmodule

代码定义了一个Verilog中的算术逻辑单元(ALU)模块。ALU基于控制信号和输入操作数执行各种操作。

ALU模块有以下输入:

- "sub":表示减法操作的控制信号。
- "ashr":表示算术右移操作的控制信号。
- "funct3":表示ALU执行的功能的3位控制信号。
- "w":表示ALU是否应该对32位或64位数字进行操作的控制信号。
- "op1":ALU操作的第一个操作数。
- "op2":ALU操作的第二个操作数。

ALU模块有以下输出:

- "result":ALU操作的结果。
- "eq":指示操作数是否相等的信号。
- "lt":指示第一个操作数是否小于第二个操作数(有符号比较)的信号。
- "ltu":指示第一个操作数是否小于第二个操作数(无符号比较)的信号。

ALU模块根据"funct3"控制信号支持以下操作:

- ADD/SUB("funct3 = 0"):根据"sub"控制信号执行加法或减法。
- SLL("funct3 = 1"):执行逻辑左移操作。
- SLT("funct3 = 2"):执行有符号小于比较。
- SLTU("funct3 = 3"):执行无符号小于比较。
- XOR("funct3 = 4"):执行按位异或操作。
- SR("funct3 = 5"):根据"ashr"控制信号执行逻辑或算术右移操作。
- OR("funct3 = 6"):执行按位或操作。
- AND("funct3 = 7"):执行按位与操作。

在"always @(*)"块中使用case语句显示了每个操作的实现。操作的结果被赋值给"result"输出线。

ALU还执行附加操作,如计算进位("c"),有符号位("s")和溢出("v")。

在模块的结尾,如果"funct3"控制信号设置为"ADDSUB"(0),则根据"sub"控制信号将"result"更新为操作数的和或差。

最后,对字大小"w"进行检查,以确定结果是否应该截断为32位。结果分配给"result"输出线。

该ALU模块支持各种算术和逻辑操作,并根据控制信号和操作数提供比较结果和结果。

ridecore/ridecore: RIDECORE (RIsc-v Dynamic Execution CORE) is an Out-of-Order RISC-V processor written in Verilog HDL. (github.com)

Dmitriy0111/nanoFOX: A small RISC-V core (SystemVerilog) (github.com)

T-head-Semi/wujian100_open: IC design and development should be faster,simpler and more reliable (github.com)

picorio / picorio-doc · GitLab

标签:wire,1.0,op1,op2,RISC,学习,funct3,result,ALU
From: https://www.cnblogs.com/shiningleo007/p/17666963.html

相关文章

  • 分布式深度学习技术概述
    分布式深度学习技术有哪些?分布式深度学习技术是指将深度学习模型的训练过程分布在多个计算资源上进行加速的技术。这样可以充分利用集群中的多个GPU、CPU或者多台计算机,加快深度学习模型的训练过程,提高训练效率。以下是一些常见的分布式深度学习技术:数据并行:将训练数据划分成......
  • linux命令学习笔记
    sudo+命令:以超级用户模式执行命令sudo-i:切换到超级用户模式,exit退出cd+路径:切换目录ls:当前路径文件列表ls+路径:指定路径文件列表mkdir+名称:新建文件夹chmod[-R]权限值文件名:修改权限(http://c.biancheng.net/view/755.html)tar-cfa.tarbc:把b和c打包成a.tarta......
  • mysql学习教程篇(三)
    一、分组查询#进阶5:分组查询/*语法:select查询列表from表【where筛选条件】groupby分组的字段【orderby排序的字段】;特点:1、和分组函数一同查询的字段必须是groupby后出现的字段2、筛选分为两类:分组前筛选和分组后筛选 针对的表 位置 连接的关键字分......
  • mysql学习教程篇(二)——基础查询和条件查询
    1.基础查询#进阶1:基础查询/*语法:select查询列表from表名;类似于:System.out.println(打印东西);特点:1、查询列表可以是:表中的字段、常量值、表达式、函数2、查询的结果是一个虚拟的表格*/USEmyemployees;#1.查询表中的单个字段SELECTlast_nameFROMemploy......
  • 软件测试学习笔记
    黑马程序员学习路线。最多的还是点点点,但是要了解。 给你一个前端包,会不会放在linux服务器上?给一个后端包,会不会放在Linux服务器上?连数据库。服务器。脚踏实地。一步一步做。去年十一,分了项目做。培训机构,从早到晚做的就是一件事情。多做熟悉。      sel......
  • STM32学习笔记:分散加载
    分散加载是提高单片机上限的一个非常重要的能力。以STM32H7为例,H7的RAM为:512KbytesofAXI-SRAMmappedontoAXIbusonD1domain,SRAM1mappedonD2domain:128Kbytes,SRAM2mappedonD2domain:128Kbytes,SRAM3mappedonD2domain:32Kbytes,SRAM4mappedonD3dom......
  • 从入门到掌握 - 系统学习shell语言
    简介什么是shellShell是一种程序或命令行解释程序,用于解释用户直接输入的用户命令或从文件中读取的用户命令,然后将它们传递给操作系统以进行操作或处理。要注意,这个过程是解释而不编译脚本,因为计算机系统会解释它们,并且无需按执行顺序编译Shell脚本。KenThompson的sh是......
  • 提示学习方法-AI基础系列文章第15篇
            使用生成式AI解决问题的学习提示法是一个在生成式AI领域解决问题的框架。它可以帮助你决定生成式AI是否是正确的解决方案,如何应用提示工程,选择什么工具等等。我们将逐一介绍这五个步骤,然后提供一个使用这种方法的案例研究。五个步骤陈述你的问题学习提示法的第一步......
  • java学习笔记之String类
    javaString类位置packagejava.lang;直接使用,无需导入常用方法length获取字符串长度示例:Strings1="abc";System.out.println("字符串的长度为:"+s1.length());>>>字符串的长度为:3isEmpty字符串是否为空字符串示例:Strings1="abc";System.out.println......
  • nodejs一些学习笔记记录
    模块一个文件就是一个模块引入模块Node.js提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。varhello=require('./hello');模块编写的形式常规写法exports.world=function(){......