Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.85 KB | None | 0 0
  1. // Stall Code
  2. module stall_logic(fd_instr, dx_instr, isStall);
  3. input [31:0] fd_instr, dx_instr;
  4. output isStall;
  5.  
  6. // Check if the same register number is accessed in 2 different locations of the pipeline.
  7. wire fdrs_equal_dxrd, fdrd_equal_dxrd, fdrt_equal_dxrd;
  8. equal5 fdrs_equal_dxrd1(fd_rs, dx_rd, fdrs_equal_dxrd);
  9. equal5 fdrd_equal_dxrd2(fd_rd, dx_rd, fdrd_equal_dxrd);
  10. equal5 fdrt_equal_dxrd3(fd_rt, dx_rd, fdrt_equal_dxrd);
  11.  
  12. wire writing_dx_into_reg0;
  13. equal5 dx_instr_rd0(dx_rd, 5'b0, writing_dx_into_reg0);
  14.  
  15. wire rtype_stall, itype_stall;
  16. assign rtype_stall = (fd_is_alu_op_excluding_addi) & (fdrs_equal_dxrd || fdrt_equal_dxrd) & dx_is_lw & ~writing_dx_into_reg0;
  17. assign itype_stall = dx_is_lw & ~writing_dx_into_reg0 & (fd_is_bne | fd_is_blt | fd_is_jr | fd_is_lw | fd_is_sw | fd_is_addi) & (fdrs_equal_dxrd || fdrd_equal_dxrd);
  18.  
  19. assign isStall = itype_stall | rtype_stall;
  20. endmodule
  21.  
  22. // Bypass Code
  23. module bypass_WD_regA(fd_instr, mw_instr, is_bypass_WD_regA);
  24. input [31:0] fd_instr, mw_instr;
  25. output is_bypass_WD_regA;
  26.  
  27. wire mw_instr_we, writing_mw_into_reg0, fdrs_equal_mwrd, fdrd_equal_mwrd;
  28. wire [4:0] mw_rd, fd_opcode, fd_rd, fd_rs, fd_rt;
  29.  
  30. // Decode latch instructions
  31. decode_general_instr dgi_mw1(.instr(mw_instr), .rd(mw_rd));
  32. decode_general_instr dgi_mw2(.instr(fd_instr), .opcode(fd_opcode), .rd(fd_rd), .rs(fd_rs), .rt(fd_rt));
  33.  
  34.  
  35. // Instructions that writeback to register
  36. get_ctrl_writeEnable we_mw1(mw_instr, mw_instr_we);
  37. equal5 mw_instr_rd0(mw_rd, 5'b0, writing_mw_into_reg0);
  38.  
  39. equal5 fdrs_equal_mwrd1(fd_rs, mw_rd, fdrs_equal_mwrd);
  40. equal5 fdrd_equal_mwrd2(fd_rd, mw_rd, fdrd_equal_mwrd);
  41.  
  42.  
  43. // Decode opcode (Requirement: decode_general_instr)
  44. wire fd_neq, fd_lt, fd_is_alu_op_excluding_addi, fd_is_addi, fd_is_sw, fd_is_lw, fd_is_j, fd_is_bne, fd_is_jal, fd_is_jr, fd_is_blt, fd_is_bex_wo_rstatus, fd_is_setx;
  45. assign fd_neq = 1'b1; // Before computing neq in alu. checking if opcodes match
  46. assign fd_lt = 1'b1; // Before computing lt in alu. checking if opcodes match
  47. decode_opcode doc(.opcode(fd_opcode), .neq(fd_neq), .lt(fd_lt), .is_alu_op_excluding_addi(fd_is_alu_op_excluding_addi), .is_addi(fd_is_addi), .is_sw(fd_is_sw), .is_lw(fd_is_lw), .is_j(fd_is_j), .is_bne(fd_is_bne), .is_jal(fd_is_jal), .is_jr(fd_is_jr), .is_blt(fd_is_blt), .is_bex_wo_rstatus(fd_is_bex_wo_rstatus), .is_setx(fd_is_setx));
  48.  
  49. wire bypass_fdrs_equal_mwrd, bypass_fdrd_equal_mwrd;
  50. assign bypass_fdrs_equal_mwrd = (fd_is_alu_op_excluding_addi | fd_is_lw | fd_is_sw | fd_is_addi) & fdrs_equal_mwrd;
  51. assign bypass_fdrd_equal_mwrd = (fd_is_blt | fd_is_jr | fd_is_bne) & fdrd_equal_mwrd;
  52.  
  53. assign is_bypass_WD_regA = mw_instr_we & ~writing_mw_into_reg0 & (bypass_fdrd_equal_mwrd | bypass_fdrs_equal_mwrd);
  54. endmodule
  55.  
  56. module bypass_WD_regB(fd_instr, mw_instr, is_bypass_WD_regB);
  57. input [31:0] fd_instr, mw_instr;
  58. output is_bypass_WD_regB;
  59.  
  60. wire mw_instr_we, writing_mw_into_reg0, fdrs_equal_mwrd, fdrd_equal_mwrd;
  61. wire [4:0] mw_rd, fd_opcode, fd_rd, fd_rs, fd_rt;
  62.  
  63. // Decode latch instructions
  64. decode_general_instr dgi_mw1(.instr(mw_instr), .rd(mw_rd));
  65. decode_general_instr dgi_fd2(.instr(fd_instr), .opcode(fd_opcode), .rd(fd_rd), .rs(fd_rs), .rt(fd_rt));
  66.  
  67.  
  68. // Instructions that writeback to register
  69. get_ctrl_writeEnable we_mw1(mw_instr, mw_instr_we);
  70.  
  71. // Check if the same register number is accessed in 2 different locations of the pipeline.
  72. wire fdrt_equal_mwrd;
  73. equal5 fdrs_equal_mwrd1(fd_rs, mw_rd, fdrs_equal_mwrd);
  74. equal5 fdrd_equal_mwrd2(fd_rd, mw_rd, fdrd_equal_mwrd);
  75. equal5 fdrd_equal_mwrd3(fd_rt, mw_rd, fdrt_equal_mwrd);
  76.  
  77. // Check if writeback is writing into $0.
  78. equal5 mw_instr_rd0(mw_rd, 5'b0, writing_mw_into_reg0);
  79.  
  80. // Decode opcode (Requirement: decode_general_instr)
  81. wire fd_neq, fd_lt, fd_is_alu_op_excluding_addi, fd_is_addi, fd_is_sw, fd_is_lw, fd_is_j, fd_is_bne, fd_is_jal, fd_is_jr, fd_is_blt, fd_is_bex_wo_rstatus, fd_is_setx;
  82. assign fd_neq = 1'b1; // Before computing neq in alu. checking if opcodes match
  83. assign fd_lt = 1'b1; // Before computing lt in alu. checking if opcodes match
  84. decode_opcode doc1(.opcode(fd_opcode), .neq(fd_neq), .lt(fd_lt), .is_alu_op_excluding_addi(fd_is_alu_op_excluding_addi), .is_addi(fd_is_addi), .is_sw(fd_is_sw), .is_lw(fd_is_lw), .is_j(fd_is_j), .is_bne(fd_is_bne), .is_jal(fd_is_jal), .is_jr(fd_is_jr), .is_blt(fd_is_blt), .is_bex_wo_rstatus(fd_is_bex_wo_rstatus), .is_setx(fd_is_setx));
  85.  
  86. wire bypass_fdrd_equal_mwrd, bypass_fdrs_equal_mwrd, bypass_fdrt_equal_mwrd;
  87. assign bypass_fdrd_equal_mwrd = (fd_is_lw | fd_is_sw) & fdrd_equal_mwrd;
  88. assign bypass_fdrs_equal_mwrd = (fd_is_blt | fd_is_jr | fd_is_bne) & fdrs_equal_mwrd;
  89. assign bypass_fdrt_equal_mwrd = (fd_is_alu_op_excluding_addi) & fdrt_equal_mwrd;
  90.  
  91. assign is_bypass_WD_regB = mw_instr_we & ~writing_mw_into_reg0 & (bypass_fdrd_equal_mwrd | bypass_fdrs_equal_mwrd | bypass_fdrt_equal_mwrd);
  92. endmodule
  93.  
  94. module bypass_WX_regA(dx_instr, xm_instr, mw_instr, is_bypass_WX_regA);
  95. input [31:0] dx_instr, xm_instr, mw_instr;
  96. output is_bypass_WX_regA;
  97.  
  98. wire [4:0] dx_opcode, dx_rd, dx_rs, dx_rt, xm_rd, mw_rd;
  99. wire mw_instr_we, dxrs_equal_mwrd, dxrd_equal_mwrd, dxrt_equal_mwrd, dxrs_equal_xmrd, dxrd_equal_xmrd, dxrt_equal_xmrd, writing_mw_into_reg0;
  100. // Decode latch instructions
  101. decode_general_instr dgi_dx1(.instr(dx_instr), .opcode(dx_opcode), .rd(dx_rd), .rs(dx_rs), .rt(dx_rt));
  102. decode_general_instr dgi_xm2(.instr(xm_instr), .rd(xm_rd));
  103. decode_general_instr dgi_mw3(.instr(mw_instr), .rd(mw_rd));
  104.  
  105.  
  106. // Calculate WE
  107. get_ctrl_writeEnable we_mw1(mw_instr, mw_instr_we);
  108.  
  109.  
  110. // Check if the same register number is accessed in 2 different locations of the pipeline.
  111. equal5 fdrs_equal_mwrd1(dx_rs, mw_rd, dxrs_equal_mwrd);
  112. equal5 fdrd_equal_mwrd2(dx_rd, mw_rd, dxrd_equal_mwrd);
  113. equal5 fdrt_equal_mwrd3(dx_rt, mw_rd, dxrt_equal_mwrd);
  114.  
  115. equal5 fdrs_equal_xmrd1(dx_rs, xm_rd, dxrs_equal_xmrd);
  116. equal5 fdrd_equal_xmrd2(dx_rd, xm_rd, dxrd_equal_xmrd);
  117. equal5 fdrt_equal_xmrd3(dx_rt, xm_rd, dxrt_equal_xmrd);
  118.  
  119. // Check if writeback is writing into $0.
  120. equal5 mw_instr_rd0(mw_rd, 5'b0, writing_mw_into_reg0);
  121.  
  122. // Decode opcode (Requirement: decode_general_instr)
  123. wire dx_neq, dx_lt, dx_is_alu_op_excluding_addi, dx_is_addi, dx_is_sw, dx_is_lw, dx_is_j, dx_is_bne, dx_is_jal, dx_is_jr, dx_is_blt, dx_is_bex_wo_rstatus, dx_is_setx;
  124. assign dx_neq = 1'b1; // Before computing neq in alu. checking if opcodes match
  125. assign dx_lt = 1'b1; // Before computing lt in alu. checking if opcodes match
  126. decode_opcode doc2(.opcode(dx_opcode), .neq(dx_neq), .lt(dx_lt), .is_alu_op_excluding_addi(dx_is_alu_op_excluding_addi), .is_addi(dx_is_addi), .is_sw(dx_is_sw), .is_lw(dx_is_lw), .is_j(dx_is_j), .is_bne(dx_is_bne), .is_jal(dx_is_jal), .is_jr(dx_is_jr), .is_blt(dx_is_blt), .is_bex_wo_rstatus(dx_is_bex_wo_rstatus), .is_setx(dx_is_setx));
  127.  
  128.  
  129. // Map rd,rt,rs to rd
  130. wire bypass_fdrd_equal_mwrd, bypass_fdrs_equal_mwrd;
  131. assign bypass_fdrs_equal_mwrd = (dx_is_alu_op_excluding_addi | dx_is_addi | dx_is_lw | dx_is_sw) & ~dxrs_equal_xmrd & dxrs_equal_mwrd;
  132. assign bypass_fdrd_equal_mwrd = (dx_is_bne | dx_is_blt | dx_is_jr) & ~dxrd_equal_xmrd & dxrd_equal_mwrd;
  133.  
  134. assign is_bypass_WX_regA = mw_instr_we & ~writing_mw_into_reg0 & (bypass_fdrd_equal_mwrd || bypass_fdrs_equal_mwrd);
  135. endmodule
  136.  
  137. module bypass_MX_regA(dx_instr, xm_instr, mw_instr, is_bypass_MX_regA);
  138. input [31:0] dx_instr, xm_instr, mw_instr;
  139. output is_bypass_MX_regA;
  140.  
  141. wire [4:0] dx_opcode, dx_rd, dx_rs, dx_rt, xm_rd, mw_rd;
  142. wire xm_instr_we, dxrs_equal_mwrd, dxrd_equal_mwrd, dxrt_equal_mwrd, dxrs_equal_xmrd, dxrd_equal_xmrd, dxrt_equal_xmrd, writing_xm_into_reg0;
  143. // Decode latch instructions
  144. decode_general_instr dgi_dx1(.instr(dx_instr), .opcode(dx_opcode), .rd(dx_rd), .rs(dx_rs), .rt(dx_rt));
  145. decode_general_instr dgi_xm2(.instr(xm_instr), .rd(xm_rd));
  146. decode_general_instr dgi_mw3(.instr(mw_instr), .rd(mw_rd));
  147.  
  148.  
  149. // Calculate WE
  150. get_ctrl_writeEnable we_xm1(xm_instr, xm_instr_we);
  151.  
  152.  
  153. // Check if the same register number is accessed in 2 different locations of the pipeline.
  154. equal5 fdrs_equal_mwrd1(dx_rs, mw_rd, dxrs_equal_mwrd);
  155. equal5 fdrd_equal_mwrd2(dx_rd, mw_rd, dxrd_equal_mwrd);
  156. equal5 fdrt_equal_mwrd3(dx_rt, mw_rd, dxrt_equal_mwrd);
  157.  
  158. equal5 fdrs_equal_xmrd1(dx_rs, xm_rd, dxrs_equal_xmrd);
  159. equal5 fdrd_equal_xmrd2(dx_rd, xm_rd, dxrd_equal_xmrd);
  160. equal5 fdrt_equal_xmrd3(dx_rt, xm_rd, dxrt_equal_xmrd);
  161.  
  162. // Check if writeback is writing into $0.
  163. equal5 mw_instr_rd0(xm_rd, 5'b0, writing_xm_into_reg0);
  164.  
  165. // Decode opcode (Requirement: decode_general_instr)
  166. wire dx_neq, dx_lt, dx_is_alu_op_excluding_addi, dx_is_addi, dx_is_sw, dx_is_lw, dx_is_j, dx_is_bne, dx_is_jal, dx_is_jr, dx_is_blt, dx_is_bex_wo_rstatus, dx_is_setx;
  167. assign dx_neq = 1'b1; // Before computing neq in alu. checking if opcodes match
  168. assign dx_lt = 1'b1; // Before computing lt in alu. checking if opcodes match
  169. decode_opcode doc2(.opcode(dx_opcode), .neq(dx_neq), .lt(dx_lt), .is_alu_op_excluding_addi(dx_is_alu_op_excluding_addi), .is_addi(dx_is_addi), .is_sw(dx_is_sw), .is_lw(dx_is_lw), .is_j(dx_is_j), .is_bne(dx_is_bne), .is_jal(dx_is_jal), .is_jr(dx_is_jr), .is_blt(dx_is_blt), .is_bex_wo_rstatus(dx_is_bex_wo_rstatus), .is_setx(dx_is_setx));
  170.  
  171. // Map rd,rt,rs to rd
  172. wire bypass_dxrd_equal_xmrd, bypass_dxrs_equal_xmrd;
  173. assign bypass_dxrs_equal_xmrd = (dx_is_alu_op_excluding_addi | dx_is_addi | dx_is_sw | dx_is_lw) & dxrs_equal_xmrd;
  174. assign bypass_dxrd_equal_xmrd = (dx_is_bne | dx_is_blt | dx_is_jr) & dxrd_equal_xmrd;
  175.  
  176. assign is_bypass_MX_regA = xm_instr_we & ~writing_xm_into_reg0 & (bypass_dxrd_equal_xmrd | bypass_dxrs_equal_xmrd);
  177. endmodule
  178.  
  179. module bypass_WX_regB(dx_instr, xm_instr, mw_instr, is_bypass_WX_regB);
  180. input [31:0] dx_instr, xm_instr, mw_instr;
  181. output is_bypass_WX_regB;
  182.  
  183. wire [4:0] dx_opcode, dx_rd, dx_rs, dx_rt, xm_rd, mw_rd;
  184. wire xm_instr_we, dxrs_equal_mwrd, dxrd_equal_mwrd, dxrt_equal_mwrd, dxrs_equal_xmrd, dxrd_equal_xmrd, dxrt_equal_xmrd, writing_mw_into_reg0;
  185. // Decode latch instructions
  186. decode_general_instr dgi_dx1(.instr(dx_instr), .opcode(dx_opcode), .rd(dx_rd), .rs(dx_rs), .rt(dx_rt));
  187. decode_general_instr dgi_xm2(.instr(xm_instr), .rd(xm_rd));
  188. decode_general_instr dgi_mw3(.instr(mw_instr), .rd(mw_rd));
  189.  
  190.  
  191. // Calculate WE
  192. wire mw_instr_we;
  193. get_ctrl_writeEnable we_xm1(mw_instr, mw_instr_we);
  194.  
  195.  
  196. // Check if the same register number is accessed in 2 different locations of the pipeline.
  197. equal5 fdrs_equal_mwrd1(dx_rs, mw_rd, dxrs_equal_mwrd);
  198. equal5 fdrd_equal_mwrd2(dx_rd, mw_rd, dxrd_equal_mwrd);
  199. equal5 fdrt_equal_mwrd3(dx_rt, mw_rd, dxrt_equal_mwrd);
  200.  
  201. equal5 fdrs_equal_xmrd1(dx_rs, xm_rd, dxrs_equal_xmrd);
  202. equal5 fdrd_equal_xmrd2(dx_rd, xm_rd, dxrd_equal_xmrd);
  203. equal5 fdrt_equal_xmrd3(dx_rt, xm_rd, dxrt_equal_xmrd);
  204.  
  205. // Check if writeback is writing into $0.
  206. equal5 mw_instr_rd1(mw_rd, 5'b0, writing_mw_into_reg0);
  207.  
  208. // Decode opcode (Requirement: decode_general_instr)
  209. wire dx_neq, dx_lt, dx_is_alu_op_excluding_addi, dx_is_addi, dx_is_sw, dx_is_lw, dx_is_j, dx_is_bne, dx_is_jal, dx_is_jr, dx_is_blt, dx_is_bex_wo_rstatus, dx_is_setx;
  210. assign dx_neq = 1'b1; // Before computing neq in alu. checking if opcodes match
  211. assign dx_lt = 1'b1; // Before computing lt in alu. checking if opcodes match
  212. decode_opcode doc1(.opcode(dx_opcode), .neq(dx_neq), .lt(dx_lt), .is_alu_op_excluding_addi(dx_is_alu_op_excluding_addi), .is_addi(dx_is_addi), .is_sw(dx_is_sw), .is_lw(dx_is_lw), .is_j(dx_is_j), .is_bne(dx_is_bne), .is_jal(dx_is_jal), .is_jr(dx_is_jr), .is_blt(dx_is_blt), .is_bex_wo_rstatus(dx_is_bex_wo_rstatus), .is_setx(dx_is_setx));
  213.  
  214. // Map rd,rt,rs to rd
  215. wire bypass_dxrs_equal_mwrd, bypass_dxrd_equal_mwrd, bypass_dxrt_equal_mwrd;
  216. assign bypass_dxrs_equal_mwrd = (dx_is_bne | dx_is_blt | dx_is_jr) & ~dxrs_equal_xmrd & dxrs_equal_mwrd;
  217. assign bypass_dxrd_equal_mwrd = (dx_is_sw | dx_is_lw) & ~dxrd_equal_xmrd & dxrd_equal_mwrd;
  218. assign bypass_dxrt_equal_mwrd = (dx_is_alu_op_excluding_addi | dx_is_addi) & ~dxrt_equal_xmrd & dxrt_equal_mwrd;
  219.  
  220. assign is_bypass_WX_regB = mw_instr_we & ~writing_mw_into_reg0 & (bypass_dxrd_equal_mwrd | bypass_dxrs_equal_mwrd | bypass_dxrt_equal_mwrd);
  221. endmodule
  222.  
  223. module bypass_MX_regB(dx_instr, xm_instr, mw_instr, is_bypass_MX_regB,
  224. xm_instr_we, writing_xm_into_reg0, bypass_dxrd_equal_xmrd, bypass_dxrs_equal_xmrd, bypass_dxrt_equal_xmrd);
  225. input [31:0] dx_instr, xm_instr, mw_instr;
  226. output is_bypass_MX_regB;
  227.  
  228. wire [4:0] dx_opcode, dx_rd, dx_rs, dx_rt, xm_rd, mw_rd;
  229. wire xm_instr_we, dxrs_equal_mwrd, dxrd_equal_mwrd, dxrt_equal_mwrd, dxrs_equal_xmrd, dxrd_equal_xmrd, dxrt_equal_xmrd, writing_xm_into_reg0;
  230. output xm_instr_we, writing_xm_into_reg0, bypass_dxrd_equal_xmrd, bypass_dxrs_equal_xmrd, bypass_dxrt_equal_xmrd;
  231. // Decode latch instructions
  232. decode_general_instr dgi_dx1(.instr(dx_instr), .opcode(dx_opcode), .rd(dx_rd), .rs(dx_rs), .rt(dx_rt));
  233. decode_general_instr dgi_xm2(.instr(xm_instr), .rd(xm_rd));
  234. decode_general_instr dgi_mw3(.instr(mw_instr), .rd(mw_rd));
  235.  
  236. // Calculate WE
  237. get_ctrl_writeEnable we_xm1(xm_instr, xm_instr_we);
  238.  
  239. // Check if the same register number is accessed in 2 different locations of the pipeline.
  240. equal5 fdrs_equal_xmrd1(dx_rs, xm_rd, dxrs_equal_xmrd);
  241. equal5 fdrd_equal_xmrd2(dx_rd, xm_rd, dxrd_equal_xmrd);
  242. equal5 fdrt_equal_xmrd3(dx_rt, xm_rd, dxrt_equal_xmrd);
  243.  
  244. // Check if writeback is writing into $0.
  245. wire writing_mw_into_reg0;
  246. equal5 mw_instr_rd0(xm_rd, 5'b0, writing_xm_into_reg0);
  247.  
  248. // Decode opcode (Requirement: decode_general_instr)
  249. wire dx_neq, dx_lt, dx_is_alu_op_excluding_addi, dx_is_addi, dx_is_sw, dx_is_lw, dx_is_j, dx_is_bne, dx_is_jal, dx_is_jr, dx_is_blt, dx_is_bex_wo_rstatus, dx_is_setx;
  250. assign dx_neq = 1'b1; // Before computing neq in alu. checking if opcodes match
  251. assign dx_lt = 1'b1; // Before computing lt in alu. checking if opcodes match
  252. decode_opcode doc2(.opcode(dx_opcode), .neq(dx_neq), .lt(dx_lt), .is_alu_op_excluding_addi(dx_is_alu_op_excluding_addi), .is_addi(dx_is_addi), .is_sw(dx_is_sw), .is_lw(dx_is_lw), .is_j(dx_is_j), .is_bne(dx_is_bne), .is_jal(dx_is_jal), .is_jr(dx_is_jr), .is_blt(dx_is_blt), .is_bex_wo_rstatus(dx_is_bex_wo_rstatus), .is_setx(dx_is_setx));
  253.  
  254. // Map rd,rt,rs to rd
  255. wire bypass_dxrs_equal_xmrd, bypass_dxrd_equal_xmrd, bypass_dxrt_equal_xmrd;
  256. assign bypass_dxrs_equal_xmrd = (dx_is_bne | dx_is_blt | dx_is_jr) & dxrs_equal_xmrd;
  257. assign bypass_dxrd_equal_xmrd = (dx_is_sw | dx_is_lw) & dxrd_equal_xmrd;
  258. assign bypass_dxrt_equal_xmrd = (dx_is_alu_op_excluding_addi | dx_is_addi) & dxrt_equal_xmrd;
  259.  
  260. assign is_bypass_MX_regB = xm_instr_we & ~writing_xm_into_reg0 & (bypass_dxrd_equal_xmrd | bypass_dxrs_equal_xmrd | bypass_dxrt_equal_xmrd);
  261. endmodule
  262.  
  263. module bypass_WM(xm_instr, mw_instr, is_bypass_WM);
  264. input [31:0] mw_instr, xm_instr;
  265. output is_bypass_WM;
  266.  
  267. wire [4:0] xm_rd, mw_rd;
  268. wire writing_mw_into_reg0, xmrd_equal_mwrd, mw_instr_we;
  269.  
  270. // Decode instruction rd.
  271. decode_general_instr dgi_xm1(.instr(xm_instr), .rd(xm_rd));
  272. decode_general_instr dgi_mw1(.instr(mw_instr), .rd(mw_rd));
  273.  
  274. // is mw_rd = xm_rd. rd register is target register for instructions specified in we.
  275. equal5 xmrd_equal_mwrd1(mw_rd, xm_rd, xmrd_equal_mwrd);
  276.  
  277. // Any nonzero value written into reg0 will be 0. This edge case needs to be taken into consideration.
  278. equal5 mw_instr_rd0(mw_rd, 5'b0, writing_mw_into_reg0);
  279.  
  280. // Get write_enable for mw instruction.
  281. get_ctrl_writeEnable we_mw1(mw_instr, mw_instr_we);
  282.  
  283. assign is_bypass_WM = mw_instr_we && xmrd_equal_mwrd && ~writing_mw_into_reg0;
  284. endmodule
  285.  
  286.  
  287. // Decode Helper Functions
  288. module find_ctrl_readRegA(instr, ctrl_readRegA);
  289. input [31:0] instr;
  290. output [4:0] ctrl_readRegA;
  291.  
  292. // Decode General Instruction Calling
  293. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  294. wire [26:0] T;
  295. wire [16:0] N;
  296. decode_general_instr dgi(.instr(instr), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  297. // Decode opcode (Requirement: decode_general_instr)
  298. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  299. assign neq = 1'b0; // Dummy value
  300. assign lt = 1'b0; // Dummy value
  301. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  302.  
  303. assign ctrl_readRegA = (is_alu_op_excluding_addi | is_addi | is_sw | is_lw) ? rs : rd;
  304. endmodule
  305.  
  306. module find_ctrl_readRegB(instr, ctrl_readRegB);
  307. input [31:0] instr;
  308. output [4:0] ctrl_readRegB;
  309. wire [4:0] pre_ctrl_readRegB;
  310.  
  311. // Decode General Instruction Calling
  312. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  313. wire [26:0] T;
  314. wire [16:0] N;
  315. decode_general_instr dgi(.instr(instr), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  316. // Decode opcode (Requirement: decode_general_instr)
  317. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  318. assign neq = 1'b0; // Dummy value
  319. assign lt = 1'b0; // Dummy value
  320. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  321.  
  322. assign pre_ctrl_readRegB = is_alu_op_excluding_addi ? rt : rs;
  323. assign ctrl_readRegB = is_sw ? rd : pre_ctrl_readRegB;
  324. endmodule
  325.  
  326. module is_multdiv_d_op(instr, is_multdiv);
  327. input [31:0] instr;
  328. output is_multdiv;
  329.  
  330.  
  331. // Decode General Instruction Calling
  332. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  333. wire [26:0] T;
  334. wire [16:0] N;
  335. decode_general_instr dgi(.instr(instr), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  336.  
  337. wire is_mult_opcode, is_mult_aluop, is_mult, is_div_opcode, is_div_aluop, is_div, is_multdiv;
  338. assign is_mult_opcode = ~opcode[4] | ~opcode[3] | ~opcode[2] | ~opcode[1] | ~opcode[0];
  339. assign is_mult_aluop = ~aluop[4] | ~aluop[3] | aluop[2] | aluop[1] | ~aluop[0];
  340. assign is_mult = is_mult_opcode & is_mult_aluop;
  341.  
  342. assign is_div_opcode = ~opcode[4] | ~opcode[3] | ~opcode[2] | ~opcode[1] | ~opcode[0];
  343. assign is_div_aluop = ~aluop[4] | ~aluop[3] | aluop[2] | aluop[1] | aluop[0];
  344. assign is_div = is_div_opcode & is_div_aluop;
  345.  
  346. assign is_multdiv = is_div & is_mult;
  347. endmodule
  348.  
  349. // Execute Helper Functions
  350. // Done except bypass logic. Will fail if filler function isn't implemented.
  351. module get_alu_inputs(dx_instr_out, post_bypass_regA, post_bypass_regB, alu_data_operandA, alu_data_operandB, alu_ctrl_ALUopcode, alu_ctrl_shiftamt);
  352. input [31:0] dx_instr_out, post_bypass_regA, post_bypass_regB;
  353. output [31:0] alu_data_operandA, alu_data_operandB;
  354. output [4:0] alu_ctrl_ALUopcode, alu_ctrl_shiftamt;
  355. // Decode General Instruction Calling
  356. wire [4:0] rd, rs, rt, shamt, aluop, pre_alu_ctrl_ALUopcode;
  357. wire [4:0] opcode;
  358. wire [26:0] T;
  359. wire [16:0] N;
  360. decode_general_instr dgi_alu_inps(.instr(dx_instr_out), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  361. // Decode opcode (Requirement: decode_general_instr)
  362. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  363. assign neq = 1'b1; // Check if branch should be taken. is opcode bne's?
  364. assign lt = 1'b1; // Check if branch should be taken. is opcode blt's?
  365. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  366. // Decode type
  367. wire is_itype, is_rtype, is_jitype, is_jiitype;
  368. decode_type decode_type1(.opcode(opcode),.neq(neq), .lt(lt), .is_itype(is_itype), .is_rtype(is_rtype), .is_jitype(is_jitype), .is_jiitype(is_jiitype));
  369.  
  370. wire [31:0] N_extend;
  371. calc_N_arithmetic_extend extend_N(.N(N), .N_extend(N_extend));
  372.  
  373. // Post instruction specification
  374. assign alu_data_operandA = post_bypass_regA;
  375. assign alu_data_operandB = (is_addi | is_lw | is_sw) ? N_extend : post_bypass_regB;
  376.  
  377. // Assign other alu inputs
  378. wire [4:0] t0_alu_ctrl_ALUopcode, t1_alu_ctrl_ALUopcode, t2_alu_ctrl_ALUopcode;
  379.  
  380. // Every case explicitly written out.
  381. assign t0_alu_ctrl_ALUopcode = 5'b0; // Default
  382. assign t1_alu_ctrl_ALUopcode = (is_addi | is_lw | is_sw) ? 5'b0 : t0_alu_ctrl_ALUopcode; // If add_i instruction.
  383. assign t2_alu_ctrl_ALUopcode = (is_blt | is_bne) ? 5'b00001 : t1_alu_ctrl_ALUopcode; // If branch instruction -- not sure if necessary.
  384. assign alu_ctrl_ALUopcode = is_alu_op_excluding_addi ? aluop : t2_alu_ctrl_ALUopcode; // If rtype instruction. alu is specified in aluop.
  385.  
  386. // Shamt calculation.
  387. assign alu_ctrl_shiftamt = shamt;
  388. endmodule
  389.  
  390. // Done
  391. module execute_branch_logic(dx_instr_out, dx_pc_out, neq, lt, alu_data_operandA, rstatus, pc_after_branching, isBranchJumpJal);
  392. input [31:0] dx_instr_out, rstatus, alu_data_operandA, dx_pc_out;
  393. input neq, lt;
  394. output [31:0] pc_after_branching;
  395. output isBranchJumpJal;
  396.  
  397. wire rstatus_all_zeros, isTarget_branch, isNoffset_branch, isRegister_branch, dummy_cout_Noff;
  398. wire [31:0] temp_pc_1, temp_pc_2,target_pc, Noffset_branch_pc, N_extend, T_extend;
  399. // Decode General Instruction Calling
  400. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  401. wire [26:0] T;
  402. wire [16:0] N;
  403. decode_general_instr dgi(.instr(dx_instr_out), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  404. // Decode opcode (Requirement: decode_general_instr)
  405. wire is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  406. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  407. calc_N_arithmetic_extend pc_offset(.N(N), .N_extend(N_extend));
  408. calc_T_logical_extend pc_target(.T(T), .T_extend(T_extend));
  409.  
  410. // Branching Logic
  411. assign rstatus_all_zeros = ~rstatus[0] & ~rstatus[1] & ~rstatus[2] & ~rstatus[3] & ~rstatus[4] & ~rstatus[5] & ~rstatus[6] & ~rstatus[7] & ~rstatus[8] & ~rstatus[9] & ~rstatus[10] & ~rstatus[11] & ~rstatus[12] & ~rstatus[13] & ~rstatus[14] & ~rstatus[15] & ~rstatus[16] & ~rstatus[17] & ~rstatus[18] & ~rstatus[19] & ~rstatus[20] & ~rstatus[21] & ~rstatus[22] & ~rstatus[23] & ~rstatus[24] & ~rstatus[25] & ~rstatus[26] & ~rstatus[27] & ~rstatus[28] & ~rstatus[29] & ~rstatus[30] & ~rstatus[31];
  412.  
  413. assign isTarget_branch = is_j | is_jal | (is_bex_wo_rstatus & ~rstatus_all_zeros);
  414. assign isNoffset_branch = is_bne | is_blt;
  415. assign isRegister_branch = is_jr;
  416.  
  417. assign isBranchJumpJal = isTarget_branch | isNoffset_branch | isRegister_branch;
  418.  
  419. // PC for each type of Branch
  420. assign target_pc = T_extend;
  421. cselect_adder_32 pc_increment(.in1(dx_pc_out), .in2(N_extend), .cin(1'b0), .s(Noffset_branch_pc), .cout(dummy_cout_Noff));
  422.  
  423. // Calculate final program counter after branch/jump instruction/no branching occurs
  424. assign temp_pc_1 = isTarget_branch ? target_pc : dx_instr_out;
  425. assign temp_pc_2 = isNoffset_branch ? Noffset_branch_pc : temp_pc_1;
  426. assign pc_after_branching = isRegister_branch ? alu_data_operandA : temp_pc_2;
  427. endmodule
  428.  
  429. module get_next_rstatus(dx_instr_out, alu_overflow, pseudo_setx_instr, use_pseudo_setx_instr, next_rstatus, execute_is_setx);
  430. input [31:0] dx_instr_out;
  431. input alu_overflow;
  432. output [31:0] pseudo_setx_instr, next_rstatus;
  433. output use_pseudo_setx_instr;
  434. output execute_is_setx;
  435.  
  436. // Decode General Instruction Calling
  437. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  438. wire [26:0] T;
  439. wire [16:0] N;
  440. decode_general_instr dgi(.instr(dx_instr_out), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  441. // Decode opcode (Requirement: decode_general_instr)
  442. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  443. assign neq = 1'b0; // Dummy value
  444. assign lt = 1'b0; // Dummy value
  445. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  446. wire isAdd, isAddi, isSub, isMult, isDiv;
  447. assign isAdd = is_alu_op_excluding_addi & (~aluop[4] & ~aluop[3] & ~aluop[2] & ~aluop[1] & ~aluop[0]);
  448. assign isAddi = is_addi;
  449. assign isSub = is_alu_op_excluding_addi & (~aluop[4] & ~aluop[3] & ~aluop[2] & ~aluop[1] & aluop[0]);
  450. assign isMult = is_alu_op_excluding_addi & (~aluop[4] & ~aluop[3] & aluop[2] & aluop[1] & ~aluop[0]);
  451. assign isDiv = is_alu_op_excluding_addi & (~aluop[4] & ~aluop[3] & aluop[2] & aluop[1] & aluop[0]);
  452.  
  453. wire [26:0] no_psetx_instr, t1_psetx, t2_psetx, t3_psetx, t4_psetx, t5_psetx, t6_psetx;
  454. assign no_psetx_instr = 27'b000000000000000000000000000;
  455. assign t1_psetx = isAdd ? 27'b000000000000000000000000001 : no_psetx_instr;
  456. assign t2_psetx = isAddi ? 27'b000000000000000000000000010 : t1_psetx;
  457. assign t3_psetx = isSub ? 27'b000000000000000000000000011 : t2_psetx;
  458. assign t4_psetx = isMult ? 27'b000000000000000000000000100 : t3_psetx;
  459. assign t5_psetx = isDiv ? 27'b000000000000000000000000101 : t4_psetx;
  460. assign t6_psetx = is_setx ? dx_instr_out[26:0] : t5_psetx;
  461.  
  462. assign execute_is_setx = is_setx;
  463.  
  464. assign pseudo_setx_instr[26:0] = t6_psetx;
  465. assign pseudo_setx_instr[31:27] = 5'b10101;
  466.  
  467. assign next_rstatus[26:0] = t6_psetx;
  468. assign next_rstatus[31:27] = 5'b00000;
  469.  
  470. assign use_pseudo_setx_instr = alu_overflow & (is_alu_op_excluding_addi | is_addi);
  471.  
  472. endmodule
  473.  
  474.  
  475.  
  476.  
  477. module check_we_instr(instr, is_we);
  478. input [31:0] instr;
  479. output is_we;
  480.  
  481. wire instr_noop;
  482. allzero32 az32(instr, instr_noop);
  483.  
  484. // Decode General Instruction Calling
  485. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  486. wire [26:0] T;
  487. wire [16:0] N;
  488. decode_general_instr dgi(.instr(instr), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  489. // Decode opcode (Requirement: decode_general_instr)
  490. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  491. assign neq = 1'b0; // Dummy value
  492. assign lt = 1'b0; // Dummy value
  493. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  494. assign is_we = (is_alu_op_excluding_addi | is_lw | is_jal | is_addi) & !instr_noop;
  495. endmodule
  496.  
  497.  
  498. // ------------------------------Logic Correct------------------------------------------
  499. // Done
  500. module decode_R_Itype(instr, opcode, rd, rs, rt, ctrl_shiftamt, aluop, zeroes);
  501. input [31:0] instr;
  502. output [4:0] opcode, rd, rs, rt, ctrl_shiftamt, aluop;
  503. output [1:0] zeroes;
  504. assign zeroes = instr[1:0];
  505. assign aluop = instr[6:2];
  506. assign ctrl_shiftamt = instr[11:7];
  507. assign rt = instr[16:12];
  508. assign rs = instr[21:17];
  509. assign rd = instr[26:22];
  510. assign opcode = instr[31:27];
  511. endmodule
  512.  
  513. // Done
  514. module decode_I_Itype(instr, opcode, rd, rs, immediate);
  515. input [31:0] instr;
  516. output [4:0] opcode, rd, rs;
  517. output [16:0] immediate;
  518. assign immediate = instr[16:0];
  519. assign rs = instr[21:17];
  520. assign rd = instr[26:22];
  521. assign opcode = instr[31:27];
  522. endmodule
  523.  
  524. // Done
  525. module decode_JI_Itype(instr, opcode, target);
  526. input [31:0] instr;
  527. output [4:0] opcode;
  528. output [26:0] target;
  529. assign target = instr[26:0];
  530. assign opcode = instr[31:27];
  531. endmodule
  532.  
  533. // Done
  534. module decode_JII_Itype(instr, opcode, rd, target);
  535. input [31:0] instr;
  536. output [4:0] opcode, rd;
  537. output [21:0] target;
  538. assign target = instr[21:0];
  539. assign rd = instr[26:22];
  540. assign opcode = instr[31:27];
  541. endmodule
  542.  
  543. // Done
  544. module decode_general_instr(instr, opcode, rd, rs, rt, shamt, aluop, N, T);
  545. input [31:0] instr;
  546. output [4:0] opcode, rd, rs, rt, shamt, aluop;
  547. output [26:0] T;
  548. output [16:0] N;
  549.  
  550. assign opcode = instr[31:27];
  551. assign rd = instr[26:22];
  552. assign rs = instr[21:17];
  553. assign rt = instr[16:12];
  554. assign shamt = instr[11:7];
  555. assign aluop = instr[6:2];
  556. assign T = instr[26:0];
  557. assign N = instr[16:0];
  558. endmodule
  559.  
  560. // Done
  561. module decode_opcode(opcode, neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx);
  562. input [4:0] opcode;
  563. input neq, lt;
  564. output is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  565.  
  566. // is_alu_op_excluding_addi : 00000
  567. and and1(is_alu_op_excluding_addi, ~opcode[4], ~opcode[3], ~opcode[2], ~opcode[1], ~opcode[0]);
  568. // addi : 00101
  569. and and2(is_addi, ~opcode[4], ~opcode[3], opcode[2], ~opcode[1], opcode[0]);
  570. // sw : 00111
  571. and and3(is_sw, ~opcode[4], ~opcode[3], opcode[2], opcode[1], opcode[0]);
  572. // lw : 01000
  573. and and4(is_lw, ~opcode[4], opcode[3], ~opcode[2], ~opcode[1], ~opcode[0]);
  574. // j : 00001
  575. and and5(is_j, ~opcode[4], ~opcode[3], ~opcode[2], ~opcode[1], opcode[0]);
  576. // bne : 00010
  577. and and6(is_bne, ~opcode[4], ~opcode[3], ~opcode[2], opcode[1], ~opcode[0], neq);
  578. // jal : 00011
  579. and and7(is_jal, ~opcode[4], ~opcode[3], ~opcode[2], opcode[1], opcode[0]);
  580. // jr : 00100
  581. and and8(is_jr, ~opcode[4], ~opcode[3], opcode[2], ~opcode[1], ~opcode[0]);
  582. // blt : 00110
  583. and and9(is_blt, ~opcode[4], ~opcode[3], opcode[2], opcode[1], ~opcode[0], lt);
  584. // bex : 10110
  585. and and10(is_bex_wo_rstatus, opcode[4], ~opcode[3], opcode[2], opcode[1], ~opcode[0]);
  586. // setx : 10101
  587. and and11(is_setx, opcode[4], ~opcode[3], opcode[2], ~opcode[1], opcode[0]);
  588. endmodule
  589.  
  590. // Done
  591. module get_data_writeReg(instr, mw_alu_res_out, mw_dmem_out, mw_pc_out, data_writeReg);
  592. input [31:0] instr, mw_alu_res_out, mw_dmem_out, mw_pc_out;
  593. output [31:0] data_writeReg;
  594.  
  595. wire [31:0] temp1, temp2;
  596.  
  597. // Decode General Instruction Calling
  598. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  599. wire [26:0] T;
  600. wire [16:0] N;
  601. decode_general_instr dgi(.instr(instr), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  602. // Decode opcode (Requirement: decode_general_instr)
  603. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  604. assign neq = 1'b0; // Dummy value
  605. assign lt = 1'b0; // Dummy value
  606. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  607. wire [31:0] T_extend;
  608. calc_T_logical_extend cle(T, T_extend);
  609. assign temp1 = is_jal ? mw_pc_out : mw_alu_res_out;
  610. assign temp2 = is_setx ? T_extend : temp1;
  611. assign data_writeReg = is_lw ? mw_dmem_out : temp2;
  612. endmodule
  613.  
  614. // Done
  615. module get_ctrl_writeEnable(instr, ctrl_writeEnable);
  616. input [31:0] instr;
  617. output ctrl_writeEnable;
  618. wire is_noop, we_opcodes_valid;
  619.  
  620.  
  621. // Decode General Instruction Calling
  622. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  623. wire [26:0] T;
  624. wire [16:0] N;
  625. decode_general_instr dgi(.instr(instr), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  626. // Decode opcode (Requirement: decode_general_instr)
  627. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  628. assign neq = 1'b0; // Dummy value
  629. assign lt = 1'b0; // Dummy value
  630. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  631.  
  632. assign is_noop = ~instr[0] & ~instr[1] & ~instr[2] & ~instr[3] & ~instr[4] & ~instr[5] & ~instr[6] & ~instr[7] & ~instr[8] & ~instr[9] & ~instr[10] & ~instr[11] & ~instr[12] & ~instr[13] & ~instr[14] & ~instr[15] & ~instr[16] & ~instr[17] & ~instr[18] & ~instr[19] & ~instr[20] & ~instr[21] & ~instr[22] & ~instr[23] & ~instr[24] & ~instr[25] & ~instr[26] & ~instr[27] & ~instr[28] & ~instr[29] & ~instr[30] & ~instr[31];
  633. assign we_opcodes_valid = (is_alu_op_excluding_addi | is_addi | is_lw | is_jal);
  634. assign ctrl_writeEnable = we_opcodes_valid & (~is_noop);
  635. endmodule
  636.  
  637. // Done
  638. module get_ctrl_writeReg(instr, is_alu_except, ctrl_writeReg);
  639. input [31:0] instr;
  640. input is_alu_except;
  641. output [4:0] ctrl_writeReg;
  642. // Decode General Instruction Calling
  643. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  644. wire [26:0] T;
  645. wire [16:0] N;
  646. decode_general_instr dgi(.instr(instr), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  647. // Decode opcode (Requirement: decode_general_instr)
  648. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  649. assign neq = 1'b0; // Dummy value
  650. assign lt = 1'b0; // Dummy value
  651. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  652. wire [4:0] temp1_wR;
  653. assign temp1_wR = is_setx ? 5'b11110 : rd;
  654. assign ctrl_writeReg = is_jal ? 5'b11111 : temp1_wR;
  655. endmodule
  656.  
  657. // Done
  658. module decode_type(opcode, neq,lt ,is_itype, is_rtype, is_jitype, is_jiitype);
  659. input opcode, neq, lt;
  660. output is_itype, is_rtype, is_jitype, is_jiitype;
  661. // Decode opcode (Requirement: decode_general_instr)
  662. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  663. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  664.  
  665. assign is_itype = is_addi | is_sw | is_lw | is_bne | is_blt;
  666. assign is_rtype = is_alu_op_excluding_addi;
  667. assign is_jitype = is_j | is_jal | is_setx;
  668. assign is_jiitype = is_jr;
  669. endmodule
  670.  
  671. // Done
  672. module is_sw_m(xm_instr_out, is_sw_m);
  673. input [31:0] xm_instr_out;
  674. output is_sw_m;
  675.  
  676. // Decode General Instruction Calling
  677. wire [4:0] opcode, rd, rs, rt, shamt, aluop;
  678. wire [26:0] T;
  679. wire [16:0] N;
  680. decode_general_instr dgi(.instr(xm_instr_out), .opcode(opcode), .rd(rd), .rs(rs), .rt(rt), .shamt(shamt), .aluop(aluop), .N(N), .T(T));
  681. // Decode opcode (Requirement: decode_general_instr)
  682. wire neq, lt, is_alu_op_excluding_addi, is_addi, is_sw, is_lw, is_j, is_bne, is_jal, is_jr, is_blt, is_bex_wo_rstatus, is_setx;
  683. assign neq = 1'b0; // Dummy value
  684. assign lt = 1'b0; // Dummy value
  685. decode_opcode doc(.opcode(opcode), .neq(neq), .lt(lt), .is_alu_op_excluding_addi(is_alu_op_excluding_addi), .is_addi(is_addi), .is_sw(is_sw), .is_lw(is_lw), .is_j(is_j), .is_bne(is_bne), .is_jal(is_jal), .is_jr(is_jr), .is_blt(is_blt), .is_bex_wo_rstatus(is_bex_wo_rstatus), .is_setx(is_setx));
  686.  
  687. assign is_sw_m = is_sw;
  688. endmodule
  689.  
  690. // Done
  691. module calc_N_arithmetic_extend(N, N_extend);
  692. input [16:0] N;
  693. output [31:0] N_extend;
  694. assign N_extend[16:0] = N;
  695. assign N_extend[17] = N[16];
  696. assign N_extend[18] = N[16];
  697. assign N_extend[19] = N[16];
  698. assign N_extend[20] = N[16];
  699. assign N_extend[21] = N[16];
  700. assign N_extend[22] = N[16];
  701. assign N_extend[23] = N[16];
  702. assign N_extend[24] = N[16];
  703. assign N_extend[25] = N[16];
  704. assign N_extend[26] = N[16];
  705. assign N_extend[27] = N[16];
  706. assign N_extend[28] = N[16];
  707. assign N_extend[29] = N[16];
  708. assign N_extend[30] = N[16];
  709. assign N_extend[31] = N[16];
  710. endmodule
  711.  
  712. // Done
  713. module calc_T_logical_extend(T, T_extend);
  714. input [26:0] T;
  715. output [31:0] T_extend;
  716.  
  717. assign T_extend[26:0] = T[26:0];
  718. assign T_extend[31:27] = 5'b00000;
  719. endmodule
  720.  
  721.  
  722. module allzero32(a, all_zeros);
  723. input [31:0] a;
  724. output all_zeros;
  725. assign all_zeros = ~a[0] & ~a[1] & ~a[2] & ~a[3] & ~a[4] & ~a[5] & ~a[6] & ~a[7] & ~a[8] & ~a[9] & ~a[10] & ~a[11] & ~a[12] & ~a[13] & ~a[14] & ~a[15] & ~a[16] & ~a[17] & ~a[18] & ~a[19] & ~a[20] & ~a[21] & ~a[22] & ~a[23] & ~a[24] & ~a[25] & ~a[26] & ~a[27] & ~a[28] & ~a[29] & ~a[30] & ~a[31];
  726. endmodule
  727.  
  728.  
  729. module equal5(a, b, is_equal);
  730. input [4:0] a, b;
  731. output is_equal;
  732. wire isequal0, isequal1, isequal2, isequal3, isequal4;
  733. equal1 eq0(.a(a[0]), .b(b[0]), .is_equal(isequal0));
  734. equal1 eq1(.a(a[1]), .b(b[1]), .is_equal(isequal1));
  735. equal1 eq2(.a(a[2]), .b(b[2]), .is_equal(isequal2));
  736. equal1 eq3(.a(a[3]), .b(b[3]), .is_equal(isequal3));
  737. equal1 eq4(.a(a[4]), .b(b[4]), .is_equal(isequal4));
  738. assign is_equal = isequal0 & isequal1 & isequal2 & isequal3 & isequal4;
  739. endmodule
  740.  
  741.  
  742. module equal1(a, b, is_equal);
  743. input a, b;
  744. output is_equal;
  745. assign is_equal = (a & b) | (~a & ~b);
  746. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement