Skip to content

Commit 4e31989

Browse files
authored
Merge pull request #21 from quantumxiaol/CPU_Liu
0xbfc7d7dc
2 parents c074c5c + 563f098 commit 4e31989

2 files changed

Lines changed: 40 additions & 21 deletions

File tree

Sample/ID.v

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,24 @@ module ID(
220220

221221
wire inst_jalr; // 无条件跳转。跳转目标为寄存器 rs 中的值。
222222
// 同时将该分支对应延迟槽指令之后的指令的 PC 值保存至第 31 号通用寄存器中。
223-
wire inst_bgezal;
224-
wire inst_j;
223+
224+
wire inst_j; // 无条件跳转。跳转目标由该分支指令对应的延迟槽指令的 PC 的最高 4 位与立即数 instr_index 左移2 位后的值拼接得到。
225225
wire inst_bltz;
226-
wire inst_blez;
227-
wire inst_bgtz;
228-
wire inst_bgez;
226+
wire inst_blez; // 如果寄存器 rs 的值小于等于 0 则转移,否则顺序执行。转移目标由立即数 offset 左移 2 位并进行有
227+
// 符号扩展的值加上该分支指令对应的延迟槽指令的 PC 计算得到。
228+
wire inst_bgtz; // 如果寄存器 rs 的值大于 0 则转移,否则顺序执行。转移目标由立即数 offset 左移 2 位并进行有符号
229+
// 扩展的值加上该分支指令对应的延迟槽指令的 PC 计算得到。
230+
wire inst_bgez; // 如果寄存器 rs 的值大于等于 0 则转移,否则顺序执行。转移目标由立即数 offset 左移 2 位并进行有
231+
// 符号扩展的值加上该分支指令对应的延迟槽指令的 PC 计算得到。
229232
wire inst_bnez;
230-
wire inst_bltzal;
233+
234+
wire inst_bgezal; // 如果寄存器 rs 的值大于等于 0 则转移,否则顺序执行。转移目标由立即数 offset 左移 2 位并进行有
235+
// 符号扩展的值加上该分支指令对应的延迟槽指令的 PC 计算得到。无论转移与否,将该分支对应延
236+
// 迟槽指令之后的指令的 PC 值保存至第 31 号通用寄存器中。
237+
238+
wire inst_bltzal; // 如果寄存器 rs 的值小于 0 则转移,否则顺序执行。转移目标由立即数 offset 左移 2 位并进行有符号
239+
// 扩展的值加上该分支指令对应的延迟槽指令的 PC 计算得到。无论转移与否,将该分支对应延迟槽
240+
// 指令之后的指令的 PC 值保存至第 31 号通用寄存器中。
231241

232242
//访存指令
233243
wire inst_lw; // 将 base 寄存器的值加上符号扩展后的立即数 offset 得到访存的虚地址,
@@ -366,19 +376,19 @@ module ID(
366376
// 不等转移
367377
assign inst_bne = op_d[6'b00_0101];
368378
// 大于等于 0 转移
369-
assign inst_bnez = op_d[6'b00_0001] & rt_d[6'b0_0001];
379+
assign inst_bnez = op_d[6'b00_0001] & rt_d[5'b0_0001];
370380
// 大于 0 转移
371-
assign inst_bgtz = op_d[6'b00_0111] & rt_d[6'b0_0000];
381+
assign inst_bgtz = op_d[6'b00_0111] & rt_d[5'b0_0000];
372382
// 小于等于 0 转移
373-
assign inst_blez = op_d[6'b00_0110] & rt_d[6'b0_0000];
383+
assign inst_blez = op_d[6'b00_0110] & rt_d[5'b0_0000];
374384
// 小于 0 转移
375-
assign inst_bltz = op_d[6'b00_0001] & rt_d[6'b0_0000];
385+
assign inst_bltz = op_d[6'b00_0001] & rt_d[5'b0_0000];
376386
// 小于 0 调用子程序并保存返回地址
377-
assign inst_bgtzal = op_d[6'b00_0001] & rt_d[6'b1_0000];
387+
assign inst_bgtzal = op_d[6'b00_0001] & rt_d[5'b1_0000];
378388
// 大于等于 0 调用子程序并保存返回地址
379-
assign inst_bgezal = op_d[6'b00_0001] & rt_d[6'b1_0001];
380-
381-
assign inst_bgez = op_d[6'b00_0001] & rt_d[6'b0_0001];
389+
assign inst_bgezal = op_d[6'b00_0001] & rt_d[5'b1_0001];
390+
// 大于等于 0 转移
391+
assign inst_bgez = op_d[6'b00_0001] & rt_d[5'b0_0001];
382392

383393
// 无条件直接跳转
384394
assign inst_j = op_d[6'b00_0010];
@@ -387,9 +397,9 @@ module ID(
387397
// 无条件寄存器跳转
388398
assign inst_jr = op_d[6'b00_0000] & func_d[6'b00_1000] & rt_d[5'b0_0000] & rd_d[5'b0_0000] & sa_d[5'b0_0000];
389399
// 无条件寄存器跳转至子程序并保存返回地址下
390-
assign inst_jalr = op_d[6'b00_0000] & rt_d[6'b0_0000] & func_d[6'b00_1001];
400+
assign inst_jalr = op_d[6'b00_0000] & rt_d[5'b0_0000] & func_d[6'b00_1001];
391401
// 小于 0 调用子程序并保存返回地址
392-
assign inst_bltzal = op_d[6'b00_0001] & rt_d[6'b1_0000];
402+
assign inst_bltzal = op_d[6'b00_0001] & rt_d[5'b1_0000];
393403

394404

395405
// """数据移动指令"""
@@ -442,14 +452,18 @@ module ID(
442452
inst_lb | inst_lbu | inst_lh | inst_lhu | inst_sh | inst_sb;
443453

444454
// 32'b8 to reg2
445-
assign sel_alu_src2[2] = inst_jal | inst_jalr;
455+
assign sel_alu_src2[2] = inst_jal | inst_jalr | inst_bgezal | inst_bltzal;
446456

447457
// imm_zero_extend to reg2
448458
assign sel_alu_src2[3] = inst_ori | inst_andi | inst_xori;
449459

450460

451461

452-
assign op_add = inst_add | inst_addi | inst_addiu | inst_jal | inst_addu | inst_lw | inst_sw| inst_add | inst_addi;
462+
assign op_add = inst_add | inst_addi | inst_addiu | inst_addu | inst_add | inst_addi |
463+
inst_jal | inst_jalr | inst_bltzal | inst_bgezal |
464+
inst_lw | inst_lb | inst_lbu | inst_lh | inst_lhu | inst_sw | inst_sb | inst_sh
465+
;
466+
453467
assign op_sub = inst_subu | inst_sub;
454468
assign op_slt = inst_slt | inst_slti;
455469
assign op_sltu = inst_sltu | inst_sltiu;
@@ -480,10 +494,11 @@ module ID(
480494

481495
// regfile store enable
482496
assign rf_we = inst_ori | inst_lui | inst_addiu | inst_subu | inst_addu | inst_add | inst_addi | inst_sub |
483-
inst_jr | inst_jal | inst_sll | inst_sllv | inst_sra | inst_srl | inst_srlv | inst_srav|
497+
inst_jr | inst_jal | inst_jalr | inst_bgezal | inst_bltzal |
498+
inst_sll | inst_sllv | inst_sra | inst_srl | inst_srlv | inst_srav |
484499
inst_or | inst_xor | inst_xori | inst_and | inst_andi | inst_nor |
485500
inst_lw | inst_lb | inst_lbu | inst_lh | inst_lhu |
486-
inst_slt | inst_slti | inst_sltu | inst_sltiu| inst_jalr
501+
inst_slt | inst_slti | inst_sltu | inst_sltiu
487502
;
488503

489504

@@ -542,6 +557,10 @@ module ID(
542557
assign pc_plus_4 = id_pc + 32'h4;
543558

544559
assign rs_eq_rt = (ndata1 == ndata2);
560+
assign rs_ge_z = (!ndata1[31]); // >=跳转
561+
assign rs_gt_z = ((!ndata1[31]) && ndata1!=0); // >跳转
562+
assign rs_le_z = (ndata1 == 0 | ndata1[31]); // <=跳转
563+
assign rs_lt_z = (ndata1[31]); // <跳转
545564

546565
assign br_e = inst_beq & rs_eq_rt | inst_j | inst_jalr | | inst_jr | inst_jal | inst_bne & ~rs_eq_rt |
547566
inst_bgez & rs_ge_z | inst_bgtz & rs_gt_z |inst_blez & rs_le_z | inst_bltz & rs_lt_z |
@@ -554,7 +573,7 @@ module ID(
554573
(inst_jal ? {pc_plus_4[31:28],instr_index,2'b0} : 32'b0) |
555574
(inst_j ? ({ pc_plus_4[31:28],inst[25:0],2'b0}) : 32'b0) |
556575
(inst_jalr ? ndata1:32'b0) |
557-
576+
558577
(inst_bne ? (pc_plus_4 + {{14{inst[15]}},inst[15:0],2'b0}) : 32'b0) |
559578
(inst_bgez ? (pc_plus_4 + {{14{inst[15]}},inst[15:0],2'b0}) : 32'b0) |
560579
(inst_bgtz ? (pc_plus_4 + {{14{inst[15]}},inst[15:0],2'b0}) : 32'b0) |

screenshot/error0xbfc7d7dc.jpg

382 KB
Loading

0 commit comments

Comments
 (0)