北航计组-P4课下

前言

P4课下其实就只需要对着P3的电路翻译即可,具体的实现就不多说了,这里只讲讲一些细节和可优化的地方

正文

顶层模块

我们要尽量让顶层模块只起到连线的作用,最多有一些多路选择器,将具体的实现细节放到模块当中去

对于外部的连线,无论模块output的规格是reg还是wire,外部的接线都得定义为wire,或者你就将wire型变量想象为一根根具体的导线😁

同时一定要建立一套自己的命名规范,到了P5你就知道这有多么重要了

NPC

对于NPC模块的跳转判断,一定要做到不重不漏,比如说branch为1,但不相等时是否有赋值,贴上我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
assign pc4 = pc + 32'h0000_0004;
wire [31:0] tmp1, tmp2;
assign tmp1 = pc4 + {{14{offset_16[15]}}, offset_16, 2'b00};
assign tmp2 = {pc[31:28], Imm_26, 2'b00};
always @(*) begin
if(jump) begin
if(jSrc) begin
npc = rs;//jr跳转
end else begin
npc = tmp2;//j or jal跳转
end
end else begin
if(branch) begin
if(zero) begin
npc = tmp1;//beq跳转
end
else begin
npc = pc4;//beq不跳转
end
end else begin
npc = pc4;//非跳转指令
end
end
end

也可以用assign实现

Controller

教程中有两种实现方法,我采取了比较直观但是码量更大的方式,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case (opcode)
6'b000000:
begin
case (funct)
addFunct: begin
RegWrite = 1'b1;
DmWrite = 1'b0;
RegAddSrc = 2'b01;
RegWDSrc = 2'b00;
AluOp = 4'b0000;
AluSrc = 1'b0;
SignExt = 1'b0;
branch = 1'b0;
IfJump = 1'b0;
end
......

这个就看个人选择了

P4课上准备

新指令信号

对与新的指令,可以预留一个信号的接口,提前在Controller模块里准备一个新信号NewSign,具体实现看以下代码

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
parameter 	  addFunct = 6'b100000,
subFunct = 6'b100010,
//I
oriOp = 6'b001101,
luiOp = 6'b001111,
lwOp = 6'b100011,
swOp = 6'b101011,
beqOp = 6'b000100,
//J
jOp = 6'b000010,
jrFunct = 6'b001000,
jalOp = 6'b000011,
//new
newOp = 6'b111111,
newFunct = 6'b111111;

always @(*) begin
NewSign = 1'b0;
case (opcode)
6'b000000:
begin
case (funct)
addFunct: begin
RegWrite = 1'b1;
DmWrite = 1'b0;
RegAddSrc = 2'b01;
RegWDSrc = 2'b00;
AluOp = 4'b0000;
AluSrc = 1'b0;
SignExt = 1'b0;
branch = 1'b0;
IfJump = 1'b0;
end

newFunct: begin
RegWrite = 1'b0;
DmWrite = 1'b0;
RegAddSrc = 2'b00;
RegWDSrc = 2'b00;
AluOp = 4'b0000;
AluSrc = 1'b0;
SignExt = 1'b0;
branch = 1'b0;
IfJump = 1'b0;
JumpSrc = 1'b0;
NewSign = 1'b1;
end

课上只需要改newOp以及对应的控制信号即可,同时每次case前NewSign = 1'b0(18行)这样就不用每一条其他指令都赋值了,同时顶层模块也提前连接好这个信号

ALU模块

  • 考虑到有些题目可能涉及PC,比如与PC比较之类的,可以提前将PC接到ALU输入,要用时直接取
  • 有些新指令可能两种情况的行为完全不同,这时无法从Controller直接获得我们想要的控制信号的最终取值,需要根据ALU运算结果来判断,可以提前预留一个新的output输出new,后面根据new信号来控制一些模块。例子见P4课上T2,一种情况只需要写入寄存器,另一种情况只需要跳转,完全不同。
  • 可以提前将上一点的new信号连接到可能的模块,如GRF、NPC,先不管,到时候特判即可

其他

做课下时可以提前看看课上加指令的模式,提前准备一些必要的接口和连线,到时候课上只需要稍微修改,加几行代码即可

课下测试

每年都有会奆佬在讨论区或者水群发评测机和测试数据生成器,大家多多关注

如果没什么数据的话可以试试下面这个数据,用的是学长的魔改MARS,链接在这里

可以直接输出GRF\DM的写入信息,与自己的对拍即可,注意在Settings下勾选Ignore Arithmetic Overflow以及Output Log level 1,并在Memory Configuration下选择large text,这样可以一次运行4000多行mips代码

同时testbench时钟周期要减小,我减小到了always #0.15 clk = ~clk;

测试数据如下(没有对jr跳转31号以外寄存器的情况进行测试)


Update: 2025.11.12

今天有同学跟我反映数据太长直接复制会导致浏览器卡死,哈哈哈确实,没考虑到这个DOM相关的问题,我把数据上传到这里了,链接在此请大家有需要ctrl+s下载 或者鼠标右键另存为,如果对你有帮助,可以在评论区say thanks (doge)

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
lui $23, 58778
sw $11, 3004($0)
lui $8, 36882
sub $16, $0, $18
nop
ori $2, $25, 39090
add $6, $24, $17
beq $11, $15, label_508
label_508_back:
j label_561
label_561_back:
ori $14, $0, 1110
j label_337
label_337_back:
add $18, $2, $3
nop
lw $19, 8808($0)
ori $15, $0, 56195
j label_678
label_678_back:
lui $14, 42089
nop
sw $7, 11968($0)
lui $21, 5507
lui $15, 5025
sub $15, $22, $23
sub $25, $15, $17
nop
jal label_852
label_852_back:
nop
j label_422
label_422_back:
nop
sw $8, 5060($0)
lui $16, 896
lui $17, 49975
add $11, $5, $21
add $8, $24, $23
sw $8, 564($0)
sub $5, $8, $23
sw $3, 10960($0)
j label_672
label_672_back:
ori $15, $10, 5713
ori $13, $6, 53986
lui $15, 50874
sub $11, $25, $7
lui $17, 34811
nop
sub $19, $23, $18
jal label_232
label_232_back:
nop
sub $11, $15, $23
add $17, $21, $5
jal label_281
label_281_back:
lui $21, 8699
ori $12, $16, 59274
add $13, $13, $10
nop
nop
========================
========================
========================
  • 后面的省略了,请下载源文件查看

北航计组-P4课下
http://pzhwuhu.github.io/2024/11/11/P4课下/
本文作者
pzhwuhu
发布于
2024年11月11日
更新于
2025年11月12日
许可协议