ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ori指令的测试

2022-01-09 13:58:13  阅读:304  来源: 互联网

标签:wire rom 寄存器 指令 inst 测试 ori rst


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来运行和测试,会出现一个电路图。我将书上部分截图出来,自己做测试的结果也是同样的电路图
在这里插入图片描述在这里插入图片描述

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

标签:wire,rom,寄存器,指令,inst,测试,ori,rst
来源: https://blog.csdn.net/dieyouxiu/article/details/122392658

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有