从零开始设计RISC

您所在的位置:网站首页 处理器i711700h3070怎样 从零开始设计RISC

从零开始设计RISC

2024-07-16 16:10| 来源: 网络整理| 查看: 265

系列文章目录

(一)从零开始设计RISC-V处理器——指令系统 (二)从零开始设计RISC-V处理器——单周期处理器的设计 (三)从零开始设计RISC-V处理器——单周期处理器的仿真 (四)从零开始设计RISC-V处理器——ALU的优化 (五)从零开始设计RISC-V处理器——五级流水线之数据通路的设计 (六)从零开始设计RISC-V处理器——五级流水线之控制器的设计 (七)从零开始设计RISC-V处理器——五级流水线之数据冒险 (八)从零开始设计RISC-V处理器——五级流水线之控制冒险 (九)从零开始设计RISC-V处理器——五级流水线之分支计算前移 (十)从零开始设计RISC-V处理器——五级流水线之静态预测

文章目录 系列文章目录前言一、U-type测试二、跳转指令测试三、访存指令测试四、算数运算指令测试五、逻辑运算指令测试六、移位运算指令测试七、小于置一指令测试总结

前言

上一篇文章介绍了单周期CPU的实现,本篇文章进行功能仿真 (目前单周期处理器代码已经更新完成,点击链接直达:基于RISC-V指令集的单周期处理器的设计)

一、U-type测试

包含lui,auipc两条指令。 测试代码如下:

lui x1,0xfffff addi x2,x0,0xff slli x3,x2,4 addi x3,x3,0xf add x4,x3,x1 auipc x5,0xfff

汇编器执行结果如下: 在这里插入图片描述 CPU的仿真波形如下: 在这里插入图片描述

二、跳转指令测试

包含jal,jalr,beq,bne,blt,bge,bltu,bgeu共8条指令。 测试代码如下:

addi x1,x0,1 addi x2,x0,2 jal x31,label1 addi x3,x0,3 label1: addi x4,x0,4 add x5,x2,x2 beq x4,x5,label2 addi x6,x0,6 label2: bne x4,x5,label3 addi x7,x0,7 label3: bne x7,x6,label4 addi x8,x0,8 label4: addi x9,x0,0x30 jalr x10,x9,12 addi x11,x0,11 addi x12,x0,-12 addi x13,x0,-13 blt x13,x12,label5 addi x14,x0,-14 label5: bltu x13,x12,label6 addi x15,x0,-15 label6: bltu x12,x13,label7 addi x16,x0,-16 label7: bge x12,x13,label8 addi x17,x0,-17 label8: bge x1,x2,label9 addi x18,x0,-18 label9: bgeu x12,x13,label10 addi x19,x0,-19 label10: bgeu x13,x12,label11 addi x20,x0,-20 label11: addi x21,x0,-20 addi x22,x0,-20 bge x21,x22,label12 addi x23,x0,-23 label12: addi x24,x0,-24

以上代码在编写的过程中,在跳转指令与跳转目标地址的指令之间都至少插入了一条指令,目的是为了体现跳转与否。

汇编器执行结果如下: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

CPU的仿真波形如下: 在这里插入图片描述 可以看到,在这里,给X7赋值之后后面的指令都没有正常运行。 这是 因为下一条指令是bne x7,x6,label4,由于X6是未知态,所以这条指令无法正确判断。所以我们暂时在寄存器堆模块给32个寄存器赋一个初始值0。 代码修改如下:

`include "define.v" //`define INITIAL module registers( clk, rst_n, W_en, Rs1, Rs2, Rd, Wr_data, Rd_data1, Rd_data2 ); input clk; input rst_n; input W_en; input [4:0]Rs1; input [4:0]Rs2; input [4:0]Rd; input [31:0]Wr_data; output [31:0]Rd_data1; output [31:0]Rd_data2; reg [31:0] regs [31:0]; ///write `ifdef INITIAL always@(posedge clk ) begin if(W_en & (Rd!=0)) regs[Rd]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3