datapath.sv 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import project_pkg::*;
  2. module datapath(clk, rst, rs, rt, imm, alu_op, reg_wr, pc_src, alu_src, mem_to_reg, pc, alu_out, mem_data, alu_zero);
  3. input logic clk, rst, reg_wr, pc_src, alu_src, mem_to_reg;
  4. input e_reg rs, rt;
  5. input e_alu_op alu_op;
  6. input word imm, mem_data;
  7. output word pc, alu_out;
  8. output logic alu_zero;
  9. // Reg File
  10. word reg_rd_d1, reg_rd_d2, reg_wr_d;
  11. e_reg reg_rd_a1, reg_rd_a2, reg_wr_a;
  12. assign reg_rd_a1 = rs;
  13. assign reg_rd_a2 = rt;
  14. assign reg_wr_a = rs;
  15. assign reg_wr_d = (mem_to_reg) ? mem_data : alu_out;
  16. reg_file RFILE(clk, rst, reg_rd_a1, reg_rd_a2, reg_rd_d1, reg_rd_d2, reg_wr_a, reg_wr_d, reg_wr);
  17. // ALU
  18. word alu_srcA, alu_srcB;
  19. assign alu_srcA = reg_rd_d1;
  20. assign alu_srcB = (alu_src) ? reg_rd_d2 : imm;
  21. alu ALU(alu_op, alu_srcA, alu_srcB, alu_out, alu_zero);
  22. // Program counter
  23. word pcn; // PC next
  24. assign pcn = (pc_src) ? imm : pc + 1;
  25. always_ff@(posedge clk, negedge rst) begin
  26. if (rst) pc <= 0;
  27. else pc <= pcn;
  28. end
  29. endmodule
  30. module datapath_tb;
  31. logic clk, rst, reg_wr, pc_src, alu_src, mem_to_reg, alu_zero;
  32. e_reg rs, rt;
  33. e_alu_op alu_op;
  34. word imm, mem_data, pc, alu_out;
  35. datapath DPATH(clk, rst, rs, rt, imm, alu_op, reg_wr, pc_src, alu_src, mem_to_reg, pc, alu_out, mem_data, alu_zero);
  36. initial begin
  37. clk = 0;
  38. forever #5ns clk = ~clk;
  39. end
  40. initial begin
  41. rst = 1;
  42. reg_wr = 0;
  43. pc_src = 0;
  44. alu_src = 0;
  45. mem_to_reg = 0;
  46. rs = RegA;
  47. rt = RegA;
  48. alu_op = ALU_NOP;
  49. imm = 8'h00;
  50. mem_data = 8'h00;
  51. #10ns;
  52. rst = 0;
  53. reg_wr = 1;
  54. mem_to_reg = 1;
  55. mem_data = 8'h7A;
  56. #10ns;
  57. rs = RegB;
  58. mem_data = 8'h8A;
  59. #10ns;
  60. rs = RegC;
  61. mem_data = 8'h9A;
  62. #10ns;
  63. rs = RegD;
  64. mem_data = 8'hFD;
  65. #10ns;
  66. rs = RegA;
  67. #10ns;
  68. $stop;
  69. end
  70. endmodule