简易RISC-CPU的设计与验证,ModelSim

简易RISC-CPU的设计,使用ModelSim

《Verilog数字系统设计教程》——夏宇闻,简易RISC-CPU的设计,书中内容直接使用ModelSim进行代码的测试

准备工作

首先新建工程File->New->Project,并依次将代码加入到project中Add to Project->Existing File,并执行编译Compile->Compile All:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

之后

在这里插入图片描述

这里注意一点,直接编译其实会报错,因为modelsim把test1.pro和test1.dat认为是verilog文件,进行了编译,所以要修改这两个文件的type为text

在这里插入图片描述

为了执行simulate,可以在Library中直接点击顶层测试文件,即top,进入simulate窗口

在这里插入图片描述

依次将需要观察的波形,加入到Wave中,之后直接运行,可以通过直接输入run -all进行仿真。(注:这里的Transcript也可以输入pwd命令查看当前路径,以及cd等命令),在这里还要注意,需要修改一下top.v的里面读取文件的路径,如$readmemb(“test1.pro”, u_rom.rom);如果直接用$readmemb(“…/test1.pro”, u_rom.rom);会找不到数据

在这里插入图片描述

top.v文件中写了3个$stop,分别是查看三个不同测试数据的数据。

在这里插入图片描述

不同opcode对应的状态如下表所示

STATEOPCODE
HLT3’b000
SKZ3’b001
ADD3’b010
ANDD3’b011
XORR3’b100
LDA3’b101
STO3’b110
JMP3’b111

仿真中使用的xxx.pro文件和xxx.data文件在联合仿真时要放到simulation文件夹下才能成功加载

$readmemb ( “test1.pro”,t_rom_.memory ); 和 $readmemb ( “test1.dat”,t_ram_.ram);

两个语句可以把编译好的汇编机器码装入虚拟ROM,把需要参加运算的数据装入虚拟RAM就可以开始仿真。

上面语句中的第一项为打开的文件名,后一项为系统层次管理下的ROM和RAM模块中的存储器memory和ram.下面为测试设计功能所需要的机器码的数据文件。

若直接用modelsim打开工程时,File->Open->选择.mpf文件

测试结果与分析

主要看的是波形图和state是否一一对应,通过代码可知,在状态state位S5,S6,S7的时候,分支最多,因此主要观察这三个状态在波形图中的表现。对于其他状态的观察与分析,只将极个别的opcode进行验证。

直接输入run -all进行simulate首先是名为test1的task,他读取了test1.pro以及test1.data,transcript输出结果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

HLT,3’b000

周期1:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0100

周期2:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_1100

周期3:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0000_0000

周期4:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0000_1010

周期5:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0000_0000

周期6:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0000_0000

周期7:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0000_0000

在这里插入图片描述

S1,S2,S3,S4

在这里插入图片描述

S5,S6,S7全0

在这里插入图片描述

SKZ,3’b001

SKZ,3‘b001波形图,所有数据都是在clk的上升沿去观察的,最下面的cstate是对应的8个周期,从wr到data_ctrl_ena的数据以第一个周期为例子。在波形图上为01000100,对应的代码如下,通过位连接操作符,直接对8个变量进行非阻塞性赋值。可以发现是一一对应的。

在这里插入图片描述

在这里插入图片描述

ADD,3’b010

周期5:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0000

周期6:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0110_0000

周期7:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0000

在这里插入图片描述
=在这里插入图片描述

ANDD,3’b011

周期5:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0000

周期6:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0110_0000

周期7:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0000

在这里插入图片描述

在这里插入图片描述

XORR,3’b100

周期5:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0000

周期6:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0110_0000

周期7:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0000

在这里插入图片描述

在这里插入图片描述

LDA,3’b101

周期5:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0000

周期6:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0110_0000

周期7:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0000

在这里插入图片描述

在这里插入图片描述

STO,3’b110

周期5:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0000_0001

周期6:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b1000_0001

周期7:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0000_0001

在这里插入图片描述

在这里插入图片描述

JMP,3’b111

周期1:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_0100

周期2:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0100_1100

周期5:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0001_0000

周期6:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0001_1000

周期7:{wr,rd,load_acc,load_pc , incr_pc,load_ir,halt,datactrl_ena} = 8’b0000_0000

在这里插入图片描述

对应的状态机转换,和图中所示一致

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值