Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.47 KB | None | 0 0
  1. module plp#(parameter addr_width=5, data_width=32)(input clk);
  2. //program counter signals
  3. wire [data_width-1:0] pc_0, pc, pcf, pcbranchd, pcp1f, pcp1d;
  4. //instruction memory signals
  5. wire [data_width-1:0] instr, instrd;
  6. //instruction field signals
  7. wire [5:0] opcoded, functd;
  8. wire [4:0] shamtd,shamte;
  9. wire [15:0] imm;
  10. wire signed [data_width-1:0] simmd, simme;
  11. wire [25:0] jaddr;
  12. //register file signals
  13. wire [4:0] rsd, rtd, rdd, rse, rte, rde, rfae, rfam, rfaw;
  14. wire [data_width-1:0] rfrd1d, rfrd2d, rfrd1e, rfrd2e, dmdine, dmdinm;
  15. //control unit signals
  16. wire rfwed, mtorfseld,dmwed,branchd,aluinseld,rfdseld,jumpd,equald;
  17. reg pcseld;
  18. wire rfwee, mtorfsele,dmwee,aluinsele,rfdsele;
  19. wire rfwem, mtorfselm,dmwem;
  20. wire rfwew, mtorfselw;
  21. wire [3:0] aluseld,alusele;
  22. //alu signals
  23. wire [data_width-1:0] aluin1e, aluin2e;
  24. wire [data_width-1:0] aluoute, aluoutm, aluoutw;
  25. //data memory signals
  26. wire [data_width-1:0] dmoutm,dmoutw;
  27. wire [data_width-1:0] resultw;
  28. //hazard unit signals
  29. wire stall, flush, forwardad, forwardbd, forwardae, forwardbe;
  30. wire [data_width-1:0] eqld1,eqld2;
  31.  
  32. initial begin
  33. pcseld = 0;
  34. end
  35. //program counter
  36. mux #(.wl_1(32),.wl_0(32),.wl_out(32)) PCJMUX (.in1(pcbranchd),.in0(pcp1f),.sel(pcseld),.out(pc_0));
  37. mux #(.wl_1(32),.wl_0(32),.wl_out(32)) PCINMUX (.in1({pcf[31:26],jaddr}),.in0(pc_0),.sel(jumpd),.out(pc));
  38. pl_pc #(.width(32)) PC (.clk(clk), .en(stall), .pc_in(pc), .pc_out(pcf));
  39. adder #(.wl_1(32),.wl_2(32)) ADDR1 (.in1(pcf), .in2(1), .out(pcp1f));
  40. adder #(.wl_1(32),.wl_2(32)) ADDR2 (.in1(simmd<<2), .in2(pcp1d), .out(pcbranchd));
  41.  
  42. //instruction memory
  43. pl_instr_mem #(.addr_width(8), .data_width(32)) INSTRMEM (.ima(pcf),.instr(instr));
  44.  
  45. //pipeline register - fetch/decode stage
  46. reg_decode_data #(.width(32)) DECREG (.clk(clk),.en(stall),.clr(pcseld),.instr(instr),.pcp1f(pcp1f),.instrd(instrd),.pcp1d(pcp1d));
  47.  
  48. //instruction fields
  49. assign opcoded = instrd[31:26];
  50. assign rsd = instrd[25:21];
  51. assign rtd = instrd[20:16];
  52. assign rdd = instrd[15:11];
  53. assign imm = instrd[15:0];
  54. assign shamtd = instrd[10:6];
  55. assign functd = instrd[5:0];
  56. assign jaddr = instrd[25:0];
  57.  
  58. //sign extend
  59. signextend SIGNEXTEND (.imm(imm),.simm(simmd));
  60.  
  61. //regiter file
  62. pl_reg_file REGFILE (.clk(clk),.rfra1(rsd),.rfra2(rtd),.rfwa(rfaw),.rfwd(resultw),.rfwe(rfwew),.rfrd1(rfrd1d),.rfrd2(rfrd2d));
  63.  
  64. mux #(.wl_1(32),.wl_0(32),.wl_out(32)) EQLD1 (.in1(aluoutm),.in0(rfrd1d),.sel(forwardad),.out(eqld1));
  65. mux #(.wl_1(32),.wl_0(32),.wl_out(32)) EQLD2 (.in1(aluoutm),.in0(rfrd2d),.sel(forwardbd),.out(eqld2));
  66. assign equald = (eqld1==eqld2) ? 1:0;
  67. always @(*) begin
  68. pcseld = equald & branchd;
  69. end
  70.  
  71. //control unit
  72. pl_control_unit PLCU (.opcode(opcoded),.funct(functd),.mtorfsel(mtorfseld), .dmwe(dmwed), .branch(branchd), .aluinsel(aluinseld), .rfdsel(rfdseld), .rfwe(rfwed), .alusel(aluseld),.jump(jumpd));
  73.  
  74. //pipeline register - decode/execute stage
  75. reg_execute_data EXEREG1 (.clk(clk),.clr(flush),.rfrd1d(rfrd1d),.rfrd2d(rfrd2d),.simmd(simmd),.rsd(rsd),.rtd(rtd),.rdd(rdd),.shamtd(shamtd),
  76. .rfrd1e(rfrd1e),.rfrd2e(rfrd2e),.simme(simme),.rse(rse),.rte(rte),.rde(rde),.shamte(shamte));
  77. reg_execute_signals EXEREG2 (.clk(clk),.rfwed(rfwed),.mtorfseld(mtorfseld),.dmwed(dmwed),.aluseld(aluseld),.aluinseld(aluinseld),.rfdseld(rfdseld),
  78. .rfwee(rfwee),.mtorfsele(mtorfsele),.dmwee(dmwee),.alusele(alusele),.aluinsele(aluinsele),.rfdsele(rfdsele));
  79.  
  80. mux3 #(.width(32)) REGA3MUX (.in0(rfrd1e),.in1(resultw),.in2(aluoutm),.sel(forwardae),.out(aluin1e));
  81. mux3 #(.width(32)) REGB3MUX (.in0(rfrd1e),.in1(resultw),.in2(aluoutm),.sel(forwardae),.out(dmdine));
  82. //alu
  83. mux #(.width(5)) RTDMUX (.in1(rde),.in0(rte),.sel(rfdsele),.out(rfae));
  84. mux #(.width(32)) ALUIN2MUX (.in1(simme),.in0(dmdine),.sel(aluinsele),.out(aluin2e));
  85. pl_alu #(.width(32)) ALU (.aluin1(aluin1e),.aluin2(aluin2e),.shamt(shamte),.alusel(alusele),.aluout(aluoute));
  86.  
  87. //pipeline register - execute/memory stage
  88. reg_memory_data DATAREG1 (.clk(clk), .aluoute(aluoute), .dmdine(dmdine), .rfae(rfae),
  89. .aluoutm(aluoutm), .dmdinm(dmdinm), .rfam(rfam));
  90. reg_memory_signals DATAREG2 (.clk(clk), .rfwee(rfwee), .mtorfsele(mtorfsele), .dmwee(dmwee),
  91. .rfwem(rfwem), .mtorfselm(mtorfselm), .dmwem(dmwem));
  92.  
  93. //data memory
  94. pl_data_mem #(.addr_width(6), .data_width(32)) DATAMEM (.clk(clk),.dma(aluoutm),.dmwd(dmdinm),.dmwe(dmwem),.dmrd(dmoutm));
  95.  
  96. //pipeline register - memory/writeback stage
  97. reg_writeback_data WRITEREG1 (.clk(clk), .aluoutm(aluoutm), .dmoutm(dmoutm), .rtdm(rtdm), .aluoutw(aluoutw), .dmoutw(dmoutw), .rtdw(rtdw));
  98. reg_writeback_signals WRITEREG2 (.clk(clk), .rfwem(rfwem), .mtorfselm(mtorfselm),.rfwew(rfwew), .mtorfselw(mtorfselw));
  99. mux #(.wl_1(32),.wl_0(32),.wl_out(32)) DMMUX (.in1(dmoutw),.in0(aluoutw),.sel(mtorfselw),.out(resultw));
  100.  
  101. //hazard unit
  102. pl_hazard_unit HAZARD (.branchd(branchd), .mtorfsele(mtorfsele), .mtorfselm(mtorfselm), .rfwee(rfwee), .rfwem(rfwem), .rfwew(rfwew), .jumpd(jumpd),
  103. .rsd(rsd), .rtd(rtd), .rse(rse), .rte(rte), .rfae(rfae), .rfam(rfam), .rfaw(rfaw),
  104. .stall(stall),
  105. .flush(flush),
  106. .forwardad(forwardad), .forwardbd(forwardbd),
  107. .forwardae(forwardae), .forwardbe(forwardbe));
  108.  
  109. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement