Advertisement
Guest User

Untitled

a guest
Nov 11th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module pipelined_machine(clk, reset);
  2.     input        clk, reset;
  3.  
  4.     wire [31:0]  PC;
  5.     wire [31:2]  next_PC, PC_plus4, PC_target,PC_plus4_DE;
  6.     wire [31:0]  inst, inst_DE;
  7.  
  8.     wire [31:0]  imm = {{ 16{inst_DE[15]} }, inst_DE[15:0] };  // sign-extended immediate
  9.     wire [4:0]   rs = inst_DE[25:21];
  10.     wire [4:0]   rt = inst_DE[20:16];
  11.     wire [4:0]   rd = inst_DE[15:11];
  12.     wire [5:0]   opcode = inst_DE[31:26];
  13.     wire [5:0]   funct = inst_DE[5:0];
  14.  
  15.     wire [4:0]   wr_regnum, wr_regnum_MW;
  16.     wire [2:0]   ALUOp;
  17.  
  18.     wire         RegWrite, BEQ, ALUSrc, MemRead, MemWrite, MemToReg, RegDst;
  19.     wire         PCSrc, zero;
  20.     wire [31:0]  rd1_data, rd2_data, B_data, alu_out_data, alu_pipelined, load_data, wr_data, pipeMuxOut, pipeMuxOut_MW, pipeMuxOut_A;
  21.     wire         forwardA,forwardB, stalling, flushed, pipedRegWrite, pipedMemRead, pipedMemWrite, pipedMemToReg;
  22.  
  23.  
  24.     // DO NOT comment out or rename this module
  25.     // or the test bench will break
  26.     register #(30, 30'h100000) PC_reg(PC[31:2], next_PC[31:2], clk, ~stalling, reset);
  27.  
  28.     assign PC[1:0] = 2'b0;  // bottom bits hard coded to 00
  29.     adder30 next_PC_adder(PC_plus4, PC[31:2], 30'h1);
  30.     adder30 target_PC_adder(PC_target, PC_plus4_DE, imm[29:0]);
  31.     mux2v #(30) branch_mux(next_PC, PC_plus4, PC_target, PCSrc);
  32.     assign PCSrc = BEQ & zero;
  33.  
  34.     // DO NOT comment out or rename this module
  35.     // or the test bench will break
  36.     instruction_memory imem(inst, PC[31:2]);
  37.  
  38.     mips_decode decode(ALUOp, RegWrite, BEQ, ALUSrc, MemRead, MemWrite, MemToReg, RegDst,
  39.                       opcode, funct);
  40.  
  41.     // DO NOT comment out or rename this module
  42.     // or the test bench will break
  43.     regfile rf (rd1_data, rd2_data,
  44.                rs, rt, wr_regnum_MW, wr_data,
  45.                pipedRegWrite, clk, reset);
  46.  
  47.     mux2v #(32) imm_mux(B_data, pipeMuxOut, imm, ALUSrc);
  48.     alu32 alu(alu_out_data, zero, ALUOp, pipeMuxOut_A, B_data);
  49.  
  50.     // DO NOT comment out or rename this module
  51.     // or the test bench will break
  52.     data_mem data_memory(load_data, alu_pipelined, pipeMuxOut_MW, pipedMemRead, pipedMemWrite, clk, reset);
  53.  
  54.     mux2v #(32) wb_mux(wr_data, alu_pipelined, load_data,pipedMemToReg);
  55.     mux2v #(5) rd_mux(wr_regnum, rt, rd, RegDst);
  56.  
  57.     mux2v #(32) pipeOrRtMux(pipeMuxOut,rd2_data,alu_pipelined,forwardB);
  58.     mux2v #(32) pipeOrRsMux(pipeMuxOut_A,rd1_data,alu_pipelined,forwardA);
  59.  
  60.  
  61.     register #(30) ifdePCPLUSFOURpipe(PC_plus4_DE,PC_plus4,clk,~stalling,flushed);
  62.     register #(32) ifdeINSTpipe(inst_DE,inst,clk,~stalling,flushed);
  63.     register #(5) mwREGNUMpipe(wr_regnum_MW,wr_regnum,clk,1'b1,reset);
  64.     register #(32) mwMUXOUTpipe(pipeMuxOut_MW,pipeMuxOut,clk,1'b1,reset);
  65.     register #(32) mwALUpipe(alu_pipelined,alu_out_data,clk,1'b1,reset);
  66.  
  67.     register #(1) regWritePipe(pipedRegWrite,RegWrite,clk,1'b1,reset);
  68.     register #(1) memToRegPipe(pipedMemToReg,MemToReg,clk,1'b1,reset);
  69.     register #(1) memReadPipe(pipedMemRead,MemRead,clk,1'b1,reset);
  70.     register #(1) memWritePipe(pipedMemWrite,MemWrite,clk,1'b1,reset);
  71.  
  72.     assign forwardA = pipedRegWrite & (wr_regnum_MW == rs) & (rs != 0);
  73.     assign forwardB = pipedRegWrite & (wr_regnum_MW == rt) & (rt != 0);
  74.     assign stalling = pipedMemRead & (forwardA | forwardB);
  75.     assign flushed = reset | PCSrc;
  76.  
  77. endmodule // pipelined_machine
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement