Advertisement
Guest User

Untitled

a guest
May 26th, 2018
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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, jal;
  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, jal,
  22.                alusrcb, pcsrc, alucontrol);
  23.   datapath dp(clk, reset,
  24.               pcen, irwrite, regwrite,
  25.               alusrca, iord, memtoreg, regdst, jal,
  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, jal,
  36.                   output logic [1:0] aregdst, lusrcb, pcsrc,
  37.                   output logic [2:0] alucontrol);
  38.  
  39.   logic [1:0] aluop;
  40.   logic       branch, 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, jal,
  46.              alusrcb, pcsrc, aluop);
  47.   aludec  ad(funct, aluop, alucontrol);
  48.  
  49.   assign pcen = pcwrite | branch & 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, jal,
  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   IWB     = 4'b1010;    // state 10
  71.   parameter   JEX     = 4'b1011;    // State 11
  72.   parameter   ORIEX   = 4'b1100;    // State 12
  73.   parameter   JALEX   = 4'b1101; // state 14
  74.   parameter   JALWB   = 4'b1110; // state 15
  75.  
  76.   parameter   LW      = 6'b100011;  // Opcode for lw
  77.   parameter   SW      = 6'b101011;  // Opcode for sw
  78.   parameter   RTYPE   = 6'b000000;  // Opcode for R-type
  79.   parameter   BEQ     = 6'b000100;  // Opcode for beq
  80.   parameter   ADDI    = 6'b001000;  // Opcode for addi
  81.   parameter   ORI     = 6'b001100;  // Opcode for ori
  82.   parameter   J       = 6'b000010;  // Opcode for j
  83.   parameter   JAL     = 6'b000011;  // Opcode for jal
  84.  
  85.   logic [3:0]  state, nextstate;
  86.   logic [15:0] controls;
  87.  
  88.   // state register
  89.   always_ff @(posedge clk or posedge reset)
  90.     if(reset) state <= FETCH;
  91.     else state <= nextstate;
  92.  
  93.   // next state logic
  94.   always_comb
  95.     case(state)
  96.       FETCH:   nextstate <= DECODE;
  97.       DECODE:  case(op)
  98.                  LW:      nextstate <= MEMADR;
  99.                  SW:      nextstate <= MEMADR;
  100.                  RTYPE:   nextstate <= RTYPEEX;
  101.                  BEQ:     nextstate <= BEQEX;
  102.                  ADDI:    nextstate <= ADDIEX;
  103.                  ORI:     nextstate <= ORIEX;
  104.                  J:       nextstate <= JEX;
  105.                  JAL:     nextstate <= JALEX;
  106.                  default: nextstate <= 4'bx; // should never happen
  107.                endcase
  108.       MEMADR: case(op)
  109.                  LW:      nextstate <= MEMRD;
  110.                  SW:      nextstate <= MEMWR;
  111.                  default: nextstate <= 4'bx;
  112.                endcase
  113.       MEMRD:   nextstate <= MEMWB;
  114.       MEMWB:   nextstate <= FETCH;
  115.       MEMWR:   nextstate <= FETCH;
  116.       RTYPEEX: nextstate <= RTYPEWB;
  117.       RTYPEWB: nextstate <= FETCH;
  118.       BEQEX:   nextstate <= FETCH;
  119.       ADDIEX:  nextstate <= IWB;
  120.       ORIEX:   nextstate <= IWB;
  121.       IWB:     nextstate <= FETCH;
  122.       JEX:     nextstate <= FETCH;
  123.       JALEX:   nextstate <= JALWB;
  124.       default: nextstate <= 4'bx; // should never happen
  125.     endcase
  126.  
  127.   // output logic
  128.   assign {pcwrite, memwrite, irwrite, regwrite,
  129.           alusrca, branch, iord, memtoreg, regdst, jal,
  130.           alusrcb, pcsrc, aluop} = controls;
  131.  
  132.   always_comb
  133.     case(state)
  134.       FETCH:   controls <= 16'b10100000_00_01_00_00; //pcwrite, irwrite
  135.       DECODE:  controls <= 16'b00000000_00_11_00_00;
  136.       MEMADR:  controls <= 16'b00001000_00_10_00_00; //alusrca
  137.       MEMRD:   controls <= 16'b00000010_00_00_00_00; //iord
  138.       MEMWB:   controls <= 16'b00010001_00_00_00_00; //regwrite, memtoreg
  139.       MEMWR:   controls <= 16'b01000010_00_00_00_00; //memwrite, iord
  140.       RTYPEEX: controls <= 16'b00001000_00_00_00_10; //alusrca
  141.       RTYPEWB: controls <= 16'b00010000_10_00_00_00; //regwrite
  142.       BEQEX:   controls <= 16'b00001100_00_00_01_01; //alusrca, regwrite
  143.       ADDIEX:  controls <= 16'b00001000_00_10_00_00; //alusrca
  144.       IWB:     controls <= 16'b00010000_00_00_00_00; //regwrite
  145.       ORIEX:   controls <= 16'b00001000_00_10_00_11; //alusrca
  146.       JEX:     controls <= 16'b10000000_00_00_10_00; //pcwrite
  147.       JALEX:   controls <= 16'b10000000_01_01_00_00; //pcwrite
  148.       JALWB:   controls <= 16'b10010000_01_01_10_00;
  149.       default: controls <= 16'hxxxx; // should never happen
  150.     endcase
  151. endmodule
  152.  
  153. module aludec(input  logic [5:0] funct,
  154.               input  logic [1:0] aluop,
  155.               output logic [2:0] alucontrol);
  156.  
  157.   always @(*)
  158.     case(aluop)
  159.       2'b00: alucontrol <= 3'b010;  // add
  160.       2'b01: alucontrol <= 3'b110;  // sub
  161.       2'b11: alucontrol <= 3'b001; //  or
  162.       default: case(funct)          // RTYPE
  163.           6'b100000: alucontrol <= 3'b010; // ADD
  164.           6'b100010: alucontrol <= 3'b110; // SUB
  165.           6'b100100: alucontrol <= 3'b000; // AND
  166.           6'b100101: alucontrol <= 3'b001; // OR
  167.           6'b101010: alucontrol <= 3'b111; // SLT
  168.           default:   alucontrol <= 3'bxxx; // ???
  169.         endcase
  170.     endcase
  171.  
  172. endmodule
  173.  
  174. module datapath(input  logic        clk, reset,
  175.                 input  logic        pcen, irwrite, regwrite,
  176.                 input  logic        alusrca, iord, memtoreg, regdst, jal,
  177.                 input  logic [1:0]  alusrcb, pcsrc,
  178.                 input  logic [2:0]  alucontrol,
  179.                 output logic [5:0]  op, funct,
  180.                 output logic        zero,
  181.                 output logic [31:0] adr, writedata,
  182.                 input  logic [31:0] readdata);
  183.  
  184.   // Below are the internal signals of the datapath module.
  185.  
  186.   logic [4:0]  writereg;
  187.   logic [31:0] pcnext, pc;
  188.   logic [31:0] instr, data, srca, srcb;
  189.   logic [31:0] a;
  190.   logic [31:0] aluresult, aluout;
  191.   logic [31:0] signimm;   // the sign-extended immediate
  192.   logic [31:0] signimmsh;   // the sign-extended immediate shifted left by 2
  193.   logic [31:0] wd3, rd1, rd2;
  194.  
  195.   // op and funct fields to controller
  196.   assign op = instr[31:26];
  197.   assign funct = instr[5:0];
  198.  
  199.   flopenr #(32) pcreg(clk, reset, pcen, pcnext, pc);
  200.   mux2    #(32) adrmux(pc, aluout, iord, adr);
  201.   flopenr #(32) instrreg(clk, reset, irwrite, readdata, instr);
  202.   flopr   #(32) datareg(clk, reset, readdata, data);
  203.   mux3    #(5)  regdstmux(instr[20:16], instr[15:11], 5'b11111, {regdst, jal}, writereg);
  204.   mux2    #(32) wdmux(aluout, data, memtoreg, wd3);
  205.   regfile       rf(clk, regwrite, instr[25:21], instr[20:16], writereg, wd3, rd1, rd2);
  206.   signext       se(instr[15:0], signimm);
  207.   sl2           immsh(signimm, signimmsh);
  208.   flopr   #(32) areg(clk, reset, rd1, a);
  209.   flopr   #(32) breg(clk, reset, rd2, writedata);
  210.   mux2    #(32) srcamux(pc, a, alusrca, srca);
  211.   mux4    #(32) srcbmux(writedata, 32'b100, signimm, signimmsh, alusrcb, srcb);
  212.   alu           alu(srca, srcb, alucontrol, aluresult, zero);
  213.   flopr   #(32) alureg(clk, reset, aluresult, aluout);
  214.   mux3    #(32) pcmux(aluresult, aluout, {pc[31:28], instr[25:0], 2'b00}, pcsrc, pcnext);
  215.  
  216. endmodule
  217.  
  218.  
  219. module mux3 #(parameter WIDTH = 8)
  220.              (input  logic [WIDTH-1:0] d0, d1, d2,
  221.               input  logic [1:0]       s,
  222.               output logic [WIDTH-1:0] y);
  223.  
  224.   assign #1 y = s[1] ? d2 : (s[0] ? d1 : d0);
  225. endmodule
  226.  
  227. module mux4 #(parameter WIDTH = 8)
  228.              (input  logic [WIDTH-1:0] d0, d1, d2, d3,
  229.               input  logic [1:0]       s,
  230.               output logic [WIDTH-1:0] y);
  231.  
  232.    always_comb
  233.       case(s)
  234.          2'b00: y <= d0;
  235.          2'b01: y <= d1;
  236.          2'b10: y <= d2;
  237.          2'b11: y <= d3;
  238.       endcase
  239. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement