P4课下

目标

将P3中使用Logisim搭建的MIPS单周期CPU电路转用Verilog HDL描述,并在其基础上支持更多指令。

完成的只是从Logisim电路到Verilog代码的映射。

设计草稿

整体设计

整体设计

具体模块化与层次化设计

单周期处理器

顶层模块、控制器和数据通路,放置在顶层目录下。code.txt存储相应的机器码。处理器为32位单周期处理器,不考虑延迟槽,支持指令为add, sub, ori, lw, sw, beq, lui, jal, jr, nop,nop为空指令,不进行任何操作,add, sub无符号加减法处理(不考虑溢出)。

控制器模块

用一个独立的Verilog HDL文件,实现控制器这个单一的职责,降低模块间耦合度。

顶层目录

其中每个module都由一个独立的Verilog HDL文件组成。

顶层文件为mips.v,有效驱动信号要求包括且仅包括同步复位信号 reset时钟信号 clk,接口定义如下:

1
2
3
4
module mips(
input clk,
input reset
);

数据通路设计

P3遗产(我的丑陋的数据通路图)

P3遗产

注意

根据设计的数据通路架构图及各个部件的输入输出端口,在顶层Verilog文件中定义一些内部的wire型变量,利用模块间的逻辑关系,对各个部件模块进行实例化,串接在一起,使之成为一个整体,最后预留出控制器信号的输入和输出端口即可。(省流:类似于Logisim中使用标签的方法

IFU(取指令单元)

模块端口定义:

信号名 方向 描述
clk I 时钟信号
reset I 同步复位信号,将PC寄存器的值复位为起始地址0x00003000
NPC[31:0] I 32位,代表下一条指令的地址,读入后用PC寄存器存储起来
PC[31:0] O 32位,代表当前指令的地址,输出给NPC模块来生成下一条指令的地址
Data[31:0] O 32位,当前指令的机器码

模块功能定义:

序号 功能名称 描述
1 同步复位 当时钟上升沿到来且reset有效时,将PC寄存器的值复位为起始地址0x00003000,PC寄存器通过一个内部的32位reg型变量存储。
2 取指令 通过当前PC值读取ROM中相应位置的指令并输出当前指令,而ROM则通过对reg型变量建立数组的方式来表示,例如reg [31:0] ROM [0:4095],根据实验要求一开始使用initial块通过$readmemhcode.txt中的十六进制指令读入存储器ROM中。

GRF(寄存器单元)

模块端口定义:

信号名 方向 描述
clk I 时钟信号
reset I 同步复位信号,将32个寄存器中的值全都清零。
RegWrite I 写使能信号,1:可向GRF中写入数据;0:不可写入
rs[4:0] I 5为地址输入信号,指定32个寄存器中一个,将其中存储的数据读出到RD1
rt[4:0] I 5为地址输入信号,指定32个寄存器中一个,将其中存储的数据读出到RD2
RegAddr[4:0] I 5为地址输入信号,指定32个寄存器中一个作为写入的目标寄存器
RegData[31:0] I 32位输入数据
PC[31:0] I 32位,表示相应指令的存储地址
Rs[31:0] O 输出rs寄存器中的32位数据
Rt[31:0] O 输出rt寄存器中的32位数据

模块功能定义:

序号 功能名称 描述
1 同步复位 时钟上升沿到来且reset信号有效时,所有寄存器存储的数据清零。
2 读数据 读出rs,rt地址对应寄存器中所存储的数据到Rs,Rt中。寄存器堆的实现方式同IFU模块中的ROM器件类似。
3 写数据 当RegWrite有效且时钟上升沿来临时,将RegData写入RegAddr寄存器中。
4 输出数据,用于评测 每个时钟上升沿到来时若要写入数据(即写使能信号为 1 且非 reset 时)则输出写入的位置及写入的值

NPC(指令转移单元)

模块端口定义:

信号名 方向 描述
PC[31:0] I 32位,当前指令的地址
ifBeq I 1位,表示当前指令是否为beq
zero I 1位,表示是否满足相等关系
imm[15:0] I 16位,16位立即数
Rs[31:0] I 32位,rs寄存器的值,作为jr指令成立时的跳转地址
ifJr I 1位,表示当前指令是否为jr
NPC[31:0] O 32位,下一条指令的地址

模块功能定义:

序号 功能名称 描述
1 非跳转指令的PC自增 对于非跳转指令,需要通过PC自加4完成向下一条指令的转移
2 跳转指令的PC跳转 针对类如beq等跳转指令的在PC自增功能的基础下的PC地址偏移即将再加上立即数左移两位后符号扩展成32位的结果,进而实现PC的跳转;针对jr指令需要将输入的寄存器存储的值赋值给PC即可实现相应的指令地址的转移。

DM(数据寄存器)

模块端口定义:

信号名 方向 描述
MemData[31:0] I 32位,写入数据
MemAddr[31:0] I 32位,地址选择信号
MemToRead I 1位,是否读出信号
MemWrite I 1位,是否写入信号
clk I 时钟信号
reset I 复位信号
pc[31:0] I 32位,当前指令的地址
RD[31:0] O 32位,输出数据

模块功能定义:

序号 功能名称 描述
1 读数据 MemToRead有效时,地址选择信号MemAddr选择的存储字放在RD输出总线上输出
2 写数据 MemWrite有效且时钟信号上升沿到来时,MemData上数据被写入地址MemAddr选择的存储单元中
3 同步复位 时钟上升沿到来且reset有效时,将RAM地址复位为起始地址0x00000000
4 输出数据,用于评测 每个时钟上升沿到来时若要写入数据(即写使能信号为 1 且非 reset 时)则输出写入的位置及写入的值

ALU(运算单元)

模块端口定义:

信号名 方向 描述
ALUctr[2:0] I 3位,进行I1和I2的相关运算,课下目前只需要2位就可以了,但是多留一位给P4课上做准备()
I1[31:0] I 32位,操作数一
I2[31:0] I 32位,操作数二
Out[31:0] O 32位,ALU计算结果
zero O 1位,判断减操作的结果是否为0

模块功能定义:

序号 功能名称 描述
1 加操作 ALUctr为00时进行I1和I2的加操作
2 减操作 ALUctr为01时进行I1-I2的操作
3 或操作 ALUctr为10时进行I1|I2的操作
4 加载到高位的操作 ALUctr为11时进行将imm加载到高位

Ext(扩展单元)

模块端口定义:

信号名 方向 描述
imm[15:0] I 16位立即数输入
ifSignExt I 1位,表示是否进行符号位的扩展
immediate[31:0] O 32位,立即数扩展后的结果

模块功能定义:

序号 功能名称 描述
1 0扩展 将16位立即数进行0扩展
2 符号扩展 将16位立即数进行符号位扩展

RegAddrSel(寄存器堆写入地址选择单元)

模块端口定义:

信号名 方向 描述
rt[4:0] I 5位rt地址数
rd[4:0] I 5位rd地址数
RegDst I 1位,表示是否选择rd作为写入地址
ifJal I 1位,表示当前指令是否为jal
RegAddr O 5位,最终的写入地址

模块功能定义:

序号 功能名称 描述
1 RegDst选择 通过RegDst选择是否将rd地址数作为写入地址
2 jal选择 通过ifJal选择是否将$ra作为写入寄存器

RegDataSel(寄存器堆写入数据选择单元)

模块端口定义:

信号名 方向 描述
ALUout[31:0] I 32位,ALU模块计算结果
RD[31:0] I 32位,lw指令下DM模块提供的读取入寄存器的数据
pc[31:0] I 32位,当前指令地址
MemToReg I 1位,表示选择RD作为写入数据
ifJal I 1位,表示当前指令是不是jal
RegData[31:0] O 32位,最终写入数据

模块功能定义:

序号 功能名称 描述
1 选择RD 通过MemToReg选择是否将RD作为写入数据
2 选择下一条指令的地址 通过ifJal选择是否将PC+4作为写入数据

ALUInSel(ALU模块的操作数选择单元)

模块端口定义:

信号名 方向 描述
Rs[31:0] I 32位,GPR[rs](对于课下,其实本可以不用传入的,但是传入方便课上加有可能的相关指令)
Rt[31:0] I 32位,GPR[rt]
immediate[31:0] I 32位,经过扩展Ext模块的立即数
ALUsec I 1位,选择ALU的第二操作数为立即数
I1[31:0] O 32位,ALU模块的第一个操作数
I2[31:0] O 32位,ALU模块的第二个操作数

模块功能定义:

序号 功能名称 描述
1 选择ALU模块的第二个操作数 通过ALUsec选择ALU模块的第二个操作数

jump(处理J跳转指令的NPC处理单元)

模块端口定义:

信号名 方向 描述
pc[31:0] I 32位,当前指令地址
norNPC[31:0] I 32位,不进行J跳转指令的正常NPC
instr[31:0] I 32位,当前指令
jump I 1位,表示当前指令是否是jal跳转指令
NPC O 32位,最终的NPC

模块功能定义:

序号 功能名称 描述
1 处理跳转地址 处理jal跳转指令的跳转地址
2 选择NPC是否为跳转地址 通过jump选择是否进行地址的跳转

Controller(控制器单元)

模块端口定义:

信号名 方向 描述
op[5:0] I 6位,区分非R型指令的标识
func[5:0] I 6位,区分R型指令的标识
RegWrite O 1位,表示是否要将结果写回寄存器中
MemWrite O 1位,表示是否要将结果写入DM中
ifSignExt O 1位,表示立即数是否进行符号扩展
ALUctr[2:0] O 3位,作为ALU模块的运算控制器
ifBeq O 1位,表示当前指令是否为beq
MemToReg O 1位,表示在写使能端有效前提下判断是否从DM读取数据写入寄存器中,其余情况均是从ALU运算得到结果写入寄存器中
RegDst O 1位,表示回写的寄存器是否为rd
ALUsec O 1位,表示ALU进行操作的第二个操作数是否是立即数
jump O 1位,表示是否执行jal的跳转指令
ifJr O 1位,表示当前指令是否为jr
ifJal O 1位,表示当前指令是否为jal

输入与输出之间的关系表:

func 100000 100010 n/a n/a n/a n/a n/a 000000 n/a 001000
op 000000 000000 001101 001111 100011 101011 000100 000000 000011 000000
variate add sub ori lui lw sw beq nop jal jr
RegDst 1 1 0 0 0 0 0 0 0 0
ALUsec 0 0 1 1 1 1 0 0 0 0
MemToReg 0 0 0 0 1 0 0 0 0 0
RegWrite 1 1 1 1 1 0 0 0 1 0
MemWrite 0 0 0 0 0 1 0 0 0 0
ifBeq 0 0 0 0 0 0 1 0 0 0
ifSignExt 0 0 0 0 1 1 0 0 0 0
ALUctr[0] (add(00))0 (sub(01))1 (or(10))0 (lui(11))1 (add(00))0 (add(00))0 (sub(01))1 0 0 0
ALUctr[1] 0 0 1 1 0 0 0 0 0 0
ALUctr[2] 0 0 0 0 0 0 0 0 0 0
jump 0 0 0 0 0 0 0 0 1 0
ifJr 0 0 0 0 0 0 0 0 0 1
ifJal 0 0 0 0 0 0 0 0 1 0

测试方案

在上一次的随机生成代码的基础上加上了人工调试,得到了下列覆盖较为全面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
.text
lui $28, 0
lui $29, 0
sub $12,$30,$3
nop
lui $3,1767
lw $29,2296($0)
sw $19,1624($0)
lui $16,32170
sw $27,3672($0)
nop
ori $25,$21,33535
ori $28,$4,1
beq $21,$0,label1
label1:
add $19,$2,$0
sw $11,7608($0)
lw $23,9240($0)
ori $21,$22,40405
lui $15,47634
ori $17,$23,1
beq $27,$0,label2
label2:
lw $11,7960($0)
ori $27,$20,1
beq $16,$0,label1
lui $3,30484
nop
label3:
nop
nop
label4:
label5:
nop
ori $30,$31,1
beq $30,$0,label1
add $21,$21,$24
sw $15,10204($0)
nop
label6:
sub $31,$8,$5
sw $26,12252($0)
label7:
lw $25,2020($0)
jal label8
ori $12,$22,1
beq $9,$0,label6
sub $20,$15,$17
sub $3,$23,$2

beq $0, $0, label23
label8:
label9:
ori $7,$15,1
beq $7,$0,label5
lw $30,9120($0)
label13:
sw $10,5384($0)
nop
add $9,$4,$12
ori $24,$0,26097
lui $2,15307
lui $18,18182
ori $9,$17,36182
nop
label15:
ori $17,$31,1
beq $5,$0,label11
lui $26,1870
nop
add $30,$25,$6
label16:
lw $9,6312($0)
lui $31,13768
add $28,$31,$0
label17:
label10:
lw $10,8312($0)
ori $15,$30,57904
lw $3,8328($0)
nop
ori $5,$12,1
beq $5,$0,label5
sw $17,8680($0)
sw $25,436($0)
label11:
add $17,$0,$23
lw $10,11608($0)
sw $11,9676($0)
add $3,$19,$28
sub $3,$2,$11
ori $5,$9,57311
lw $24,10428($0)
ori $9,$3,21056
lw $13,4776($0)
lui $18,46677
label12:
lui $4,30794
lui $21,16977
lui $7,32533
sw $17,1532($0)
jr $ra

label23:
beq $0, $0, label21
label20:
jr $ra

label21:
jal label20
sw $0, 4($0)
lui $0, 555

得到相应机器码导入ISE后,检查出了许多的bugs:

1.在DM模块中,将传入的地址右移2位赋给变量actAddr,而actAddr的定义为:wire actAddr; 显然位宽不对应,而恰好给的样例只涉及了0、1位置的存入(一开始认为输出的是实际的RAM的地址(这也是第三个bug)),且并没有认真看样例输出的是8位16进制数,被硬控一小时。

2.传入评测前一定要确保IM模块导入的文本名称为:code.txt,否则将什么都没有传入。

3.输出的是右移前的地址,即按字节的地址,不是按字的地址。

同时我利用P3随机生成的代码测试了对于addsubluiorilwswbeq指令的测试情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
.text
lui $28, 0
lui $29, 0
lw $3,12220($0)
label0:
ori $27,$0,21838
ori $7,$24,64446
lui $26,30601
sub $4,$6,$29
add $3,$21,$18
lui $12,58593
label1:
ori $23,$29,57521
ori $10,$11,17197
ori $2,$29,45846
add $27,$11,$30
label2:
ori $4,$23,49583
nop
ori $29,$28,30889
add $15,$18,$9
label3:
lw $23,3588($0)
lui $31,13061
lw $16,7444($0)
add $7,$20,$20
ori $29,$20,45341
ori $12,$19,2231
lui $0,33119
sw $28,7880($0)
ori $16,$9,261
nop
sw $31,1508($0)
nop
sub $16,$20,$15
ori $4,$24,1
beq $4,$0,label3
sw $19,2188($0)
ori $16,$29,38043
lui $6,38905
lw $17,6932($0)
ori $25,$17,15558
lw $24,7704($0)
label4:
nop
sub $8,$3,$2
add $27,$1,$30
lui $19,44506
ori $14,$21,42642
ori $23,$26,1
beq $23,$0,label3
sub $13,$13,$11
sw $18,4460($0)
sw $1,12280($0)
lw $26,8516($0)
lui $14,46761
lw $29,9312($0)
ori $15,$9,24066
sub $21,$7,$20
ori $5,$16,1
beq $5,$0,label0
lw $12,6112($0)
ori $14,$16,27619
nop
sw $13,1312($0)
sub $19,$18,$5
lui $4,8845
add $15,$17,$26
ori $7,$25,1
beq $7,$0,label3
ori $22,$11,64348
ori $4,$10,58104
sw $30,5464($0)
lui $21,42924
ori $21,$25,52424
lui $12,59166
lui $4,12477
ori $13,$20,1
beq $13,$0,label1
ori $14,$21,4942
label5:
lw $18,1508($0)
ori $11,$30,7863
add $2,$12,$13
sw $4,4792($0)
sub $12,$26,$20
ori $9,$0,62628
add $14,$18,$30
nop
label6:
ori $9,$28,38349
ori $25,$23,57791
ori $5,$16,6305
nop
nop
lw $0,9012($0)
sub $30,$18,$27
ori $12,$0,1
beq $12,$0,label0
label7:
lui $17,1875
add $7,$4,$20
lui $13,2614
ori $12,$26,9653
ori $2,$23,10334
label8:
ori $6,$14,1
beq $6,$0,label4
ori $7,$7,34426
lui $27,21272
sw $19,10020($0)
sw $18,10164($0)
lui $24,59243
add $13,$1,$5
sw $25,1920($0)
lui $23,3008
sub $7,$6,$13
ori $0,$27,3389
sw $30,10952($0)
lw $9,1552($0)
sub $2,$28,$10
add $19,$27,$11
lw $13,7064($0)
sw $21,6820($0)
sw $3,12264($0)
nop
ori $22,$26,8102
add $25,$26,$3
label9:
sub $4,$18,$5
sw $27,9624($0)
lui $21,33721
nop
add $31,$6,$14
add $2,$25,$11
lw $12,10700($0)
ori $14,$3,53956
add $12,$31,$8
ori $26,$6,61476
add $31,$16,$11
lw $3,1500($0)
ori $5,$5,1
beq $5,$0,label8
lui $21,60746
label10:
add $13,$5,$2
label11:
nop
lui $2,2438
sw $6,9924($0)
lw $12,7504($0)
sw $11,6452($0)
label12:
sub $30,$0,$11
nop
lw $31,2320($0)
sw $24,7828($0)
lw $0,356($0)
sub $29,$24,$1
sw $24,8056($0)
ori $29,$7,28337
ori $3,$2,45291
nop
ori $2,$26,42574
nop
ori $2,$17,1
beq $2,$0,label5
ori $26,$15,1
beq $26,$0,label8
lui $26,35318
sub $28,$14,$30
sw $0,12212($0)
ori $2,$25,1
beq $2,$0,label1
lui $23,47561
label13:
add $18,$23,$6
nop
lw $2,7136($0)
ori $16,$29,1
beq $16,$0,label2
add $29,$13,$24
sub $29,$17,$27
nop
add $19,$1,$2
label14:
add $26,$9,$26
ori $13,$12,1
beq $13,$0,label10
label15:
ori $28,$17,1
beq $28,$0,label13
sw $10,5636($0)
lw $20,2236($0)
lui $9,17416
nop
nop
ori $18,$25,43604
ori $28,$30,1
beq $28,$0,label6
add $12,$4,$22
add $30,$2,$12
ori $29,$17,4625
label16:
ori $9,$9,1
beq $9,$0,label9
ori $24,$18,1
beq $24,$0,label0
label17:
sub $24,$28,$4
sub $22,$11,$11
ori $9,$31,1
beq $9,$0,label2
nop
sw $29,3032($0)
sw $14,4308($0)
sub $9,$6,$29
ori $20,$21,1
beq $20,$0,label6
ori $15,$13,18405
nop
label18:
add $13,$20,$20
label19:
label20:
ori $25,$10,36791
label21:
sub $31,$29,$27
sw $10,6028($0)
sub $21,$11,$16
label22:
add $26,$7,$18
lui $10,51227
nop
add $15,$25,$21
add $8,$25,$26
lw $17,3696($0)
add $6,$21,$22
add $29,$15,$9
lw $4,6908($0)
sub $18,$11,$28
add $25,$18,$4
ori $17,$1,1
beq $17,$0,label10
sub $22,$15,$0
add $18,$25,$21
label23:
lw $25,10224($0)
lw $16,3804($0)
add $29,$4,$8
sw $21,3840($0)
ori $13,$3,1
beq $13,$0,label10
add $31,$8,$4
ori $16,$17,1
beq $16,$0,label1
add $2,$7,$13
ori $10,$1,46102
lui $11,14865
nop
ori $3,$18,1
beq $3,$0,label2
sub $15,$31,$3
add $2,$13,$23
sub $25,$9,$15
add $6,$27,$22
ori $14,$19,1
beq $14,$0,label9
sw $25,4216($0)
sw $5,8268($0)
add $10,$26,$20
ori $0,$1,1
beq $8,$0,label2
label24:
lui $17,12049
lw $9,11064($0)
add $25,$4,$0
add $26,$13,$0
lw $5,1156($0)
add $16,$3,$5
label25:
nop
label26:
label27:
ori $17,$10,27638
sub $22,$9,$27
add $11,$2,$28
sub $23,$24,$10
sub $29,$19,$22
lw $23,9268($0)
label28:
ori $20,$8,29632
add $9,$12,$6
sub $14,$13,$18
sw $19,9220($0)
lw $5,10944($0)
ori $26,$6,1
beq $26,$0,label6
ori $19,$7,1
beq $19,$0,label5
add $19,$23,$6
ori $26,$11,54795
ori $24,$18,1
beq $24,$0,label6
add $29,$12,$19
nop
add $11,$31,$26
ori $20,$11,1
beq $20,$0,label19
lw $6,11752($0)
sw $17,5696($0)
nop
ori $12,$13,50862
lui $24,52897
sw $13,988($0)
lw $22,3236($0)
nop
nop
sub $12,$10,$8
ori $29,$9,46063
lui $25,11123
lw $19,11136($0)
label29:
sub $18,$15,$10
ori $16,$19,1
beq $16,$0,label25
sw $0,3476($0)
add $21,$16,$28
add $11,$13,$6
ori $3,$5,1627
ori $25,$10,15550
sw $10,9104($0)
lw $11,3376($0)
ori $16,$3,51561
lw $6,5904($0)
lw $4,1568($0)
lw $28,10928($0)
lui $6,60075
sw $30,3952($0)
lw $22,1176($0)
sub $23,$22,$31
add $8,$23,$30
ori $6,$15,1
beq $6,$0,label21
lui $13,14176
sub $15,$12,$3
sw $21,1552($0)
lui $7,32607
sw $7,5304($0)
nop
sw $12,3276($0)
nop
sw $31,2100($0)
lui $25,55147
label30:
lui $28,56215
label31:
nop
ori $9,$23,1
beq $9,$0,label9
label32:
sub $17,$14,$2
lui $31,43398
label33:
lw $6,1340($0)
sub $16,$28,$18
lw $3,9024($0)
lw $18,2860($0)
ori $28,$24,38276
label34:
nop
ori $9,$29,1
beq $9,$0,label3
ori $25,$27,1
beq $25,$0,label30
label35:
nop
ori $17,$14,1
beq $17,$0,label15
ori $8,$9,1
beq $8,$0,label27
label36:
ori $16,$30,34953
lui $19,56697
sub $6,$16,$20
label37:
nop
sw $25,4464($0)
lw $18,6328($0)
lui $17,3622
lw $31,1376($0)
lw $25,12208($0)
nop
lui $27,5198
lw $20,12172($0)
label38:
add $21,$14,$0
lui $5,657
lui $6,26369
sub $14,$13,$3
ori $30,$17,11214
lui $22,28626
add $16,$27,$12
ori $19,$23,1
beq $19,$0,label32
lw $22,10328($0)
sw $26,1480($0)
label39:
ori $6,$31,1
beq $6,$0,label28
nop
ori $3,$23,1
beq $3,$0,label21
ori $22,$12,1
beq $22,$0,label16
label40:
ori $15,$24,45255
ori $22,$2,5574
nop
lui $5,27025
lw $13,6444($0)
lw $13,2348($0)
lui $31,57095
sw $1,9828($0)
label41:
sub $17,$0,$22
add $30,$14,$24
nop
lui $24,41495
lui $15,42543
nop
sw $21,6540($0)
label42:
sub $26,$11,$0
sub $9,$15,$10
lw $5,456($0)
ori $2,$29,1
beq $2,$0,label28
ori $17,$23,1
beq $17,$0,label14
lw $4,11800($0)
ori $3,$29,33610
lui $5,28901
sub $30,$6,$26
lw $31,5568($0)
ori $2,$22,1
beq $2,$0,label1
sub $7,$20,$19
ori $23,$7,51582
lw $5,1708($0)
nop
sub $25,$15,$10
lui $16,18718
lw $6,9568($0)
nop
label43:
lw $23,3556($0)
label44:
sub $30,$31,$29
add $6,$1,$10
add $10,$0,$19
sub $23,$18,$18
ori $22,$18,19799
lui $12,15794
lui $24,56738
ori $11,$12,43867
label45:
add $0,$18,$12
lw $7,12092($0)
lw $0,5688($0)
add $7,$13,$13
sub $7,$15,$0
sw $2,11324($0)
sw $17,11384($0)
lw $30,9848($0)
nop
nop
ori $27,$16,20349
add $20,$16,$9
sub $3,$31,$4
add $11,$29,$10
ori $25,$19,1
beq $25,$0,label12
ori $14,$7,8373
lw $5,2352($0)
ori $3,$14,1
beq $3,$0,label39
sw $20,1876($0)
add $25,$20,$8
label46:
lw $26,7104($0)
nop
lui $3,20194
sub $28,$5,$7
sw $7,7108($0)
sub $16,$27,$29
add $13,$22,$31
sw $16,1932($0)
label47:
ori $20,$2,1
beq $20,$0,label17
ori $9,$0,58783
ori $0,$31,1
beq $20,$0,label46
add $3,$13,$9
lui $12,49615
label48:
lw $9,5448($0)
sw $24,3604($0)
label49:
lui $14,18765
ori $27,$12,1
beq $27,$0,label47
sub $30,$10,$0
ori $8,$13,1
beq $8,$0,label45
ori $26,$25,1
beq $26,$0,label16
nop
ori $11,$30,31651
lw $11,9516($0)
sub $24,$19,$10
sw $16,3988($0)
label50:
add $28,$10,$29
sw $15,5476($0)
add $21,$11,$30
add $8,$3,$25
lui $6,39793
nop
sub $27,$8,$25
add $24,$24,$9
sub $17,$20,$10
sub $26,$1,$14
ori $31,$1,25923
lw $23,9296($0)
nop
ori $14,$28,1
beq $14,$0,label0
add $15,$5,$7
add $27,$13,$28
lui $19,40446
sw $1,10300($0)
add $5,$3,$23
nop
add $3,$6,$1
lui $29,1782
sub $12,$8,$0
nop
lw $30,500($0)
add $15,$20,$31
lui $2,13017
ori $16,$31,52737
add $31,$1,$19
lw $25,1260($0)
label51:
ori $14,$20,41954
add $16,$11,$28
sw $0,20($0)
lui $4,40850
nop
sw $20,960($0)
add $17,$15,$8
add $30,$6,$0
sw $12,2172($0)
lui $9,15237
ori $8,$20,1
beq $8,$0,label4
lui $30,62874
nop
label52:
add $9,$1,$18
lw $0,1896($0)
add $26,$13,$22
add $31,$22,$17
lui $26,42417
sub $25,$2,$28
lui $30,11154
label53:
sub $8,$18,$11
lui $19,12122
sub $29,$5,$27
label54:
lui $11,11385
nop
nop
add $27,$6,$8
lw $31,4284($0)
lui $2,25045
lw $30,136($0)
add $17,$13,$24
sw $21,4884($0)
sw $20,476($0)
label55:
ori $27,$19,1
beq $27,$0,label50
lw $24,8116($0)
ori $22,$8,7234
ori $2,$8,38417
nop
sub $7,$17,$6
add $11,$11,$10
sw $7,5700($0)
add $25,$21,$0
ori $13,$3,1
beq $13,$0,label31
sw $21,1700($0)
sub $8,$5,$0
sw $3,9772($0)
nop
nop
label56:
add $10,$6,$11
nop
lw $24,4104($0)
label57:
lui $12,44568
lw $10,11176($0)
ori $9,$16,1
beq $9,$0,label31
add $16,$13,$24
add $3,$21,$0
sub $18,$4,$12
lui $20,58662
ori $17,$21,53372
nop
sub $30,$3,$17
lw $12,6104($0)
sub $30,$10,$19
ori $11,$16,12874
add $5,$9,$15
nop
sub $8,$24,$4
nop
sub $3,$1,$10
lw $7,492($0)
lui $26,17837
add $0,$9,$0
sub $29,$21,$2
ori $0,$5,1
beq $29,$0,label39
nop
sw $25,2312($0)
ori $14,$8,1
beq $14,$0,label52
sub $7,$27,$10
sw $24,9652($0)
nop
sub $11,$7,$22
add $5,$23,$1
sub $14,$18,$31
sub $2,$19,$3
lw $12,1208($0)
ori $24,$26,61574
ori $2,$18,1
beq $2,$0,label22
sub $26,$4,$0
lui $3,38777
ori $27,$12,1
beq $27,$0,label26
sub $27,$25,$21
sw $23,11272($0)
sw $7,2864($0)
add $10,$18,$12
ori $30,$26,1
beq $30,$0,label4
nop
ori $9,$19,1
beq $9,$0,label29
label58:
lw $18,628($0)
ori $11,$30,1
beq $11,$0,label34
label59:
ori $7,$31,27144
lui $13,55049
lui $31,44033
lui $18,59825
label60:
sw $20,10120($0)
nop
ori $4,$0,1
beq $4,$0,label40
sub $23,$23,$31
label61:
sub $11,$18,$20
sub $22,$23,$2
ori $8,$4,44665
label62:
lui $23,21916
nop
label63:
ori $19,$28,53475
add $31,$13,$1
lui $5,979
label64:
label65:
ori $21,$25,1
beq $21,$0,label50
nop
add $19,$26,$8
sw $5,10336($0)
label66:
sw $15,1276($0)
sw $5,8268($0)
ori $16,$28,50290
lui $3,37254
sub $20,$3,$26
add $6,$6,$28
sub $10,$9,$20
sub $8,$27,$3
ori $22,$12,1
beq $22,$0,label17
sub $18,$0,$10
sub $11,$20,$3
lw $14,2968($0)
ori $13,$30,17489
lw $16,7500($0)
ori $12,$11,1
beq $12,$0,label30
lui $11,22838
lw $8,4924($0)
sw $13,10004($0)
sub $25,$31,$31
add $4,$12,$1
label67:
lw $13,11536($0)
lw $30,876($0)
lui $31,38524
nop
ori $25,$7,1
beq $25,$0,label11
lui $3,27665
ori $26,$0,54481
ori $21,$22,4068
label68:
ori $31,$5,54164
label69:
lui $5,27389
nop
sw $28,7864($0)
lw $0,4184($0)
add $7,$14,$30
lui $7,21275
sub $5,$25,$30
sw $14,756($0)
lw $16,516($0)
lui $8,53761
nop
add $24,$27,$11
lw $21,608($0)
add $12,$28,$26
ori $17,$8,1
beq $17,$0,label38
ori $31,$28,24527
lw $5,7220($0)
ori $8,$20,1
beq $8,$0,label62
ori $17,$7,58126
ori $26,$9,1
beq $26,$0,label31
nop
ori $11,$5,10972
sub $10,$3,$10
add $18,$9,$14
lui $2,57164
nop
ori $27,$30,1
beq $27,$0,label69
sub $25,$22,$28
lw $15,3968($0)
lw $23,8572($0)
label70:
ori $29,$20,33811
ori $18,$27,25008
sw $18,6436($0)
sw $22,580($0)
nop
nop
ori $30,$14,1
beq $30,$0,label20
lui $2,62902
add $14,$19,$11
lw $4,5044($0)
sub $22,$28,$8
lw $10,3180($0)
ori $3,$16,1
beq $3,$0,label63
lw $10,9180($0)
add $20,$29,$30
add $9,$16,$14
label71:
ori $19,$18,1
beq $19,$0,label45
nop
sw $4,2112($0)
label72:
sw $10,8812($0)
sw $22,8848($0)
lui $6,25020
sub $24,$2,$18
sw $14,5600($0)
nop
ori $25,$5,1
beq $25,$0,label24
sub $29,$8,$4
ori $21,$12,47976
sub $5,$24,$30
label73:
ori $12,$6,53368
ori $29,$30,1
beq $29,$0,label70
ori $20,$30,36773
lw $18,6536($0)
ori $8,$7,1
beq $8,$0,label49
label74:
lui $0,25494
add $21,$5,$30
lui $10,35398
sw $13,8780($0)
sub $20,$28,$7
lui $31,3412
sw $1,10548($0)
sw $25,5548($0)
label75:
ori $8,$1,1
beq $8,$0,label63
label76:
lw $21,10192($0)
label77:
sub $3,$26,$31
add $29,$9,$0
sw $0,11592($0)
sw $5,2700($0)
sub $28,$25,$13
sub $29,$12,$5
ori $12,$15,1
beq $12,$0,label55
ori $4,$23,23253
ori $9,$12,1
beq $9,$0,label39
lw $7,11368($0)
label78:
sub $15,$6,$15
sw $5,1908($0)
ori $25,$29,35187
label79:
ori $15,$23,1
beq $15,$0,label78
sub $29,$28,$27
sw $14,688($0)
add $27,$28,$5
label80:
ori $25,$7,1
beq $25,$0,label24
nop
add $10,$13,$25
ori $19,$25,46463
ori $25,$12,1
beq $25,$0,label20
add $7,$8,$19
add $28,$13,$26
sw $7,10468($0)
label81:
lui $21,45861
add $24,$4,$19
add $13,$11,$7
sub $12,$14,$9
ori $18,$24,7397
ori $21,$8,1
beq $21,$0,label33
ori $29,$10,1
beq $29,$0,label5
add $25,$25,$30
nop
add $16,$13,$7
add $12,$19,$27
label82:
ori $3,$22,57371
ori $20,$25,7784
ori $23,$28,49146
sub $19,$14,$12
add $2,$21,$18
ori $11,$2,1
beq $11,$0,label35
sub $11,$14,$20
sw $26,144($0)
add $5,$0,$1

源码如上,再通过学长的魔改版mars的输出,同ISE波形图输出进行IDEA的输出对拍,发现除了对$0的写入不同(前者会忽略,即输出并不造成影响),其他完全一致。

因此只需要单独测试jaljr指令即可。

思考题

1.阅读下面给出的 DM 的输入示例中(示例 DM 容量为 4KB,即 32bit × 1024字),根据你的理解回答,这个 addr 信号又是从哪里来的?地址信号 addr 位数为什么是 [11:2] 而不是 [9:0] ?

模块接口定义

1.这个addr信号是ALU模块的结果输出,代表了lwsw指令下对DM中的对应地址。

2.因为地址是以字节表示的,又因为处理器是32位的,因此两个地址间相差一个字即4个字节,在数值上表现为相差4。而DM中的RAM是按字表示,即RAM中两个相邻存储数值在DM存储位置的数值上差1,因此外界传入的对于RAM的地址索引需要经过除四即右移两位再传给RAM,而DM的容量为4KB(2^12^B),共需要12位,加上右移两位的影响,因此对于ALU模块提供的地址数应取其211位而不是 09位。

2.思考上述两种控制器设计的译码方式,给出代码示例,并尝试对比各方式的优劣。

两种译码方式:可以记录下指令对应的控制信号如何取值,也可以记录下控制信号每种取值所对应的指令

前者可能代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//以进行了“和”逻辑的运算转换
reg RW, MW, iSE, ALUSEC, iB, MTR, RD, JUMP, iJA, iJR;
reg [2:0] ALUCTR;
always @(*) begin
RW = 0;
MW = 0;
iSE = 0;
ALUCTR = 3'b0;
iB = 0;
MTR = 0;
RD = 0;
ALUSEC = 0;
JUMP = 0;
iJA = 0;
iJR = 0;
if (jal) begin
RW = 1;
JUMP = 1;
iJA = 1;
end
else if (add) begin
RW = 1;
RD = 1;
end
else if (sub) begin
RW = 1;
ALUCTR[0] = 1;
RD = 1;
end
else if (ori) begin
RW = 1;
ALUCTR[1] = 1;
ALUSEC = 1;
end
else if (lui) begin
RW = 1;
ALUCTR[0] = 1;
ALUCTR[1] = 1;
ALUSEC = 1;
end
else if (lw) begin
RW = 1;
iSE = 1;
MTR = 1;
ALUSEC = 1;
end
else if (sw) begin
MW = 1;
iSE = 1;
ALUSEC = 1;
end
else if (beq) begin
ALUCTR[0] = 1;
iB = 1;
end
else if (jr) begin
iJR = 1;
end
else begin
RW = 0;
MW = 0;
iSE = 0;
ALUCTR = 3'b0;
iB = 0;
MTR = 0;
RD = 0;
ALUSEC = 0;
JUMP = 0;
iJA = 0;
iJR = 0;
end
end
assign RegWrite = RW;
assign MemWrite = MW;
assign ifSignExt = iSE;
assign ALUctr = ALUCTR;
assign ifBeq = iB;
assign MemToReg = MTR;
assign RegDst = RD;
assign ALUsec = ALUSEC;
assign jump = JUMP;
assign ifJal = iJA;
assign ifJr = iJR;

后者k代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
//已进行了"和"逻辑的运算转换     
assign RegWrite = (jal | add | sub | ori | lui | lw);
assign MemWrite = sw;
assign ifSignExt = (lw | sw);
assign ALUctr = {0, (ori | lui), (sub | lui | beq)};
assign ifBeq = beq;
assign MemToReg = lw;
assign RegDst = (add | sub);
assign ALUsec = (ori | lui | lw | sw);
assign jump = jal;
assign ifJal = jal;
assign ifJr = jr;

1.前者的代码是针对每一个指令去输出对应的控制信号的,一个很显然的优点就是当增加指令时,只需要增加对应指令成立时对应的控制信号输出为1即可。但是虽然个人感觉代码编写上过于繁琐,因为得判断多条指令是否成立,在指令少的时候可能很清晰,但一旦指令数过多,会导致代码的冗长。

2.后者的代码是针对每一条控制信号采用或逻辑将每个控制信号对应的所有指令或起来达到相应效果,在逻辑上会更加清晰,代码行数也较少。但是缺点就是增加指令时,需要在多条控制信号处增加,较为繁琐。

总的看来,前者是面向指令译码而后者是面向控制信号译码,二者各有优劣。

3.在相应的部件中,复位信号的设计都是同步复位,这与 P3 中的设计要求不同。请对比同步复位异步复位这两种方式的 reset 信号与 clk 信号优先级的关系。

在同步复位中,clk信号是优先于reset信号的,只有当clk信号到达触发沿且reset有效时,reset才会起作用,否则reset不起作用。

在异步复位中,reset信号是优先于clk信号的,当reset信号一有效,即发挥作用,不用考虑此时的clk信号。

4.C 语言是一种弱类型程序设计语言。C 语言中不对计算结果溢出进行处理,这意味着 C 语言要求程序员必须很清楚计算结果是否会导致溢出。因此,如果仅仅支持 C 语言,MIPS 指令的所有计算指令均可以忽略溢出。 请说明为什么在忽略溢出的前提下,addi 与 addiu 是等价的,add 与 addu 是等价的。提示:阅读《MIPS32® Architecture For Programmers Volume II: The MIPS32® Instruction Set》中相关指令的 Operation 部分(详见文档 page 34、page 35)。

在忽略溢出的前提下,addaddu在不溢出的情况下得到的结果一致,且在溢出的情况下,两者溢出后剩下的数也一致,且add并不会报溢出错误,所以此情况下addaddu等价,同理,对于addiaddiu在忽略溢出的情况下,两者等价。

P4课上

注意:过度的模块化会导致课上添加指令时的不便,建议在顶层模块中留一些多路选择器,不然加端口会及其麻烦。

第一题(eam)

将GRF[rs]低16位被模数看作有符号数,对17求模(得到的是最小非负整数,例如:16’h23得到结果为16’h1、而16’hffff得到的结果为16’h10),再根据GRF[rt]的最高位对求模结果进行扩展得到的结果返回GRF[rd],关键在于求模一定要是正数,可以采取((a%b + b)%b)的方式来确保得到的数是0-b-1的正数。不然大有被硬控一小时的风险。

第二题(cptl)

判断GRF[rs]的低18位中是否有连续的6位数是1,若是将PC+4传给GRF[rt],否则传给GRF[31],同时进行beq指令的无条件跳转。没啥好说的,认真加端口就行了。

注意:判断6位连续1的方法可以通过循环的方式实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
integer i,cnt,max;
always @(*) begin
cnt = 0;
max = 0;
for (i = 0; i < 18; i = i + 1) begin
if (Rs[i]) begin
cnt = cnt + 1;
if (cnt > max) max = cnt;
else max = max;
end
else cnt = 0;
end
if (max >= 6) signal = 1;
else signal = 0;
end

第三题(olw)

如指令名,有条件lwolw $rt, offset($rs) :若获取的内存值是非递减序列,就写入,否则不写入。非递减序列:只要该位为1,那么低于该位的位上都为1.

重要的是如何判断非递减序列,大致思路如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
integer i, k, cnt;
always @(*) begin
cnt = 0;
for (i = 0; i <= 31; i = i + 1) begin
if (RD[i]) begin
cnt = cnt + 1;
k = i;
end
else cnt = cnt;
end
if (k + 1 == cnt) signal = 1; //到最左边的一位1的1的个数刚好是位数+1即为非递减序列
else signal = 0;
end

由于第一题被硬控好久,导致第三题没时间做,一定要充分思考,牢记教训!