IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【自己动手写CPU】about how to deal with bugs -> 正文阅读

[C++知识库]【自己动手写CPU】about how to deal with bugs

bug是第十章,写协处理器访问指令时出来的。当然每一章都会产生bugs
汇编测试代码如下:

     .org 0x0
   .set noat
   .set noreorder
   .set nomacro
   .global _start
_start:
   ori $1,$0,0xf
   mtc0 $1,$11,0x0  #写compare寄存器,开始计时 $11=0xf
   lui $1,0x1000 # $116位填0x1000
   ori $1,$1,0x401
   mtc0 $1,$12,0x0  #将0x401写入status寄存器
   mfc0 $2,$12,0x0  #读status寄存器,$2=0x401

_loop:
   j _loop
   nop

$1寄存器的值0xf->0x10000000->0x10000401

第一次仿真

在这里插入图片描述只有reg1即$1是正确的
Status是错的
Count也是正确的
Comapre是错误的
timer_int_o也是错误的
Status、Compare是错的 可能直接原因就是cp0_reg.v错了

`CP0_REG_COMPARE:begin
					compare_o <= data_i;//写Compare寄存器
					timer_int_o <= `InterruputNotAssert;//这是改Bug时加上的这一行
				end 

写Compare寄存器时少加了中断
修改后结果还是错的 说明错的不止这一个地方
在这里插入图片描述

加入reg2

在这里插入图片描述
reg2也是错的 ,说明mtc0是错的
接下来查找mct0错在哪里

mem.v模块增加的操作

//将对CP0寄存器中信息传递到流水线下一级
	cp0_reg_we_o <= cp0_reg_we_i;
	cp0_reg_write_addr_o <= cp0_reg_write_addr_i;
	cp0_reg_data_o <= cp0_reg_data_i;
	case(aluop_i)//访存阶段要执行运算的子类型

在这里插入图片描述
在这里插入图片描述对mem模块进行仿真,mem模块值是错的
现在是5.22号,pass掉了stupid的5.20 5.21真好,之前发现是mem模块里面定义某个信号的位宽时错了,当时晚了,就很快改了一下,也没有记录下来,不过就是MEM模块的错误,ex模块是没有问题的。

ex.v模块

在这里插入图片描述

`define EXE_MFC0_OP 8'b01011101
`define EXE_MTC0_OP 8'b01100000

inst_rom.data

3401000f
40815800
3c011000
34210401
40816000
40026000
08000006
00000000

id.v

	if(inst_i[31:21]==11'b010_0000_0000&&inst_i[10:0]==11'b000_0000_0000)//mfc0指令
			begin
				aluop_o <= `EXE_MFC0_OP;
				alusel_o <= `EXE_RES_MOVE;//一种移动运算
				wd_o <= inst_i[20:16];//rt 要写的目的寄存器是指令中rt的值
				wreg_o <= `WriteEnable;//需要读取CP0中的寄存器的值写入目的寄存器,要写通用寄存器
				instvalid <= `InstValid;
				reg1_read_o <= 1'b0;
				reg2_read_o <= 1'b0;
			end else if(inst_i[31:21]==11'b010_0000_0100&&inst_i[10:0]==11'b00000000000)//mtc0指令
			begin
				aluop_o <= `EXE_MTHI_OP;
				alusel_o <= `EXE_RES_MOVE;
				wreg_o <= `WriteDisable;//不需要写通用寄存器
				instvalid <= `InstValid;
				reg1_read_o <= 1'b1;//需要读取通用寄存器 通过Regfile1端口读取数据
				reg1_addr_o <= inst_i[20:16];//读取地址是指令中16-20位 是rt的值
				reg2_read_o <= 1'b0;
			end 
	end //if

改: aluop_o <= `EXE_MTC0_OP

5.22的突然发现很幼稚的致命Bug…

摆烂还是有好处的,隔了几天没改bug,玩了很久,脑子就清醒了,发现改了一大部分之后,只有中断部分是错的,而中断只有cp0模块才有,当Compare寄存器的值和Count寄存器的值相等时,就等于1了,就开启中断了。后来发现果然是中断的宏定义少了个Not。下图就是改了之后的。就是把Not去掉了。

在这里插入图片描述

最终结果

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-27 17:12:03  更:2022-05-27 17:13:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/14 4:29:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码