简易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对应的状态如下表所示
STATE | OPCODE |
---|---|
HLT | 3’b000 |
SKZ | 3’b001 |
ADD | 3’b010 |
ANDD | 3’b011 |
XORR | 3’b100 |
LDA | 3’b101 |
STO | 3’b110 |
JMP | 3’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
对应的状态机转换,和图中所示一致