前言:本文主要简单介绍RISC-V指令集,其中参考了浙江大学mooc《计算机组成与设计:RISC-V》和《手把手教你设计CPU——RISC-V处理器》,如果文章中有描述不恰当的地方,欢迎指正。
RISC-V(英文发音为"risk-five")架构主要由美国加州伯克利分校(简称伯克利)的Krste Asanovic教授和Yunsup Lee等开发人员于2010年发明。经过几年的发展,伯克利为RISC-V架构开发了完整的软件工具链以及若干开源的处理器实例(例如Pocket Core和BOOM Core),并且得到了计算机体系结构领域的泰斗David Patterson的大力支持。
与大多数指令集架构相反,RISC-V指令集架构最大的特点就是开放,无论学术机构还是商业组织都可以免费地用于所有需要的设备中,允许任何人设计、制造和销售RISC-V芯片和软件。
指令(又称机器指令):是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
一条指令通常要包括操作码字段和地址码字段两部分:

RISC-V32I基础指令集共定义了32个32位的通用寄存器,分别标记为x0~x31。寄存器x0固定连接到常数0,还有一个额外的用户可见程序计数器pc寄存器,它保存当前指令的地址。32个寄存器的详细功能如下图所示:

根据RISC-V指令的共性,主要将其分为以下6种指令格式:
根据RISC-V指令集之间的共性,其主要可分为以下6种指令格式(R、I、S、B、U、J)。
6种基本指令的格式如下图所示为:

——opcode表示7位指令操作码,用于区分不同的指令;
——funct3表示3位的功能码,funct7表示7位的功能码,用于辅助区分不同种类的指令;
——rs1和rs2表示两个5位的源寄存器;
——rd表示5位的目的寄存器,用于存储指令的运算结果;
——imm表示不同长度的立即数,一般会扩展为32位再进行运算操作;
R型指令是最为常用的运算指令,主要用于寄存器与寄存器之间算术运算操作。如下图所示,具有两个5位的源寄存器地址、一个5位目的寄存器地址、一个7位的funct7功能码、一个3位的funct3功能码和7位的opcode操作码。

如上图R型指令格式所示,通过低7位的opcode(0110011)可以得出指令为R型指令,然后将32位的指令按照R型指令的格式划分相应的区域。由funct3(000)和funct7(0000000)可以得出指令执行add操作。rs1对应x19(10011),rs1对应x10(01010),rd1对应x18(10010),即将寄存器19的值加上寄存器10的值并将其运算结果存放到寄存器18这个地址上。注:RISC-V并无减法指令,可以通过加负数来实现减法,减少了指令集数量,这也符合RISC-V精简的原则。注:x10、x18和x19对应上面的32个通用寄存器。
其他R型指令操作如下图所示:

I 型指令主要用于寄存器与立即数之间算术运算和读存储器操作。如下图所示,具有一个5位的源寄存器地址、一个5位目的寄存器地址、一个12位的imm立即数、一个3位的funct3功能码和7位的opcode操作码。

如上图 I 型指令格式所示,通过低7位的opcode(0010011)可以得出指令为 I 型指令,然后将32位的指令按照I型指令的格式划分相应的区域。由funct3(000)可以得出指令执行addi操作。rs1对应x1(00001),立即数imm(1111_1100_1110 = -50)通过符号位扩展成32位,rd1对应x15(01111),即将寄存器1的值加上立即数(-50)并将其运算结果存放到寄存器15这个地址上。
其他I型指令操作如下图所示: 
S型指令主要用于写存储器的S型指令。如下图所示,具有两个5位的源寄存器地址、一个12位的imm立即数、一个3位的funct3功能码和7位的opcode操作码。

如上图S型指令格式所示,通过低7位的opcode(0100011)可以得出指令为S型指令,然后将32位的指令按照S型指令的格式划分相应的区域。由funct3(010)可以得出指令执行sw操作。rs1对应x2(00001)作为基地址,立即数imm(0000_0000_1000 = 8)通过符号位扩展成32位作为地址偏移量,rs1对应x14(01110)作为,即将寄存器2的值加上立即数(8)的值作为地址,并将此地址的值存入到寄存器14中。
其他S型指令操作如下图所示:

B型指令主要用于分支转移操作的B型指令(属于S型指令的变体,之前也叫SB型指令)。如下图所示,具有两个5位的源寄存器地址、一个12位的imm立即数、一个3位的funct3功能码和7位的opcode操作码。


如上图B型指令格式所示,通过低7位的opcode(1100011)可以得出指令为B型指令,然后将32位的指令按照B型指令的格式划分相应的区域。由funct3(000)可以得出指令执行beq操作。rs1对应x19(10011),rs2对应x10(01010),立即数imm(0000_0000_1000 = 8),即若寄存器x19中的值与寄存器x10的值相等,则跳转到立即数所示的地址中;若不相等则不实行跳转。
其他B型指令操作如下图所示:
U型指令主要用于高20比特位立即数操作的U型指令。如下图所示,具有一个5位的目的寄存器地址、一个20位的imm立即数和7位的opcode操作码。

如上图U型指令格式所示,也是通过低7位的opcode可以得出其指令类型,然后将32位的指令按照相应的型指令的格式划分相应的区域。例如执行lui x10,0x87654指令,即将0x87654存入到x10寄存器中的高20位中,剩余的12位低位补零。
J型指令主要用于直接跳转的J型指令(属于U型指令的变体,之前也叫UJ型指令)。如下图所示,具有一个5位的目的寄存器地址、一个20位的imm立即数和7位的opcode操作码。

如上图U型指令格式所示,也是通过低7位的opcode可以得出其指令类型,然后将32位的指令按照相应的型指令的格式划分相应的区域。jal常用于子函数的调用,例如执行jal ra,FuncName指令,即跳转到要执行的子函数FuncName中,并将当前PC+4的值存入到寄存器rd中,方便执行完子函数后跳回。
若需要更为全面的学习RISC-V的基础知识,推荐浙江大学mooc《计算机组成与设计:RISC-V》,《手把手教你设计CPU——RISC-V处理器》。此外,B站和中国大学MOOC(慕课)等网站也有相应的视频可供学习。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:
我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow
我已经使用Apartment设置了一个Rails5应用程序(1.2.0)和Devise(4.2.0)。由于某些DDNS问题,应用只能在app.myapp.com下访问(请注意子域app)。myapp.com重定向到app.myapp.com。我的用例是每个注册该应用的用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。用户不应限定在其子域内。基本上应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。根据Devise标准,登录页面位于app.myapp.com/users/sign_in。这就是问题开始的
我在关注RyanbatesRailsCast的devise和omniauth(第235集-devise-and-omniauth-revised)。当我尝试使用Twitter登录时,标题中不断出现错误。defself.new_with_session(params,session)ifsession["devise.user_attributes"]new(session["devise.user_attributes"],without_protection:true)do|user|user.attributes=paramsuser.valid?end完整跟踪:C:/Ruby20
我为Devise用户和管理员提供了不同的模型。我也在使用Basecamp风格的子域。除了我需要能够以用户或管理员身份进行身份验证的一些Controller和操作外,一切都运行良好。目前我有authenticate_user!在我的application_controller.rb中设置,对于那些只有管理员才能访问的Controller和操作,我使用skip_before_filter跳过它。不幸的是,我不能简单地指定每个Controller的身份验证要求,因为我仍然需要一些Controller和操作才能被用户或管理员访问。我尝试了一些方法都无济于事。看来,如果我移动authentica
我在我的Rails应用程序中使用设计。我在租户庄园中配置了它,其中帐户/session的范围限定为子域。例如:http://subdomain1.example.com/http://subdomain2.example.com/...这很好用,但我想为“super管理员”添加一个子域,允许这些用户导航到所有其他子域而无需重新验证。这将是这样的:http://admin.example.com/是否可以自定义仅在管理子域上生成的cookie,以便它在所有其他子域上都有效? 最佳答案 Cookie域的定义越不具体,它们的包容性就越大,