[VexRiscv]实现一些简单指令
来源:芯工阿文 发布时间:2022-02-12 分享至微信

前一文章讲述了译码逻辑的实现方式,代码没有具体描述任何一条指令。通过构建转换架构,底层与硬件逻辑交互使用的是基于Masked描述的映射关系,使用输入指令与数组内的Masked进行比较匹配,再索引相关的译码输出信号,具体的硬件逻辑通过调用object Symplify实现。

该代码架构的上层,则是提供了基于add、addDefault函数方法的接口,可添加指令和相关译码信号的默认值。本文通过几个例子,讲讲VexRiscv是如何实现指令添加的,添加之后,又是如何基于译码信号进行执行的,最后看看是如何添加自定义指令的。


涉及到的代码如下:

vexriscv/plugin/IntAluPlugin.scala

vexriscv/plugin/RegFilePlugin.scala

vexriscv/plugin/ShiftPlugin.scala

vexriscv/plugin/SrcPlugin.scala

vexriscv/plugin/CustomInstruction.scala


01

IntAluPlugin



该代码实现了一些非常简单的指令,包括加减法、比较、逻辑运算等操作。如下为添加指令的代码,调用了DecoderSimplePlugin提供的add函数方法。由于需同时添加多个指令,使用了List列表。



在列表内,每一行表示一条指令,第一个'->'符号左侧为待添加指令,如ADD/SUB,实际上是定义为MaskedLiteral类型的变量(使用函数定义的);如前文所述,'->'符号右侧为译码输出信号列表及其对应的值,该列表内仅需添加该指令需关注的值,无需将所有译码信号囊括在内。

再关注图中的nonImmediateActions、immediateActions信号,实际上是前面统一定义的信号列表,同样是译码信号及其对应的译码输出值,如下所示。



至此,已经为译码模块添加了多条指令,如下以ADD指令为例,看一下加入了哪些译码输出信号。实际上,译码信号可基于指令做一些自定义,并没有统一的译码输出信号规则,只需要基于Stageable定义信号。


- SRC1_CTRL/SRC2_CTRL信号描述指令操作数的源头,其信号值是以枚举类型Enum描述的,RS表示来自寄存器RegFile,也即ADD指令内rs1和rs2域段。


- REGFILE_WRITE_VALID表示指令结果需写回寄存器,指令的rd域段是有效的。
- BYPASSABLE_xxx,在指定的流水线内,该指令结果已经是有效的,用于处理Hazard相关的逻辑。
- RS1_USE/RS2_USE,描述是否需使用rs1/rs2域段的值。
- ALU_CTRL,描述ALU执行的操作类型,同样是使用Enum枚举类型描述,ADD_SUB指示当前指令需实现加减法操作。
- SRC_USE_SUB_LESS,指示当前操作需实现减法还是加法,如下为False,指示当前需实现加法。



完成指令添加后,就是如何实现指令的动作,也即是EXCUTE,相关代码如下所示。excute plug表示在excute阶段插入逻辑代码;然后是生成AND/OR/XOR的运算结果bitwise;最后是生成REGFILE_WRITE_DATA信号,此处使用了srcPlugin的计算结果,基于input获得其信号值。该位置使用了其余plugin的信号,如操作数、比较结果和加减结果,看起来非常简洁,但实现的指令数还挺多的。

这里使用到了stage的input,output和insert方法。其中insert方法表示首次添加该信号,并对其进行赋值;input方法为当时流水线需使用该信号,该信号可能是其余流水线添加的,或者是当前流水线添加的;output方法是对insert之后的信号进行修改,因此必须附带when条件。



注意到逻辑运算的操作数SRC1和SRC2,比较指令的结果和加减法的结果,均是基于input方法获得的,其实这几个信号均是在SrcPlugin加入的。


02

SrcPlugin



该代码基于操作数实现了一些简单运算,如比较、加减法等等,还有操作数的生成,用于其余指令的执行阶段。

如下代码用于生成SRC1和SRC2操作数,有译码信号SRC1_CTRL、SRC2_CTRL控制生成操作数。


然后是基于SRC1和SRC2两个操作数,做加减法运算和比较运算,代码都比较简单,使用insert方法将结果加入流水线。



这两个位置就可以体现一些配置化的特性了,关注上两个图中的第一行代码,分别基于executeInsertion和decodeAddSub定义insertionStage和addSubStage,也就是说仅仅基于这两个参数,就可以轻易地将‘{}’内的代码挪到另外一个流水线内。如果在excute阶段的时序比较紧张,而decode阶段时间还有余量,可以简单修改配置,将excute阶段的部分逻辑挪至decode阶段。设想一下,如果通过Verilog实现,该修改多少代码?是否还能够做到如此简单的配置?


03

RegFilePlugin



在SrcPlugin代码内,操作数的生成,使用了RS1和RS2两个信号,实际上是基于指令内的rs1和rs2读取寄存器获得的,相关代码在RegFilePlugin。该Plugin实现了对寄存器的读取和写回,同样可以做一些配置。

在这里可以关注一下寄存器写回的代码,如下所示,核心代码就是如下标注的3行,基于译码输出信号生成写入信号,读取指令的rd域段作为写入地址,写入数据为REGFILE_WRITE_DATA,是否看起来非常简洁?后续几行代码都是对x0寄存器的特殊处理。



04

ShiftPlugin



再来看一下移位指令的实现,完全相同的套路,定义译码输出信号列表,使用add方法添加指令。


然后是excute和生成写回数据,其中生成写回数据可基于配置做一些调整。将操作数的高低位进行反转,左移操作可变为右移操作进行处理。



05

自定义指令



最后看一下如何实现自定义指令,demo目录提供了示例代码。添加的指令为SIMD_ADD,32bit操作数分为4个8bit的数据,分别进行加法运算。


添加指令及其相关的译码输出信号。


执行指令内容,基于Stage的input/output两个方法,指令执行相关的代码变得非常简单。


该自定义指令比较简单,但基本说明清楚该如何添加自定义指令。如有兴趣,可关注plugin目录下的AesPlugin.scala,提供了用于加速AES加解密的自定义指令,可在21个cycles完成一次AES round。

icspec【芯片求购】https://www.icspec.com/inquiry/index/1/0
[ 新闻来源:芯工阿文,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!

[VexRiscv]译码逻辑DecoderSimplePlugin
[PCIe]接口与系统配合
[VexRiscv]入门
查看更多
icspec【芯片求购】
https://www.icspec.com/inquiry/index/1/0
icspec【规格书】
https://www.icspec.com/
相关文章
汇总嵌入式中一些实用的辅助工具!
2024-04-01
Android阵营助力,中国台湾手机一季度出货量实现增长
2024-04-24
碁明半导体:一期项目已实现年产24亿颗芯片
2024-04-25
钻石芯片,首次实现
2024-03-28
快速实现器件布局
6 天前
热门搜索

代做工资流水公司青岛银行流水电子版多少钱咸阳代办工资流水单揭阳企业银行流水唐山工资流水图片揭阳办购房银行流水包头做背调工资流水嘉兴银行流水账衡阳银行流水修改新乡背调银行流水开具惠州背调银行流水代办淄博签证流水代办潮州企业银行流水打印潮州代做收入证明信阳贷款银行流水代办南宁个人流水代开常德背调银行流水公司北京工资银行流水代开镇江做收入证明新乡房贷工资流水 费用潍坊查询企业银行流水湘潭银行流水单打印南通打银行流水南通对公流水多少钱衡阳银行流水PS制作福州车贷流水价格盐城查流水单包头办理流水账单洛阳对公流水公司合肥工作收入证明模板常德日常消费流水代开香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化