datapath.sv 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import project_pkg::*;
  2. module datapath(clk, rst, rd, rs, imm, alu_op, reg_wr, pc_src, rimm, alu_src, mem_to_reg, pc, alu_out, mem_data, alu_zero, mem_wr_data);
  3. input logic clk, rst, reg_wr, pc_src, rimm, mem_to_reg, alu_src;
  4. input e_reg rd, rs;
  5. input e_alu_op alu_op;
  6. input word imm, mem_data;
  7. output word pc, alu_out, mem_wr_data;
  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 = rd;
  13. assign reg_rd_a2 = rs;
  14. assign reg_wr_a = rd;
  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. // Mem output data
  18. assign mem_wr_data = reg_rd_d1;
  19. // ALU
  20. word alu_srcA, alu_srcB;
  21. assign alu_srcA = reg_rd_d1;
  22. assign alu_srcB = alu_src ? imm : reg_rd_d2;
  23. alu ALU(alu_op, alu_srcA, alu_srcB, alu_out, alu_zero);
  24. // Program counter
  25. word pcn; // PC next
  26. word pcj; // PC jump, +2 if imm used otherwise +1
  27. logic [0:1]pcadd;
  28. assign pcadd = (rimm) ? 2 : 1;
  29. assign pcj = pc + pcadd;
  30. //assign pcj = pc + 1;
  31. assign pcn = (pc_src) ? imm : pcj;
  32. always_ff@(posedge clk) begin
  33. if (rst) pc <= 0;
  34. else pc <= pcn;
  35. end
  36. endmodule
  37. module datapath_tb;
  38. logic clk, rst, reg_wr, pc_src, rimm, mem_to_reg, alu_zero;
  39. e_reg rs, rt;
  40. e_alu_op alu_op;
  41. word imm, mem_data, pc, alu_out;
  42. datapath DPATH(clk, rst, rs, rt, imm, alu_op, reg_wr, pc_src, rimm, mem_to_reg, pc, alu_out, mem_data, alu_zero);
  43. initial begin
  44. clk = 0;
  45. forever #5ns clk = ~clk;
  46. end
  47. initial begin
  48. rst = 1;
  49. reg_wr = 0;
  50. pc_src = 0;
  51. rimm = 0;
  52. mem_to_reg = 0;
  53. rs = ra;
  54. rt = ra;
  55. alu_op = ALU_CPY;
  56. imm = 8'h00;
  57. mem_data = 8'h00;
  58. #10ns;
  59. rst = 0;
  60. reg_wr = 1;
  61. mem_to_reg = 1;
  62. mem_data = 8'h7A;
  63. #10ns;
  64. rs = rb;
  65. mem_data = 8'h8A;
  66. #10ns;
  67. rs = rc;
  68. mem_data = 8'h9A;
  69. #10ns;
  70. rs = re;
  71. mem_data = 8'hFD;
  72. #10ns;
  73. rs = ra;
  74. #10ns;
  75. $stop;
  76. end
  77. endmodule