Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.70 KB | None | 0 0
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 03/21/2020 10:40:27 PM
  7. // Design Name:
  8. // Module Name: main
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21.  
  22.  
  23. module main #(parameter WL = 32, WLinput = 5, WL1 = 32, WL2 = 32, WLcon = 6, WLsign = 16, WLalu = 4)
  24. ();
  25.  
  26. wire clk, rst;
  27. wire [WL-1:0] PC_in;
  28. wire [WL-1:0] result;
  29. wire [((WL1 > WL2 ? WL1+1:WL2+1)-1):0] PCp1F;
  30. wire [WL-1:0] inst;
  31. wire [WL-1:0] instD;
  32. wire [((WL1 > WL2 ? WL1+1:WL2+1)-1):0] PCp1D;
  33. wire [WLinput-1:0] rsD;
  34. wire [WLinput-1:0] rtD;
  35. wire [WLinput-1:0] rdD;
  36. wire [WLcon-1:0] opcoD;
  37. wire [WLcon-1:0] funcD;
  38. wire [25:0] Jaddr;
  39. wire [WLsign-1:0] ImmD;
  40. wire [WLinput-1:0] shamD;
  41. wire [WL-1:0] D1D;
  42. wire [WL-1:0] D2D;
  43. wire [WL-1:0] ALUDMW;
  44. wire RFWED;
  45. wire MtoRFSelD;
  46. wire DMWED;
  47. wire BranchD;
  48. wire [3:0] ALUselD;
  49. wire ALUInSelD;
  50. wire RFDSelD;
  51. wire [WL-1:0] SimmD;
  52. wire [WL-1:0] ALUin1E;
  53. wire [WL-1:0] D2E;
  54. wire [WLinput-1:0] rtE;
  55. wire [WLinput-1:0] rdE;
  56. wire [WL-1:0] SimmE;
  57. //wire [((WL1 > WL2 ? WL1+1:WL2+1)-1):0] PCp1E;
  58. wire [WLinput-1:0] shamE;
  59. wire RFWEE;
  60. wire MtoRFSelE;
  61. wire DMWEE;
  62. wire BranchE;
  63. wire [3:0] ALUselE;
  64. wire ALUInSelE;
  65. wire RFDSelE;
  66. wire [WLinput-1:0] rtdE;
  67. wire [WL-1:0] ALUin2E;
  68. wire [WL-1:0] ALUoutE;
  69. wire [WL-1:0] PCbranchD;
  70. wire [WL-1:0] ALUoutM;
  71. wire [WL-1:0] DMdinM;
  72. wire [WLinput-1:0] rtdM;
  73. //wire [WL-1:0] PCbranchM;
  74. wire RFWEM;
  75. wire MtoRFSelM;
  76. wire DMWEM;
  77. wire BranchM;
  78. wire [3:0] ALUselM;
  79. wire ALUInSelM;
  80. wire RFDSelM;
  81. reg PCselD;
  82. wire [WL-1:0] DMoutM;
  83. wire RFWEW;
  84. wire MtoRFSelW;
  85. wire DMWEW;
  86. wire BranchW;
  87. wire [3:0] ALUselW;
  88. wire ALUInSelW;
  89. wire RFDSelW;
  90. wire [WL-1:0] ALUoutW;
  91. wire [WL-1:0] DMoutW;
  92. wire [WLinput-1:0] rtdW;
  93. wire [WL-1:0] ALUin1D;
  94. wire [WL-1:0] ALUin2D;
  95. wire jump;
  96. wire [WL-1:0] PCjump;
  97. wire [WL-1:0] PC;
  98.  
  99. wire forwardAD;
  100. wire forwardBD;
  101. reg equalD;
  102. wire [1:0] forwardAE;
  103. wire [1:0] forwardBE;
  104. wire [WL-1:0] ALUin1DE;
  105. wire [WL-1:0] ALUin2DE;
  106. wire flushD;
  107. wire Stall;
  108. reg [WL-1:0] SimmDE;
  109. wire [4:0] rsE;
  110.  
  111. //initial begin
  112. //PCselD = 0;
  113. //end
  114.  
  115. assign PCjump = {result[31:26], Jaddr};
  116. //FETCH//
  117. clk clk1(.clk(clk), .rst(rst));
  118. mux #(.WL(WL)) muxPC(.in1(PCp1F), .in2(PCbranchD), .sel(PCselD), .out(PC_in));
  119. mux #(.WL(WL)) mucJump(.in1(PC_in), .in2(PCjump), .sel(jump), .out(PC));
  120. PC #(.WL(WL)) pc1(.clk(clk), .stall(Stall), .PC_input(PC), .PC_result(result));
  121. adder #(.WL1(WL1), .WL2(WL2), .WL0(WL1 > WL2 ? WL1+1:WL2+1)) addy1(.x(result), .y(32'd1), .out(PCp1F));
  122. instruction #( .WL(WL)) instro1(.IMA(result), .instruction(inst));
  123. fetchRegister #(.WL(WL)) fetch(.clk(clk), .stall(Stall), .PCsel(PCselD), .in1(inst), .in2(PCp1F), .out1(instD), .out2(PCp1D));
  124. //FETCH//
  125.  
  126. assign opcoD = instD[31:26];
  127. assign funcD = instD[5:0];
  128. assign rsD = instD[25:21];
  129. assign rtD = instD[20:16];
  130. assign rdD = instD[15:11];
  131. assign ImmD = instD[15:0];
  132. assign Jaddr = instD[25:0];
  133.  
  134. //DECODE//
  135. RF_module #(.WL(WL), .WLinput(WLinput)) rf1(.clk(clk), .WE(RFWEW), .rst(rst), .RFRA1(rsD), .RFRA2(rtD), .WA(rtdW), .WD(ALUDMW), .RFRD1(D1D), .RFRD2(D2D));
  136. mux #(.WL(WL)) mux4(.in1(D1D), .in2(ALUoutM), .sel(forwardAD), .out(ALUin1D));//mux
  137. mux #(.WL(WL)) muxy5(.in1(D2D), .in2(ALUoutM), .sel(forwardBD), .out(ALUin2D));//mux
  138. always @(*) begin
  139. if (ALUin1D == ALUin2D) begin
  140. equalD <= 1'b1;
  141. end
  142. else begin
  143. equalD <= 1'b0;
  144. end
  145. end
  146.  
  147. always @(*) begin
  148. PCselD <= BranchD & equalD;
  149. end
  150.  
  151. control #(.WLcon(WLcon)) con1(.opcode(opcoD), .funct(funcD), .Jump(jump), .RFWE(RFWED), .MtoRFSel(MtoRFSelD), .RFDsel(RFDSelD), .ALUInSel(ALUInSelD), .Branch(BranchD), .ALUsel(ALUselD), .DMWE(DMWED));
  152. HazardUnit danger(.RsD(rsD), .RtD(rtD), .RtE(rtE), .Jump(jump), .RFAE(rtdE), .RFAM(rtdM), .RFAW(rtdW), .stall(Stall), .flush(flushD), .ForwardAD(forwardAD), .ForwardBD(forwardBD), .ForwardAE(forwardAE), .ForwardBE(forwardBE), .RFWEe(RFWEE), .Branchd(BranchD), .MtoRFSele(MtoRFSelE), .RFWEm(RFWEM), .RFWEw(RFWEW), .MtoRFSelm(MtoRFSelM));
  153. SIMM #(.WLsign(WLsign), .WL(WL)) sign1(.unextended(ImmD), .extended(SimmD));
  154.  
  155. always @(*) begin
  156. SimmDE <= SimmD << 2;
  157. end
  158.  
  159. adder #(.WL1(WL1), .WL2(WL2), .WL0(WL1 > WL2 ? WL1+1:WL2+1)) addy2(.x(SimmDE), .y(PCp1D), .out(PCbranchD));
  160. decodeRegister #(.WL(WL)) decode(.clk(clk), .flush(flushD), .in1(ALUin1D), .in2(ALUin2D), .in3(rtD), .in4(rdD), .in5(SimmD), .in6(rsD), .out1(ALUin1DE), .out2(D2E), .out3(rtE), .out4(rdE), .out5(SimmE), .out6(rsE));
  161. conRegister conD(.clk(clk), .in1(RFWED), .in2(MtoRFSelD), .in3(RFDSelD), .in4(ALUInSelD), .in5(BranchD), .in6(ALUselD), .in7(DMWED), .out1(RFWEE), .out2(MtoRFSelE), .out3(RFDSelE), .out4(ALUInSelE), .out5(BranchE), .out6(ALUselE), .out7(DMWEE));
  162. //DECODE//
  163.  
  164.  
  165. //shamt shit
  166. assign shamD = instD[10:6];
  167. shamtRegister shah(.clk(clk), .shamt(shamD), .out(shamE));
  168. //shamt shit
  169.  
  170.  
  171. //EXECUTE
  172. //control #(.WLcon(WLcon)) con2(.opcode(opcoD), .funct(funcD), .RFWE(RFWEE), .MtoRFSel(MtoRFSelE), .RFDsel(RFDSelE), .ALUInSel(ALUInSelE), .Branch(BranchE), .ALUsel(ALUselE), .DMWE(DMWEE));
  173. muxitwo #(.WL(WL)) muxy6(.in1(ALUin1DE), .in2(ALUDMW), .in3(ALUoutM), .in4(0), .sel(forwardAE), .out(ALUin1E));
  174. muxitwo #(.WL(WL)) muxy7(.in1(D2E), .in2(ALUDMW), .in3(ALUoutM), .in4(0), .sel(forwardBE), .out(ALUin2DE));
  175. mux #(.WL(WL)) muxy1(.in1(rtE), .in2(rdE), .sel(RFDSelE), .out(rtdE));
  176. mux #(.WL(WL)) muxy2(.in1(ALUin2DE), .in2(SimmE), .sel(ALUInSelE), .out(ALUin2E));
  177. ALU_module #(.WL(WL), .WLalu(WLalu)) alu1(.ALU_in1(ALUin1E), .ALU_in2(ALUin2E), .ALU_sel(ALUselE), .shamt(shamD), .ALU_out(ALUoutE));
  178.  
  179. execRegister #(.WL(WL)) execute(.clk(clk), .in2(ALUoutE), .in3(ALUin2DE), .in4(rtdE), .out2(ALUoutM), .out3(DMdinM), .out4(rtdM));
  180. conRegister conE(.clk(clk), .in1(RFWEE), .in2(MtoRFSelE), .in3(RFDSelE), .in4(ALUInSelE), .in5(BranchE), .in6(ALUselE), .in7(DMWEE), .out1(RFWEM), .out2(MtoRFSelM), .out3(RFDSelM), .out4(ALUInSelM), .out5(BranchM), .out6(ALUselM), .out7(DMWEM));
  181. //EXECUTE
  182.  
  183.  
  184. //MEMORY
  185. data #(.WL(WL)) data1(.clk(clk), .DMWD(DMdinM), .DMWE(DMWEM), .DMA(ALUoutM), .DMRD(DMoutM));
  186. memRegister #(.WL(WL)) memory(.clk(clk), .in1(ALUoutM), .in2(DMoutM), .in3(rtdM), .out1(ALUoutW), .out2(DMoutW), .out3(rtdW));
  187. conRegister conM(.clk(clk), .in1(RFWEM), .in2(MtoRFSelM), .in3(RFDSelM), .in4(ALUInSelM), .in5(BranchE), .in6(ALUselM), .in7(DMWEM), .out1(RFWEW), .out2(MtoRFSelW), .out3(RFDSelW), .out4(ALUInSelW), .out5(BranchW), .out6(ALUselW), .out7(DMWEW));
  188. //MEMORY
  189.  
  190.  
  191. //WRITEBACK
  192. mux #(.WL(WL)) muxy3(.in1(ALUoutW), .in2(DMoutW), .sel(MtoRFSelW), .out(ALUDMW));
  193. //WRITEBACK
  194.  
  195. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement