This repository was archived by the owner on Mar 24, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalu.v
More file actions
75 lines (69 loc) · 1.51 KB
/
alu.v
File metadata and controls
75 lines (69 loc) · 1.51 KB
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
`include "ctrl_encode_def.v"
module alu(A, B, ALUOp, C, Zero);
input signed [31:0] A, B;
input [4:0] ALUOp;
output signed [31:0] C;
output Zero; //condition flag: set if condition is true for B-type instruction
reg [31:0] C;
integer i;
reg ZF;
/// beq 001
/// bne 010
/// blt 011
/// bge 100
/// bltu 101
/// bgeu 110
always @( * ) begin
case ( ALUOp )
`ALUOp_lui:begin C=B;ZF=0;end
`ALUOp_add:begin C=A+B;ZF=0; end
`ALUOp_sub:
begin
C=A-B;
ZF=0;
if (C==0)
ZF = 1;
end //and beq
`ALUOp_xor:begin C=A^B;ZF=0; end // xori
`ALUOp_or:begin C=A|B;ZF=0;end // ori
`ALUOp_and:begin C=A&B;ZF=0;end // andi
`ALUOp_sll:begin C=A<<B;ZF=0;end // slli
`ALUOp_srl:begin C=A>>B; ZF=0;end // srli
`ALUOp_sra:begin C=A>>>B; ZF=0;end // srai
`ALUOp_slt:begin C=A<B?1:32'b0;ZF=0;end // 包含slti
`ALUOp_sltu:begin C=$unsigned(A)<$unsigned(B)?1:32'b0;ZF=0;end // 包含sltiu
`ALUOp_bne:begin
C=A-B;
ZF=0;
if (C!=0)
ZF=1;
end
`ALUOp_blt:begin
C=A<B?1:32'b0;
ZF=0;
if (C==1)
ZF=1;
end
`ALUOp_bge:begin
C=A>B?1:32'b0;
ZF=0;
if (C==1)
ZF=1;
end
`ALUOp_bltu:begin
C=$unsigned(A)<$unsigned(B)?1:32'b0;
ZF=0;
if (C==1)
ZF=1;
end
`ALUOp_bgeu:begin
C=$unsigned(A)>=$unsigned(B)?1:32'b0;
ZF=0;
if (C==1)
ZF=1;
end
default: begin C=A;ZF=0; end
endcase
end
assign Zero = ZF;
endmodule