Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.32 KB | None | 0 0
  1. //-------------------------------------------------------
  2. // mipsmulti.v
  3. // David_Harris@hmc.edu 8 November 2005
  4. // Update to SystemVerilog 17 Nov 2010 DMH
  5. // Multicycle MIPS processor
  6. //------------------------------------------------
  7.  
  8. module mips(input logic clk, reset,
  9. output logic [31:0] adr, writedata,
  10. output logic memwrite,
  11. input logic [31:0] readdata);
  12.  
  13. logic zero, pcen, irwrite, regwrite,
  14. alusrca, iord, memtoreg, regdst;
  15. logic [1:0] alusrcb, pcsrc;
  16. logic [2:0] alucontrol;
  17. logic [5:0] op, funct;
  18.  
  19. controller c(clk, reset, op, funct, zero,
  20. pcen, memwrite, irwrite, regwrite,
  21. alusrca, iord, memtoreg, regdst,
  22. alusrcb, pcsrc, alucontrol);
  23. datapath dp(clk, reset,
  24. pcen, irwrite, regwrite,
  25. alusrca, iord, memtoreg, regdst,
  26. alusrcb, pcsrc, alucontrol,
  27. op, funct, zero,
  28. adr, writedata, readdata);
  29. endmodule
  30.  
  31. module controller(input logic clk, reset,
  32. input logic [5:0] op, funct,
  33. input logic zero,
  34. output logic pcen, memwrite, irwrite, regwrite,
  35. output logic alusrca, iord, memtoreg, regdst,
  36. output logic [1:0] alusrcb, pcsrc,
  37. output logic [2:0] alucontrol);
  38.  
  39. logic [1:0] aluop;
  40. logic branch, bne, pcwrite;
  41.  
  42. // Main Decoder and ALU Decoder subunits.
  43. maindec md(clk, reset, op,
  44. pcwrite, memwrite, irwrite, regwrite,
  45. alusrca, branch, iord, memtoreg, regdst, bne,
  46. alusrcb, pcsrc, aluop);
  47. aludec ad(funct, aluop, alucontrol);
  48.  
  49. assign pcen = pcwrite | branch & zero | bne & ~zero;
  50.  
  51. endmodule
  52.  
  53. module maindec(input logic clk, reset,
  54. input logic [5:0] op,
  55. output logic pcwrite, memwrite, irwrite, regwrite,
  56. output logic alusrca, branch, iord, memtoreg, regdst, bne,
  57. output logic [1:0] alusrcb, pcsrc,
  58. output logic [1:0] aluop);
  59.  
  60. parameter FETCH = 4'b0000; // State 0
  61. parameter DECODE = 4'b0001; // State 1
  62. parameter MEMADR = 4'b0010; // State 2
  63. parameter MEMRD = 4'b0011; // State 3
  64. parameter MEMWB = 4'b0100; // State 4
  65. parameter MEMWR = 4'b0101; // State 5
  66. parameter RTYPEEX = 4'b0110; // State 6
  67. parameter RTYPEWB = 4'b0111; // State 7
  68. parameter BEQEX = 4'b1000; // State 8
  69. parameter ADDIEX = 4'b1001; // State 9
  70. parameter ADDIWB = 4'b1010; // state 10
  71. parameter JEX = 4'b1011; // State 11
  72. parameter BNEEX = 4'b1100; // State 12
  73.  
  74. parameter LW = 6'b100011; // Opcode for lw
  75. parameter SW = 6'b101011; // Opcode for sw
  76. parameter RTYPE = 6'b000000; // Opcode for R-type
  77. parameter BEQ = 6'b000100; // Opcode for beq
  78. parameter ADDI = 6'b001000; // Opcode for addi
  79. parameter J = 6'b000010; // Opcode for j
  80. parameter BNE = 6'b000101; // Opcode for BNE
  81.  
  82. logic [3:0] state, nextstate;
  83. logic [15:0] controls;
  84.  
  85. // state register
  86. always_ff @(posedge clk or posedge reset)
  87. if(reset) state <= FETCH;
  88. else state <= nextstate;
  89.  
  90. // next state logic
  91. always_comb
  92. case(state)
  93. FETCH: nextstate <= DECODE;
  94. DECODE: case(op)
  95. LW: nextstate <= MEMADR;
  96. SW: nextstate <= MEMADR;
  97. RTYPE: nextstate <= RTYPEEX;
  98. BEQ: nextstate <= BEQEX;
  99. ADDI: nextstate <= ADDIEX;
  100. J: nextstate <= JEX;
  101. BNE: nextstate <= BNEEX;
  102. default: nextstate <= 4'bx; // should never happen
  103. endcase
  104. MEMADR: case(op)
  105. LW: nextstate <= MEMRD;
  106. SW: nextstate <= MEMWR;
  107. default: nextstate <= 4'bx;
  108. endcase
  109. MEMRD: nextstate <= MEMWB;
  110. MEMWB: nextstate <= FETCH;
  111. MEMWR: nextstate <= FETCH;
  112. RTYPEEX: nextstate <= RTYPEWB;
  113. RTYPEWB: nextstate <= FETCH;
  114. BEQEX: nextstate <= FETCH;
  115. ADDIEX: nextstate <= ADDIWB;
  116. ADDIWB: nextstate <= FETCH;
  117. JEX: nextstate <= FETCH;
  118. BNEEX: nextstate <= FETCH;
  119. default: nextstate <= 4'bx; // should never happen
  120. endcase
  121.  
  122. // output logic
  123. assign {bne, pcwrite, memwrite, irwrite, regwrite,
  124. alusrca, branch, iord, memtoreg, regdst,
  125. alusrcb, pcsrc, aluop} = controls;
  126.  
  127. always_comb
  128. case(state)
  129. FETCH: controls <= 16'h5010;
  130. DECODE: controls <= 16'h0030;
  131. MEMADR: controls <= 16'h0420;
  132. MEMRD: controls <= 16'h0100;
  133. MEMWB: controls <= 16'h0880;
  134. MEMWR: controls <= 16'h2100;
  135. RTYPEEX: controls <= 16'h0402;
  136. RTYPEWB: controls <= 16'h0840;
  137. BEQEX: controls <= 16'h0605;
  138. ADDIEX: controls <= 16'h0420;
  139. ADDIWB: controls <= 16'h0800;
  140. JEX: controls <= 16'h4008;
  141. BNE: controls <= 16'h8505;
  142. default: controls <= 16'hxxxx; // should never happen
  143. endcase
  144. endmodule
  145.  
  146. module aludec(input logic [5:0] funct,
  147. input logic [1:0] aluop,
  148. output logic [2:0] alucontrol);
  149.  
  150. always @(*)
  151. case(aluop)
  152. 2'b00: alucontrol <= 3'b010; // add
  153. 2'b01: alucontrol <= 3'b110; // sub
  154. 2'b11: alucontrol <= 3'b001; // ori
  155. default: case(funct) // RTYPE
  156. 6'b100000: alucontrol <= 3'b010; // ADD
  157. 6'b100010: alucontrol <= 3'b110; // SUB
  158. 6'b100100: alucontrol <= 3'b000; // AND
  159. 6'b100101: alucontrol <= 3'b001; // OR
  160. 6'b101010: alucontrol <= 3'b111; // SLT
  161. default: alucontrol <= 3'bxxx; // ???
  162. endcase
  163. endcase
  164.  
  165. endmodule
  166.  
  167. module datapath(input logic clk, reset,
  168. input logic pcen, irwrite, regwrite,
  169. input logic alusrca, iord, memtoreg, regdst,
  170. input logic [1:0] alusrcb, pcsrc,
  171. input logic [2:0] alucontrol,
  172. output logic [5:0] op, funct,
  173. output logic zero,
  174. output logic [31:0] adr, writedata,
  175. input logic [31:0] readdata);
  176.  
  177. // Below are the internal signals of the datapath module.
  178.  
  179. logic [4:0] writereg;
  180. logic [31:0] pcnext, pc;
  181. logic [31:0] instr, data, srca, srcb;
  182. logic [31:0] a;
  183. logic [31:0] aluresult, aluout;
  184. logic [31:0] signimm; // the sign-extended immediate
  185. logic [31:0] signimmsh; // the sign-extended immediate shifted left by 2
  186. logic [31:0] wd3, rd1, rd2;
  187.  
  188. // op and funct fields to controller
  189. assign op = instr[31:26];
  190. assign funct = instr[5:0];
  191.  
  192. flopenr #(32) pcreg(clk, reset, pcen, pcnext, pc);
  193. mux2 #(32) adrmux(pc, aluout, iord, adr);
  194. flopenr #(32) instrreg(clk, reset, irwrite, readdata, instr);
  195. flopr #(32) datareg(clk, reset, readdata, data);
  196. mux2 #(5) regdstmux(instr[20:16], instr[15:11], regdst, writereg);
  197. mux2 #(32) wdmux(aluout, data, memtoreg, wd3);
  198. regfile rf(clk, regwrite, instr[25:21], instr[20:16], writereg, wd3, rd1, rd2);
  199. signext se(instr[15:0], signimm);
  200. sl2 immsh(signimm, signimmsh);
  201. flopr #(32) areg(clk, reset, rd1, a);
  202. flopr #(32) breg(clk, reset, rd2, writedata);
  203. mux2 #(32) srcamux(pc, a, alusrca, srca);
  204. mux4 #(32) srcbmux(writedata, 32'b100, signimm, signimmsh, alusrcb, srcb);
  205. alu alu(srca, srcb, alucontrol, aluresult, zero);
  206. flopr #(32) alureg(clk, reset, aluresult, aluout);
  207. mux3 #(32) pcmux(aluresult, aluout, {pc[31:28], instr[25:0], 2'b00}, pcsrc, pcnext);
  208.  
  209. endmodule
  210.  
  211.  
  212. module mux3 #(parameter WIDTH = 8)
  213. (input logic [WIDTH-1:0] d0, d1, d2,
  214. input logic [1:0] s,
  215. output logic [WIDTH-1:0] y);
  216.  
  217. assign #1 y = s[1] ? d2 : (s[0] ? d1 : d0);
  218. endmodule
  219.  
  220. module mux4 #(parameter WIDTH = 8)
  221. (input logic [WIDTH-1:0] d0, d1, d2, d3,
  222. input logic [1:0] s,
  223. output logic [WIDTH-1:0] y);
  224.  
  225. always_comb
  226. case(s)
  227. 2'b00: y <= d0;
  228. 2'b01: y <= d1;
  229. 2'b10: y <= d2;
  230. 2'b11: y <= d3;
  231. endcase
  232. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement