系列文章目录

(一)从零开始设计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 INITIALalways@(posedge clk )beginif(W_en & (Rd!=0))regs[Rd]<=Wr_data; end
`else      always@(posedge clk )beginif(!rst_n)beginregs[0]<=`zero_word;regs[1]<=`zero_word;regs[2]<=`zero_word;regs[3]<=`zero_word;regs[4]<=`zero_word;regs[5]<=`zero_word;regs[6]<=`zero_word;regs[7]<=`zero_word;regs[8]<=`zero_word;regs[9]<=`zero_word;regs[10]<=`zero_word;regs[11]<=`zero_word;regs[12]<=`zero_word;regs[13]<=`zero_word;regs[14]<=`zero_word;regs[15]<=`zero_word;regs[16]<=`zero_word;regs[17]<=`zero_word;regs[18]<=`zero_word;regs[19]<=`zero_word;regs[20]<=`zero_word;regs[21]<=`zero_word;regs[22]<=`zero_word;regs[23]<=`zero_word;regs[24]<=`zero_word;regs[25]<=`zero_word;regs[26]<=`zero_word;regs[27]<=`zero_word;regs[28]<=`zero_word;regs[29]<=`zero_word;regs[30]<=`zero_word;regs[31]<=`zero_word;endelse if(W_en & (Rd!=0))regs[Rd]<=Wr_data;   end
`endif
//readassign Rd_data1=(Rs1==5'd0)?`zero_word: regs[Rs1];assign Rd_data2=(Rs2==5'd0)?`zero_word: regs[Rs2];endmodule

注意:此处由于仿真时寄存器的值是未知态,所以需要对寄存器赋初始值。在实际的设计中,这里是不需要进行赋初值的,因为CPU上电之后都会执行一段初始化代码。在FPGA开发板中,也是不需要赋初值的,因为FPGA开发板内部的寄存器上电会自动置零。

更改后的仿真波形如下:

三、访存指令测试

包含lb,lh,lw,lbu,lhu,sb,sh,sw共8条指令。
测试代码如下:

addi x1,x0,0x70
slli x2,x1,8
addi x1,x0,0x71
add x2,x2,x1
slli x2,x2,8
addi x1,x0,0xf2
add x2,x2,x1
slli x2,x2,8
addi x1,x0,0xf3
add x2,x2,x1
sw x2,0,x0
sh x2,4,x0
sb x2,7,x0
lb x3,0,x0
lb x4,1,x0
lb x5,2,x0
lb x6,3,x0
lbu x7,0,x0
lbu x8,1,x0
lbu x9,2,x0
lbu x10,3,x0
lh x11,0,x0
lh x12,2,x0
lh x13,4,x0
lhu x14,0,x0
lhu x15,2,x0
lhu x16,4,x0
lw x17,0,x0

汇编器执行结果如下:
寄存器堆:

数据存储器:

CPU的仿真波形如下:


四、算数运算指令测试

包含add,sub,addi共3条指令。
测试代码如下:

addi x1,x0,1
add x2,x1,x1
add x3,x2,x2
sub x3,x3,x1addi x4,x0,-4
add x5,x4,x4
sub x6,x5,x3
sub x7,x6,x4
add x8,x7,x3

汇编器执行结果如下:

CPU的仿真波形如下:

五、逻辑运算指令测试

包含and,or,xor,andi,ori,xori六条指令。
测试代码如下:

addi x1,x0,0b00110011
addi x2,x0,0b11111100
and x3,x1,x2
or x4,x1,x2
xor x5,x1,x2
andi x6,x1,0b11111100
ori x7,x1,0b11111100
xori x8,x1,0b11111100

汇编器执行结果如下:

CPU的仿真波形如下:

六、移位运算指令测试

包含sll,srl,sra,slli,srli,srai六条指令。
测试代码如下:

addi x1,x0,0xff
addi x2,x0,4
sll x3,x1,x2
srl x4,x1,x2
sra x5,x1,x2addi x6,x0,-0xff
sll x7,x6,x2
srl x8,x6,x2
sra x9,x6,x2slli x11,x1,4
srli x12,x1,4
srai x13,x1,4slli x11,x6,4
srli x12,x6,4
srai x13,x6,4

汇编器执行结果如下:

CPU的仿真波形如下:

七、小于置一指令测试

包含slt,stlu,slti,sltiu四条指令。
测试代码如下:

addi x1,x0,-1
addi x2,x0,-2
addi x3,x0,3
addi x4,x0,4
slt x5,x1,x2
slt x6,x2,x1
slt x7,x3,x4
slt x8,x4,x3
sltu x9,x1,x3
sltu x10,x3,x1
sltu x11,x1,x2
slti x12,x3,-3
slti x13,x3,4
slti x14,x2,-1
slti x15,x2,-4
sltiu x16,x3,-3
sltiu x17,x3,4
sltiu x18,x2,-1
sltiu x19,x2,-4

汇编器执行结果如下:

CPU的仿真波形如下:

总结

以上就是今天的内容,对37条指令进行逐条仿真,在设计仿真的指令时要注意测试的完备性,比如正数的加减法,负数的加减法,正数与负数的加减法,溢出检测,进位检测等。 下一篇文章开始对处理器进一步优化。

从零开始设计RISC-V处理器——单周期处理器的仿真相关推荐

  1. 从零开始设计RISC-V处理器——单周期处理器的设计

    系列文章目录 (一)从零开始设计RISC-V处理器--指令系统 (二)从零开始设计RISC-V处理器--单周期处理器的设计 (三)从零开始设计RISC-V处理器--单周期处理器的仿真 (四)从零开始设 ...

  2. 基于 RICS-V 架构的单周期处理器设计(含所有格式指令)—— 逻辑部件概述

    文章目录 一.概述 二.原理图 2.1 ALU 2.1.1 ALU 操作控制信号生成部件 2.1.2 ALU 逻辑计算部件 2.1.3 ALU 整体逻辑 2.2 寄存器 2.2.1 Reg 整体逻辑 ...

  3. 基于RICS-V的单周期处理器设计

    基于RICS-V的单周期处理器设计 文章目录 基于RICS-V的单周期处理器设计 1.概述 2.原理图 3.各个模块 3.1.ALU 3.2.立即数扩展器 3.3.取指令器 3.4.译码器 3.5.寄 ...

  4. 基于 RICS-V 架构的单周期处理器设计(含所有格式指令)—— 控制信号选取及代码结构分析

    文章目录 一.概述 二.设计过程 2.1 选取指令 2.2 指令功能简述 2.3 设计过程概述 2.4 扩展码取值 2.5 三种 ALU 操作信号 2.5.1 操作信号取值 2.5.1 操作信号编码 ...

  5. 【计组实验】P2 Modelsim Verilog单周期处理器开发 MIPS指令集

    一点心得: 如果遇到不会的题,可以看着别人的代码,比着抄一遍(不要直接复制粘贴),抄的同时尽量理解每句代码的含义.如果看不懂某句代码,(觉得这句没有用),可以跳过这句不写,按照自己的思路继续. 如果之 ...

  6. 【计组实验】P1 logisim完成单周期处理器开发 MIPS指令集

    参考教材:<计算机组成与设计 硬件/软件接口 原书第五版>第二章 第四章 ↑ 这本书写的特别好,零基础也可以看 实验报告 链接: https://pan.baidu.com/s/19YQA ...

  7. 基于 RICS-V 架构的单周期 38 条指令处理器设计(含源码及实验报告)

    一.概述   之前有专门的写过两篇博文来介绍基于 RICS-V 架构的单周期九条指令处理器设计,并提供了相关的代码结构介绍,之后我又对其进行了拓展,且修补了之前源码中存在的一些小问题,并将指令集从九条 ...

  8. 吃透Chisel语言.39.Chisel实战之单周期RISC-V处理器实现(上)——需求分析和初步设计

    Chisel实战之单周期RISC-V处理器实现(上)--需求分析和初步设计 需求分析 首先明确我们要做的是什么,这个在标题里面已经说明了,我们要做的是一个单周期RISC-V处理器. 但光是个短语不足以 ...

  9. 【计组实验】P3 Verilog多周期处理器开发 MIPS指令集

    全部代码+测试指令: 链接:CPUMultiCycle p3正确运行_百度网盘 提取码:gmzb (实验P1P2)Logisim电路图以及Verilog单周期处理器设计,见以下博客: [计算机组成原理 ...

  10. 计算机原理与结构 实验3《单周期微处理器设计》

    实验3<单周期微处理器设计> 一.实验目的 掌握:如何采用Verilog设计时序逻辑电路: 掌握:利用Quartus II 设计CPU的基本原理核方法: 掌握:指令系统的设计与实现方法. ...

最新文章

  1. android 自定义listpreference,java-Android,单击ListPreference项时显示对话框
  2. React.js入门笔记
  3. SQL Server 下的 获取当月最后一天
  4. Linux Graphic DRI 显示子系统 介绍1
  5. 中国发电机行业应用前景与投资策略分析报告2022版
  6. 下载cx oracle 6,在Centos 6上安装cx_Oracle
  7. bash: test1: command not found
  8. 45本Hadoop、大数据方向书籍,包邮送到家!
  9. 一个很好的String组合连接的方法(StringBuffer)
  10. Android相机开发实战
  11. 常见的直流稳压电源电容有哪些?及其详细介绍
  12. linux hping3命令,hping3命令 – 测试网络及主机的安全
  13. 企业市场推广之网络营销运营策略探讨
  14. 互联网保险投诉量翻倍 众安与安心财险上榜
  15. 北京航空航天大学夏令营机试题
  16. 阿里巴巴B2B电商算法首次对外公开
  17. 特征工程——推荐系统里的特征工程
  18. 智能工厂方案与设备选型
  19. ERD Online 4.1.0对接ChatGPT,实现AI建模、SQL自由
  20. 2012年4月10日 周二

热门文章

  1. 计算机键盘按不动怎么办,电脑键盘上档键怎么失灵
  2. CLUSTERDOWN Hash slot not served 记录一次线上redis插槽问题
  3. mac 输入法/键盘 锁定
  4. word整个表格首行缩进_WORD取消表格首行缩进
  5. Docker - 基于NVIDIA-Docker的Caffe-GPU环境搭建
  6. iOS 最新AppStore申请加急审核 以及 apple联系方式大全
  7. vss服务器状态失败_Exchange快照错误,询问写入器状态失败
  8. 2022年全球及中国MICC电缆行业运行战略规划与未来投资策略分析报告
  9. 【机器学习】层次聚类-Agglomerative clustering
  10. 图片转化成矩阵,灰度处理,黑白对调--ByMatlab