ori指令的测试

4.3 验证OpenMIPS实现效果

4.3.1 指令存储器ROM的实现
本节我们验证OpenMIPS是否实现正确,包含:流水线是否正确、ori指令实现是否正确。指令存储器ROM是只读的,接口如图所示:在这里插入图片描述
`include "defines.v"

module inst_rom(

//	input	wire										clk,
	input wire                    ce,
	input wire[`InstAddrBus]			addr,
	output reg[`InstBus]					inst
	
);

	reg[`InstBus]  inst_mem[0:`InstMemNum-1];

	initial $readmemh ( "inst_rom.data", inst_mem );

	always @ (*) begin
		if (ce == `ChipDisable) begin
			inst <= `ZeroWord;
	  end else begin
		  inst <= inst_mem[addr[`InstMemNumLog2+1:2]];
		end
	end

endmodule

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

4.3.2 最小SOPC的实现
为了验证,需要建立一个SOPC,其中仅OpenMIPS、指令存储器ROM,所以是一个最小SOPC。Openmips从指令存储器中读取指令,指令进入OpenMIPS开始执行。最小SOPC的结构如图所示:
`include "defines.v"

module openmips_min_sopc(

	input	wire										clk,
	input wire										rst
	
);

  wire[`InstAddrBus] inst_addr;
  wire[`InstBus] inst;
  wire rom_ce;
 

 openmips openmips0(
		.clk(clk),
		.rst(rst),
	
		.rom_addr_o(inst_addr),
		.rom_data_i(inst),
		.rom_ce_o(rom_ce)
	
	);
	
	inst_rom inst_rom0(
		.addr(inst_addr),
		.inst(inst),
		.ce(rom_ce)	
	);


endmodule

在这里插入图片描述

4.3.3编写测试程序
我们写一段测试程序,并将其存储到指令存储器ROM,这样当最小SOPC开始运行时,会从rom中取出我们的程序,送入OpenMIPS处理器中执行。

测试程序共有四条指令,都是ori指令

	.org 0x0
.global _start
   .set noat
_start:
   ori $1,$0,0x1100        # $1 = $0 | 0x1100 = 0x1100
   ori $2,$0,0x0020        # $2 = $0 | 0x0020 = 0x0020
   ori $3,$0,0xff00        # $3 = $0 | 0xff00 = 0xff00
   ori $4,$0,0xffff        # $4 = $0 | 0xffff = 0xffff


  • 第一条指令将0x1100进行零扩展后与寄存器$0进行逻辑“或”运算,结果保存在寄存器$1中
  • 第二条指令将0x0020进行零扩展后与寄存器$0进行逻辑“或”运算,结果保存在寄存器$2中
  • 第一条指令将0xff00进行零扩展后与寄存器$0进行逻辑“或”运算,结果保存在寄存器$3中
  • 第一条指令将0xffff进行零扩展后与寄存器$0进行逻辑“或”运算,结果保存在寄存器$4中

零扩展的定义:零扩展非常简单,只需要用零来填充大位数操作数的高端各个字节即可。
具体可参考文章:https://blog.csdn.net/yjk13703623757/article/details/78084491

4.3.4建立Test Bench文件
给出最小SOPC运行所需要的时钟信号、复位信号。代码如下:
`include "defines.v"
`timescale 1ns/1ps

module openmips_min_sopc_tb();

  reg     CLOCK_50;
  reg     rst;
  
       
  initial begin
    CLOCK_50 = 1'b0;
    forever #10 CLOCK_50 = ~CLOCK_50;
  end
      
  initial begin
    rst = `RstEnable;
    #195 rst= `RstDisable;
    #1000 $stop;
  end
       
  openmips_min_sopc openmips_min_sopc0(
		.clk(CLOCK_50),
		.rst(rst)	
	);

endmodule
4.3.5 检测实现效果

这里书的部分我看不懂,我个人使用Vivado来运行和测试,会出现一个电路图。我将书上部分截图出来,自己做测试的结果也是同样的电路图
在这里插入图片描述在这里插入图片描述

太累了,嘤嘤嘤早上写一早上代码,还都不会,编程好难,下一篇继续~~大家一起加油!!!!按道理来说,把这节和上一节的代码放在一起建立一个工程就可以观察到流水线的变化了,但是很有可能它不讲道理,跑不起来,如果需要可以私信我我发给你整个工程。。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值