Nxbyte Arm-Legv8
Nxbyte Arm-Legv8
1 contributor
ARM-LEGv8/ARM_CPU.v at master · nxbyte/ARM-LEGv8 · GitHub https://github.com/nxbyte/ARM-LEGv8/blob/master/Pipelined-Only...
32
33 /* Stage : Instruction Fetch */
34 wire PCSrc_wire;
35 wire [63:0] jump_PC_wire;
36 wire [63:0] IFID_PC;
37 wire [31:0] IFID_IC;
38 IFID cache1 (CLOCK, PC, IC, IFID_PC, IFID_IC);
39
40
41 /* Stage : Instruction Decode */
42 wire [1:0] CONTROL_aluop; // EX
43 wire CONTROL_alusrc; // EX
44 wire CONTROL_isZeroBranch; // M
45 wire CONTROL_isUnconBranch; // M
46 wire CONTROL_memRead; // M
47 wire CONTROL_memwrite; // M
48 wire CONTROL_regwrite; // WB
49 wire CONTROL_mem2reg; // WB
50 ARM_Control unit1 (IFID_IC[31:21], CONTROL_aluop, CONTROL_alusrc, CONTROL_isZeroBranch, CONTROL_isUn
51
52 wire [4:0] reg2_wire;
53 ID_Mux unit2(IFID_IC[20:16], IFID_IC[4:0], IFID_IC[28], reg2_wire);
54
55 wire [63:0] reg1_data, reg2_data;
56 wire MEMWB_regwrite;
57 wire [4:0] MEMWB_write_reg;
58 wire [63:0] write_reg_data;
59 Registers unit3(CLOCK, IFID_IC[9:5], reg2_wire, MEMWB_write_reg, write_reg_data, MEMWB_regwrite, reg
60
61 wire [63:0] sign_extend_wire;
62 SignExtend unit4 (IFID_IC, sign_extend_wire);
63
64 wire [1:0] IDEX_aluop;
65 wire IDEX_alusrc;
66 wire IDEX_isZeroBranch;
67 wire IDEX_isUnconBranch;
68 wire IDEX_memRead;
69 wire IDEX_memwrite;
70 wire IDEX_regwrite;
71 wire IDEX_mem2reg;
72 wire [63:0] IDEX_reg1_data;
73 wire [63:0] IDEX_reg2_data;
74 wire [63:0] IDEX_PC;
75 wire [63:0] IDEX_sign_extend;
76 wire [10:0] IDEX_alu_control;
77 wire [4:0] IDEX_write_reg;
78 IDEX cache2 (CLOCK, CONTROL_aluop, CONTROL_alusrc, CONTROL_isZeroBranch, CONTROL_isUnconBranch, CONT
79
80
81 /* Stage : Execute */
82 wire [63:0] shift_left_wire;
134
135 module IDEX
136 (
137 input CLOCK,
138 input [1:0] aluop_in, // EX Stage
139 input alusrc_in, // EX Stage
140 input isZeroBranch_in, // M Stage
141 input isUnconBranch_in, // M Stage
142 input memRead_in, // M Stage
143 input memwrite_in, // M Stage
144 input regwrite_in, // WB Stage
145 input mem2reg_in, // WB Stage
146 input [63:0] PC_in,
147 input [63:0] regdata1_in,
148 input [63:0] regdata2_in,
149 input [63:0] sign_extend_in,
150 input [10:0] alu_control_in,
151 input [4:0] write_reg_in,
152 output reg [1:0] aluop_out, // EX Stage
153 output reg alusrc_out, // EX Stage
154 output reg isZeroBranch_out, // M Stage
155 output reg isUnconBranch_out, // M Stage
156 output reg memRead_out, // M Stage
157 output reg memwrite_out, // M Stage
158 output reg regwrite_out, // WB Stage
159 output reg mem2reg_out, // WB Stage
160 output reg [63:0] PC_out,
161 output reg [63:0] regdata1_out,
162 output reg [63:0] regdata2_out,
163 output reg [63:0] sign_extend_out,
164 output reg [10:0] alu_control_out,
165 output reg [4:0] write_reg_out
166 );
167
168 always @(negedge CLOCK) begin
169 /* Values for EX */
170 aluop_out <= aluop_in;
171 alusrc_out <= alusrc_in;
172
173 /* Values for M */
174 isZeroBranch_out <= isZeroBranch_in;
175 isUnconBranch_out <= isUnconBranch_in;
176 memRead_out <= memRead_in;
177 memwrite_out <= memwrite_in;
178
179 /* Values for WB */
180 regwrite_out <= regwrite_in;
181 mem2reg_out <= mem2reg_in;
182
183 /* Values for all Stages */
184 PC_out <= PC_in;
389 );
390
391 reg [63:0] Data[31:0];
392
393 integer initCount;
394
395 initial begin
396 for (initCount = 0; initCount < 32; initCount = initCount + 1) begin
397 Data[initCount] = initCount * 100;
398 end
399
400 Data[10] = 1540;
401 Data[11] = 2117;
402 end
403
404 always @(*) begin
405 if (CONTROL_MemWrite == 1'b1) begin
406 Data[inputAddress] = inputData;
407 end else if (CONTROL_MemRead == 1'b1) begin
408 outputData = Data[inputAddress];
409 end else begin
410 outputData = 64'hxxxxxxxx;
411 end
412
413 // Debug use only
414 for (initCount = 0; initCount < 32; initCount = initCount + 1) begin
415 $display("RAM[%0d] = %0d", initCount, Data[initCount]);
416 end
417 end
418 endmodule
419
420
421 module ALU
422 (
423 input [63:0] A,
424 input [63:0] B,
425 input [3:0] CONTROL,
426 output reg [63:0] RESULT,
427 output reg ZEROFLAG
428 );
429
430 always @(*) begin
431 case (CONTROL)
432 4'b0000 : RESULT = A & B;
433 4'b0001 : RESULT = A | B;
434 4'b0010 : RESULT = A + B;
435 4'b0110 : RESULT = A - B;
436 4'b0111 : RESULT = B;
437 4'b1100 : RESULT = ~(A | B);
438 default : RESULT = 64'hxxxxxxxx;
439 endcase
440
441 if (RESULT == 0) begin
442 ZEROFLAG = 1'b1;
443 end else if (RESULT != 0) begin
444 ZEROFLAG = 1'b0;
445 end else begin
446 ZEROFLAG = 1'bx;
447 end
448 end
449 endmodule
450
451
452 module ALU_Control
453 (
454 input [1:0] ALU_Op,
455 input [10:0] ALU_INSTRUCTION,
456 output reg [3:0] ALU_Out
457 );
458
459 always @(ALU_Op or ALU_INSTRUCTION) begin
460 case (ALU_Op)
461 2'b00 : ALU_Out = 4'b0010;
462 2'b01 : ALU_Out = 4'b0111;
463 2'b10 : begin
464
465 case (ALU_INSTRUCTION)
466 11'b10001011000 : ALU_Out = 4'b0010; // ADD
467 11'b11001011000 : ALU_Out = 4'b0110; // SUB
468 11'b10001010000 : ALU_Out = 4'b0000; // AND
469 11'b10101010000 : ALU_Out = 4'b0001; // ORR
470 endcase
471 end
472 default : ALU_Out = 4'bxxxx;
473 endcase
474 end
475 endmodule
476
477
478 module ALU_Mux
479 (
480 input [63:0] input1,
481 input [63:0] input2,
482 input CONTROL_ALUSRC,
483 output reg [63:0] out
484 );
485
486 always @(input1, input2, CONTROL_ALUSRC, out) begin
487 if (CONTROL_ALUSRC == 0) begin
488 out <= input1;
489 end
490
593
594 module ARM_Control
595 (
596 input [10:0] instruction,
597 output reg [1:0] control_aluop,
598 output reg control_alusrc,
599 output reg control_isZeroBranch,
600 output reg control_isUnconBranch,
601 output reg control_memRead,
602 output reg control_memwrite,
603 output reg control_regwrite,
604 output reg control_mem2reg
605 );
606
607 always @(instruction) begin
608 /* B */
609 if (instruction[10:5] == 6'b000101) begin
610 control_mem2reg <= 1'bx;
611 control_memRead <= 1'b0;
612 control_memwrite <= 1'b0;
613 control_alusrc <= 1'b0;
614 control_aluop <= 2'b01;
615 control_isZeroBranch <= 1'b0;
616 control_isUnconBranch <= 1'b1;
617 control_regwrite <= 1'b0;
618 end
619
620 /* CBZ */
621 else if (instruction[10:3] == 8'b10110100) begin
622 control_mem2reg <= 1'bx;
623 control_memRead <= 1'b0;
624 control_memwrite <= 1'b0;
625 control_alusrc <= 1'b0;
626 control_aluop <= 2'b01;
627 control_isZeroBranch <= 1'b1;
628 control_isUnconBranch <= 1'b0;
629 control_regwrite <= 1'b0;
630 end
631
632 /* R-Type Instructions */
633 else begin
634 control_isZeroBranch <= 1'b0;
635 control_isUnconBranch <= 1'b0;
636
637 case (instruction[10:0])
638
639 /* LDUR */
640 11'b11111000010 : begin
641 control_mem2reg <= 1'b1;
642 control_memRead <= 1'b1;
643 control_memwrite <= 1'b0;