@@ -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 ) |
0 commit comments