计组实验测试指令

bne指令测试

添加BNE指令,


这是最开始原始指令结果


然后添加测试文件


可以看到指令这次成功的实现了跳转!!

文件名。。。是.dat的后缀
然后



显然是没有成功的
为什么呢?

因为BNE需要一个比较的零信号, 然后我就忘记添加了

看一下仿真的波形和寄存器的值吧

在这之前需要添加测试的文件


通过Mars 去dump一个十六进制的指令文件

我不是特别清楚修改了源文件之后是不是需要重新编译, 不过最好还是退出仿真然后重新编译吧。

然后我们添加测试的信号
由于是跳转指令, 就看一下控制信号和PC NPC这几个信号吧


修改成十六进制方便查看

然后我们看到在PC = 18的时候bne的控制信号为1
这时候发生跳转, NPC的值被置为44

在transscript的输出窗口也可以看到PC的变化

jr指令实现

jr指令是R类型的指令, 实现读取寄存器的值然后进行跳转。

调用了一条jal指令, 返回地址被压入了 $ra寄存器中

写到这里我终于知道自己出现什么问题了。
因为指令在译码的时候出错了。

看到这里指令的信号来到了上升沿。
所以成功了。

测试JALR指令

指令译码
需要写寄存器
需要选择写哪些寄存器
需要选择写的数据
需要对NPC进行选择

放一下测试代码

main:   addi $2, $0, 5          # initialize $2 = 5     00      0       20020005
        addi $3, $0, 12         # initialize $3 = 12    01      4       2003000c
        addi $7, $3, -9         # initialize $7 = 3     02      8       2067fff7
        jal label1
        or   $4, $7, $2         # $4 = (3 or 5) = 7     03      c       00e22025
        and  $5, $3, $4         # $5 = (12 and 7) = 4   04      10      00642824
        add  $5, $5, $4         # $5 = 4 + 7 = 11       05      14      00a42820
        bne  $5, $7, label2     # shouldn be taken      06      18      10a7000a
        slt  $4, $3, $4         # $4 = (12 < 7) = 0     07      1c      0064202a
        beq  $4, $0, label1     # should be taken       08      20      10800001
        addi $5, $0, 0          # shouldn't happen      09      24      20050000
label1: slt  $4, $7, $2         # $4 = (3 < 5) = 1      0A      28      00e2202a
        add  $7, $4, $5         # $7 = 1 + 11 = 12      0B      2c      00853820
        jalr $ra
        sub  $7, $7, $2         # $7 = 12 - 5 = 7       0C      30      00e23822
        sw   $7, 68($3)         # [80] = 7              0D      34      ac670044
        lw   $2, 80($0)         # $2 = [80] = 7         0E      38      8c020050
        j    label2             # should be taken       0F      3c      08000011
        addi $2, $0, 1          # shouldn't happen      10      40      20020001
label2: sw   $2, 84($0)         # write adr 84 = 7      11      44      ac020054
loop:   j    loop               # dead loop             12      48      08000012

看波形, 成功了!


可以看到成功地跳转到了寄存器对应的地址,并且把下一条指令的值写入了$ra!

测试NOR指令

这条指令也就是做一个或非的运算, R型指令, 实现方式和其他的R型指令是很类似的

我选择给ALU扩充一个或非的运算

NOR运算扩充
指令的格式

R类型的指令都需要写寄存器, 所以这一步不需要了
然后是选择ALU的运算
到这里应该是结束了

从波形图上可以看到nor的信号了

同时也可以看到修改了寄存器的值

测试sll & sra & srl指令

这些指令有一个共性, 都需要移位操作。
但是ALU并没有提供移位的功能。

所以唯一的选择就是扩展ALU(我说呢, 怪不得老师给的代码里面的ALUop和书上的对不上)

扩展ALU

为了对之前的指令不造成影响, 所以我决定原先的ALU操作的第四位都是0

这样的话,它默认就是0, 不需要去设置了

扩展ALU的功能

功能扩展完了, 我还需要添加一个多路选择器,选择哪里的呢? 当然是对ALU的A输入口进行选择, 因为这三种移位类型的指令都是R型的指令。
也就是说它们都是对rt进行操作, 然后写会到rd中。

所以ALU的A输入口输入的就是shamt
ALU的B输入口输入的就是 rt的值(这个已经有多路选择器实现了,如图

因为lw, sw都是需要对来自rt和立即数的值进行选择, 也就是说它们的操作就是选择立即数与rs进行运算。

ALUSrc

既然要加多路选择器, 首先要有一个多路选择信号, 然后就是两个待选择的信号, 一个是shamt, 一个是rs的值。

所以控制单元的输出要加一个选择信号

把这三条指令都添加上了

同时输出一个信号对多路选择器进行选择

当然这几条指令都需要写寄存器, 所以都默认了
当然不要忘了实例化的时候需要增加一个绑定

别忘了增加信号


译码的时候需要补充shamt信号

写成32位的方便运算
译码
给ALU的A输入口新增一个线
多路选择器的输出就是那根线
同时修改ALU的口

ok到这里应该结束了

出错了~~
从这张图中可以看到ALU的op[3]一直是z。。。。

原因是我没有修改控制信号

ok成功的实现了sll指令
这个时候可以看到波形了
可以看到这个是移位的shamt字段

接下来测试srl指令


ok
这时候可以看到ALU的输入里面一个是2,一个是5

测试SRA指令

ok大功告成

测试sllv和srlv

这两条指令也都是R类型的, 实现的功能和sll和srl差不太多, 但是它们要实现的可移位的位数必须是变化的。


继续扩展ALU的功能
扩展ALU的功能
添加控制信号

都需要写寄存器这是不用说的

修改ALUop


ALUOp

但是我这里犯了个错
我以为是把rt做偏移量, 没想到是把rs做偏移量。。。。
那行,


怎么感觉这个代码写的这么滑稽呢?

其他的仿真过程都差不太多, 我就不放图了。

ok最后两条指令了

先看slti指令

与立即数比较,小于则置位
其实和slt差不太多
不过比较的时候多路选择器要发挥它的作用了

然而神奇的是这是一条I类型的指令

很明显它需要写寄存器

同时还需要有对多路选择器进行选择


ALU的B输入口需要立即数
ALU的选择和SLT的应该一样

ok开始测试

ok寄存器没问题
看看波形ok没问题

最后一条lui

这个是取高16位放进一个寄存器里面去,
也是I类型的指令
不过我们需要将一个16位的立即数符号扩展之后,再左移16位, 然后把运算结果写会到寄存器中去。

所以这个时候我需要对ALU再增加一个选择信号

对ALU进行扩展
寄存器写信号
ALU的B入口是一个立即数
对ALUOp进行修改
i_lui指令还需要写会rt

zz的我把ALU运算搞错了

应该是对B进行运算的。。。

ok这样就成功了

andi指令

andi指令也很类似

也就是把一个十六位的数字去& 一下


控制信号

需要符号扩展
需要写寄存器
还需要对ALU进行选择


测试
ok

至此, 蓝色部分指令全部添加完成

ok最后开始跑一下老师给的学号排序的代码了

不过我真的没有很看懂老师给的代码是什么意思。

只要把这两个地方都给替换掉

emmmm我在这个地方被自己蠢到了。
我以为是要把自己学号的后八位用是十六进制来表示。
然后把排序的结果转化成十进制,
毫无疑问, 这个想法是错误的, 但是就是一直掉在里面了。。

后来才知道, 只需要把我的学号的每个数字修改翻译成8421码就行了。。。(其实不需要翻译)就是直接十进制数字上就行了。

修改完之后dump一下, 之后

记得把这个地方都注释掉, 因为我看不懂, 而且还会限制PC的变化

进入modelsim


modelsim仿真

我这里只添加了PC和其他两个信号。

由于要执行的指令实在是太多了, 我看了一下 大概是200ns会执行一条指令, 所以一开始跑10000都不为过, 反正就是不停地点。

当然最后的结果是存储在dmem里面的
所以跑一会之后不要忘记查看内存中的值(是叫内存吧)

dmem

ROM里面的值貌似是存储了指令吧

ROM
是的我猜的没错

忘了表明一下结果


反正仿真就是跑成功了

上板子了


github源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容