Advertisement
Guest User

Untitled

a guest
Oct 24th, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.90 KB | None | 0 0
  1. `define STATUS_REGISTER 5'd12
  2. `define CAUSE_REGISTER 5'd13
  3. `define EPC_REGISTER 5'd14
  4.  
  5. module cp0(rd_data, EPC, TakenInterrupt,
  6. regnum, wr_data, next_pc, TimerInterrupt,
  7. MTC0, ERET, clock, reset);
  8. output [31:0] rd_data, status_register, cause_register;
  9. output [29:0] EPC;
  10. output TakenInterrupt;
  11. input [4:0] regnum;
  12. input [31:0] wr_data;
  13. input [29:0] next_pc;
  14. input TimerInterrupt, MTC0, ERET, clock, reset;
  15.  
  16. // your Verilog for coprocessor 0 goes here
  17.  
  18. // Status Register
  19. assign status_register[31:16] = 0;
  20. assign status_register[15:8] = user_status[15:8];
  21. assign status_register[7:2] = 0;
  22. assign status_register[1] = exception_level;
  23. assign status_register[0] = user_status[0];
  24.  
  25. // Cause Register
  26. assign cause_register[31:16] = 0;
  27. assign cause_register[15] = TimerInterrupt;
  28. assign cause_register[14:0] = 0;
  29.  
  30. // Decoder
  31. decoder32 d32(decoder_out, regnum, MTC0);
  32.  
  33. // Exception Level
  34. dffe exception_level_dffe(exception_level, 1'b1, clock, TakenInterrupt, exception_level_reset);
  35. wire exception_level_reset = ERET | TakenInterrupt;
  36.  
  37. // EPC Register
  38. register #(30,) EPC_register(EPC, write_next_out, clock, EPC_enable, reset);
  39. wire EPC_enable = decoder_out[14] | TakenInterrupt;
  40.  
  41. // User Register
  42. register #(32,) user_status(user_status, wr_data, clock, decoder_out[12], reset);
  43.  
  44. // Muxes
  45. mux2v #(30) write_next(write_next_out, wr_data[31:2], next_pc, TakenInterrupt);
  46. wire [31:0] 32EPC = {EPC, 2'b0};
  47. mux32v #(32) m32(rd_data, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, status_register, cause_register, 32EPC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, regnum);
  48.  
  49. // TakenInterrupt
  50. wire TakenInterrupt = (cause_register[15] & status_register[15]) & (~(status_register[1]) & status_register[0]);
  51.  
  52. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement