Advertisement
Guest User

Untitled

a guest
Apr 30th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ps/1ps
  2. module simulacao32;
  3.  
  4. // PC
  5. logic load_PC;
  6. reg [63:0]PC_in;
  7. reg [63:0]PC_out;
  8.  
  9. // MEMORIA32
  10. logic clk;
  11. logic rst;
  12. reg [31:0]wdaddress;   
  13. reg [31:0]data;
  14. reg Wr;
  15. wire [31:0]dataPath; // OUT
  16.  
  17. // REGISTRADOR DE INSTRU??O
  18. logic load_ir;
  19. wire [4:0]instr19_15;
  20. wire [4:0]instr24_20;
  21. wire [4:0]instr11_7;
  22. wire [6:0]instr6_0;
  23. wire [31:0]instr31_0;
  24.  
  25. // ULA
  26. wire overFlow;
  27. wire negativo;
  28. wire z;
  29. wire [63:0]s;
  30. wire igual;
  31. wire menor;
  32. wire maior;
  33. reg [63:0]d4;
  34. reg [2:0]ALUfct; // Seletor de Opera??o
  35.  
  36. // SIGNAL EXTENSOR
  37. wire [63:0]extensorI;
  38.  
  39. // BANCO DE REGS
  40. reg [63:0]readData1;
  41. reg [63:0]readData2;
  42. logic writeReg;
  43.  
  44. // REG A E REG B
  45. logic loadRegA;
  46. logic loadRegB;
  47. wire [63:0]outRegA;
  48. wire [63:0]outRegB;
  49.  
  50. // MUX ULA
  51. logic [2:0]ALUSrcA;
  52. logic [2:0]ALUSrcB;
  53. wire [63:0]saidaMuxALUA;
  54. wire [63:0]saidaMuxALUB;
  55.  
  56. // ALUOUT
  57. logic loadAOut;
  58. wire [63:0]Aout;
  59.  
  60. reg [63:0]writeData;
  61.  
  62. // MEM?RIA 64
  63. wire [63:0]waddress64;        
  64. wire [63:0]Datain64;
  65. wire [63:0]Dataout64;
  66. reg [63:0]entrada64;
  67. logic Wr64;
  68.  
  69. // REGISTER
  70. logic loadMDR;
  71. wire [63:0]dataOutReg;
  72. wire [63:0]outEPC;
  73.  
  74. // MUX REGISTER
  75. logic [2:0]memToReg;
  76. wire [63:0]saidaMuxReg;
  77.  
  78. wire [63:0]extensorSB;
  79. wire [63:0]extensorU;
  80. wire [63:0]extensorS;
  81. wire [63:0]extensorUJ;
  82.  
  83.  
  84. reg [63:0]var1;
  85. reg [63:0]var0;
  86.  
  87.  
  88. //SHIFT
  89. wire [63:0] srliOut;
  90. wire [63:0] sraiOut;
  91. wire [63:0] slliOut;
  92. wire [63:0] RegsrliOut;
  93. wire [63:0] RegsraiOut;
  94. wire [63:0] RegslliOut;
  95. logic loadSRLIout, loadSRAIout, loadSLLIout;
  96.  
  97.  
  98. reg [2:0]seletorB;
  99. wire [63:0]outValB;
  100.  
  101. //LOAD
  102. wire [63:0] loadOut;
  103. reg [2:0] selLoad;
  104.  
  105.  
  106. // FIOS E REGS DAS EXCECOES
  107. reg selCausa;
  108. reg loadCausa;
  109. wire outCausa;
  110. reg loadEPC;
  111. reg [63:0] PC_inv;
  112. reg [63:0] var255;
  113. reg [63:0] var254;
  114. reg [2:0] seladd;
  115. reg [2:0] selPC;
  116. wire [63:0] entPC;
  117. wire [63:0]muxadd64s;
  118.  
  119. //Pinos
  120.  
  121. wire[63:0] entMemInst;
  122.  
  123. wire [63:0] extns;
  124.  
  125. reg [63:0] MemData;
  126. assign MemData = Dataout64;
  127.  
  128. reg [63:0] WAdress;
  129. reg [63:0] RAdress;
  130. assign WAdress = muxadd64s;
  131. assign RAdress = Aout;
  132.  
  133. reg [63:0] WriteDataMem;
  134. assign WriteDataMem = outValB;
  135.  
  136. reg [4:0] WriteRegister;
  137. assign WriteRegister = instr11_7;
  138.  
  139. reg [63:0]WriteDataReg;
  140. assign WriteDataReg = saidaMuxReg;
  141.  
  142. reg [63:0] MDR;
  143. assign MDR = dataOutReg;
  144.  
  145. reg [63:0] Alu;
  146. assign Alu = s;
  147.  
  148. reg [63:0]AluOut;
  149. assign AluOut = Aout;
  150.  
  151. reg [63:0] PC;
  152. assign PC = PC_out;
  153.  
  154. reg wr;
  155. assign wr = Wr64;
  156.  
  157. reg RegWrite;
  158. assign RegWrite = writeReg;
  159.  
  160. reg IRWrite;
  161. assign IRWrite = load_ir;
  162.  
  163. reg [63:0] EPC;
  164. assign EPC = outEPC;
  165.  
  166. reg [2:0]sel100;
  167.  
  168.  
  169. //extensor32 extensorload(.inSignal(dataPath),.outSignal(extns));
  170.  
  171. mux3 muxPC (.a(PC_in), .b(extns),.c(qualquercoisa), .sel(selPC),.outMux(entPC));
  172.  
  173. mux3 muxMemInstr (.a(PC_out), .b(var255),.c(var254), .sel(seladd),.outMux(entMemInst));
  174.  
  175. ModReg regCause(.inVal(selCausa),.loadReg(loadCausa),.outVal(outCausa));
  176.  
  177. // LIGANDO OS ModULOS
  178. PC ulapc (.raddress(entPC), .loadPC(load_PC), .Rst(rst), .Dataout(PC_out));
  179.  
  180. Memoria32 pcmem (.raddress(entMemInst), .waddress(wdaddress),
  181. .Clk(clk), .Datain(data), .Dataout(dataPath), .Wr(Wr) );
  182.  
  183. Instr_Reg_RISC_V meminst (.Clk(clk), .Reset(rst), .Load_ir(load_ir),
  184. .Entrada(dataPath), .Instr19_15(instr19_15), .Instr24_20(instr24_20), .Instr11_7(instr11_7), .Instr6_0(instr6_0), .Instr31_0(instr31_0)); // Insere no registrador de instru??es
  185.  
  186. bancoReg instbanco (.write(writeReg), .clock(clk), .reset(rst), .regreader1(instr19_15), .regreader2(instr24_20), .regwriteaddress(instr11_7),
  187. .datain(saidaMuxReg), .dataout1(readData1), .dataout2(readData2));
  188.  
  189. ModReg regA (.inVal(readData1), .loadReg(loadRegA), .outVal(outRegA));
  190.  
  191. ModReg regB (.inVal(readData2), .loadReg(loadRegB), .outVal(outRegB));
  192.  
  193. ModReg EPCmod (.inVal(PC_inv),.loadReg(loadEPC),.outVal(outEPC));
  194.  
  195. Extensor signextendI (.inSignal(instr31_0), .outSignal(extensorI));
  196.  
  197. Extensor2 signextendSB (.inSignal(instr31_0), .outSignal(extensorSB));
  198.  
  199. Extensor3 extendeS(.inSignal(instr31_0),.outSignal(extensorS));
  200.  
  201. Extensor4 signextendU(.inSignal(instr31_0), .outSignal(extensorU));
  202.  
  203. Extensor5 signextendLoad(.inSignal(Dataout64),.select(selLoad),.outSignal(loadOut));
  204.  
  205. extensorUJ signextendUJ(.inSignal(instr31_0), .outSignal(extensorUJ));
  206.  
  207. //SHIFTS
  208. shiftRL srli(.rin(outRegA),.immed(instr31_0[25:20]),.rd(srliOut));
  209.  
  210. shiftRA srai(.rin(outRegA),.immed(instr31_0[25:20]),.rd(sraiOut));
  211.  
  212. shift slli(.rin(outRegA),.immed(instr31_0[25:20]),.rd(slliOut));
  213.  
  214. ModReg SHIFToutSRLI (.inVal(srliOut), .loadReg(loadSRLIout), .outVal(RegsrliOut));
  215.  
  216. ModReg SHIFToutSRAI (.inVal(sraiOut), .loadReg(loadSRAIout), .outVal(RegsraiOut));
  217.  
  218. ModReg SHIFToutSLLI (.inVal(slliOut), .loadReg(loadSLLIout), .outVal(RegslliOut));
  219. //--------
  220.  
  221. mux5 muxUlaA (.a(PC_out), .b(outRegA), .c(extensorU), .d(PC_in), .sel(ALUSrcA),.outMux(saidaMuxALUA));
  222.  
  223. //-------- mux3 muxAdd64 (.a(Aout), .b(var255), .c(var254), .sel(seladd),.outMux(muxadd64s));
  224.  
  225. mux2 muxUlaB (.a(outRegB), .b(d4), .c(extensorI), .d(extensorSB), .e(extensorS),.f(extensorUJ), .g(Aout), .sel(ALUSrcB), .outMux(saidaMuxALUB) );
  226.  
  227. ula64 aritmop (.A(saidaMuxALUA), .B(saidaMuxALUB), .Seletor(ALUfct), .S(s), .Overflow(overFlow), .Negativo(negativo), .Z(z), .Igual(igual), .Maior(maior), .Menor(menor)); // Soma mais 4com o PC
  228.  
  229. ModReg ALUout (.inVal(s), .loadReg(loadAOut), .outVal(Aout));
  230.  
  231. ValorLido valB (.outMem64(Dataout64), .outB(outRegB), .seletor(seletorB), .outVal(outValB));
  232.  
  233. Memoria64 ALUtomem(.raddress(Aout), .waddress(Aout), .Clk(clk), .Datain(outValB), .Dataout(Dataout64), .Wr(Wr64));  //// Q PORRA E ISSO PQ AOUT E ENTRADA EM RADRESS E WADRESS...
  234.  
  235. register MDRmod(.clk(clk), .reset(rst), .regWrite(loadMDR), .DadoIn(loadOut), .DadoOut(dataOutReg));
  236.  
  237. mux4 muxWriteDataReg(.a(Aout), .b(dataOutReg), .c(var1), .d(var0),.e(RegsrliOut),.f(RegsraiOut),.g(RegslliOut),.h(PC_in),.sel(memToReg), .outMux(saidaMuxReg));
  238.  
  239. // ESTADOS DA MAQUINA DE ESTADOS
  240. enum{S_reset1,S_reset2,S_incPC_loadRegs,S_opcode,S_aluOp_I,S_loadMDR_I,S_memToReg_I,S_addi,S_writeReg_I,S_updatePC,S_Sb_1,S_Sb_2,S_Sb_3,S_branch,S_beginBranch,S_add, S_sub,S_and,S_slt,S_updateReg,S_lui,S_Store1,S_Store2,S_Store2_w,S_Store2_h,S_Store2_b,S_srli,S_srai,S_slli,S_stli,S_jal_1,S_jal_2,S_jal_3,S_jal_Branch,S_jalr_1,S_jalr_2,S_jalr_3,S_jalr_Branch, S_opindef, S_opindef2,S_over,S_over2}Estado;
  241.  
  242. //gerador de clock e reset
  243. localparam CLKPERIOD = 10000;
  244. localparam CLKDELAY = CLKPERIOD / 2;
  245.  
  246. initial begin
  247. clk = 1'b1;
  248. Wr = 0;
  249. d4 = 64'd4;
  250. var1 = 64'd1;
  251. var0 = 64'd0;
  252. rst = 1'b1;
  253. writeData = 0;
  254. var255 = 64'd255;
  255. var254 = 64'd254;
  256. sel100 = 3'b100;
  257. end
  258.  
  259. always #(CLKDELAY) clk = ~clk;
  260.  
  261. always_ff @(posedge clk or posedge rst)
  262. begin
  263.     if(rst) begin
  264.         Estado <= S_reset1;
  265.         rst = 1'b0;
  266.     end
  267.     else begin
  268.         if(overFlow)begin
  269.             selLoad = 3'b100;
  270.             Estado <= S_over;
  271.         end
  272.         else if(Estado == S_reset1) Estado <= S_updatePC;
  273.         else if(Estado == S_reset2) Estado <= S_updatePC;
  274.         else if(Estado == S_incPC_loadRegs) Estado <=  S_opcode;
  275.         else if(Estado ==  S_opcode) begin
  276.             if(instr6_0 == 7'b0010011 && instr31_0[14:12] == 3'b000 && instr31_0[11:7] == 5'b00000) Estado <= S_updatePC;
  277.             else if(instr6_0 == 7'b1110011) $stop;
  278.             else if(instr31_0[14:12] == 3'b010 && instr6_0 == 7'b0010011) Estado <= S_stli;
  279.             else if(instr6_0 == 7'b0000011 || instr6_0 == 7'b0010011) Estado <= S_aluOp_I;
  280.             else if(instr6_0 == 7'b1100111 && instr31_0[14:12] == 3'b000) Estado <= S_jalr_1;
  281.             else if(instr6_0 == 7'b1100011 || instr6_0 == 7'b1100111) Estado <= S_Sb_1;
  282.             else if(instr6_0 == 7'b0110011 && instr31_0[14:12] == 3'b000 &&  instr31_0[31:25] == 7'b0000000) Estado <= S_add;
  283.             else if(instr6_0 == 7'b0110011 && instr31_0[14:12] == 3'b000 && instr31_0[31:25] == 7'b0100000) Estado <= S_sub;
  284.             else if(instr6_0 == 7'b0110011 && instr31_0[14:12] == 3'b111) Estado <= S_and;
  285.             else if(instr6_0 == 7'b0110011 && instr31_0[14:12] == 3'b010) Estado <= S_slt;
  286.             else if(instr6_0 == 7'b0110111) Estado <= S_lui;
  287.             else if(instr6_0 == 7'b0100011) Estado <= S_Store1;
  288.             else if(instr6_0 == 7'b1101111) Estado <= S_jal_1;
  289.             else begin
  290.                 selLoad = 3'b100;
  291.                 Estado <= S_opindef;
  292.             end
  293.         end
  294.         else if (Estado == S_aluOp_I) begin
  295.             if(instr6_0 == 7'b0000011 && instr31_0[14:12] == 3'b000)begin //lb
  296.                 selLoad <= 3'b000;
  297.                 Estado <= S_loadMDR_I;
  298.             end
  299.             else if(instr6_0 == 7'b0000011 && instr31_0[14:12] == 3'b001)begin //lh
  300.                 selLoad <= 3'b001;
  301.                 Estado <= S_loadMDR_I;
  302.             end
  303.             else if(instr6_0 == 7'b0000011 && instr31_0[14:12] == 3'b010)begin //lw
  304.                 selLoad <= 3'b010;
  305.                 Estado <= S_loadMDR_I;
  306.             end
  307.             else if(instr6_0 == 7'b0000011 && instr31_0[14:12] == 3'b011)begin //ld
  308.                 selLoad <= 3'b011;
  309.                 Estado <= S_loadMDR_I;
  310.             end
  311.             else if(instr6_0 == 7'b0000011 && instr31_0[14:12] == 3'b100)begin //lbu
  312.                 selLoad <= 3'b100;
  313.                 Estado <= S_loadMDR_I;
  314.             end
  315.             else if(instr6_0 == 7'b0000011 && instr31_0[14:12] == 3'b101)begin //lhu
  316.                 selLoad <= 3'b101;
  317.                 Estado <= S_loadMDR_I;
  318.             end
  319.             else if(instr6_0 == 7'b0000011 && instr31_0[14:12] == 3'b110)begin //lhu
  320.                 selLoad <= 3'b110;
  321.                 Estado <= S_loadMDR_I;
  322.             end
  323.  
  324.             else if(instr31_0[14:12] == 3'b101 && instr31_0[31:26] == 6'b000000) Estado <= S_srli;
  325.             else if(instr31_0[14:12] == 3'b101 && instr31_0[31:26] == 6'b010000) Estado <= S_srai;
  326.             else if(instr31_0[14:12] == 3'b001 && instr31_0[31:26] == 6'b000000) Estado <= S_slli;
  327.             else if(instr31_0[14:12] == 3'b00 && instr31_0[6:0] == 7'b0010011) Estado <= S_addi;
  328.         end
  329.             else if(Estado == S_loadMDR_I) Estado <= S_memToReg_I;
  330.         else if(Estado == S_memToReg_I) Estado <= S_writeReg_I;
  331.         else if(Estado == S_addi) Estado <= S_writeReg_I;
  332.         else if(Estado == S_writeReg_I) Estado <= S_updatePC;
  333.         else if(Estado == S_Sb_1) Estado <= S_Sb_2;
  334.         else if (Estado == S_Store1)begin
  335.             if(instr31_0[14:12] == 3'b111) Estado <= S_Store2;
  336.             else if(instr31_0[14:12] == 3'b010) Estado <= S_Store2_w;
  337.             else if(instr31_0[14:12] == 3'b001) Estado <= S_Store2_h;
  338.             else if(instr31_0[14:12] == 3'b000) Estado <= S_Store2_b;
  339.         end
  340.         else if(Estado==S_opindef)Estado <= S_opindef2;
  341.         else if(Estado == S_opindef2) Estado <= S_updatePC;
  342.         else if(Estado == S_over) Estado <= S_over2;
  343.         else if(Estado == S_over2) Estado <= S_updatePC;
  344.         else if(Estado == S_Store2) Estado <= S_updatePC;
  345.         else if(Estado == S_Store2_w) Estado <= S_updatePC;
  346.         else if(Estado == S_Store2_h) Estado <= S_updatePC;
  347.         else if(Estado == S_Store2_b) Estado <= S_updatePC;
  348.         else if(Estado == S_jal_1) Estado <= S_jal_2;
  349.         else if(Estado == S_jal_2) Estado <= S_jal_3;
  350.         else if(Estado == S_jal_3) Estado <= S_jal_Branch;
  351.         else if(Estado == S_jal_Branch) Estado <= S_incPC_loadRegs;
  352.         else if(Estado == S_jalr_1) Estado <= S_jalr_2;
  353.         else if(Estado == S_jalr_2) Estado <= S_jalr_Branch;
  354.         else if(Estado == S_jalr_Branch) Estado <= S_incPC_loadRegs;
  355.         else if(Estado == S_Sb_2)begin
  356.             if(instr6_0 == 7'b1100011)begin
  357.                 if(z == 1) Estado <= S_branch;   //BEQ
  358.                 else Estado <= S_updatePC;
  359.             end
  360.             else if(instr6_0 == 7'b1100111 && instr31_0[14:12] == 3'b001) begin  //BNE
  361.                 if(z == 0) Estado <= S_branch;
  362.                 else Estado <= S_updatePC;
  363.             end
  364.             else if(instr6_0 == 7'b1100111 && instr31_0[14:12] == 3'b100) begin  //BLT
  365.                 if(menor) Estado <= S_branch;
  366.                 else Estado <= S_updatePC;
  367.             end
  368.             else if(instr6_0 == 7'b1100111 && instr31_0[14:12] == 3'b101) begin  //BGE
  369.                 if(menor) Estado <= S_updatePC;
  370.                 else Estado <= S_branch;
  371.             end
  372.         end
  373.         else if(Estado == S_Sb_3) Estado <= S_branch;
  374.         else if(Estado == S_add) Estado <= S_updateReg;
  375.         else if(Estado == S_sub) Estado <= S_updateReg;
  376.         else if(Estado == S_and) Estado <= S_updateReg;
  377.         else if(Estado == S_slt) Estado <= S_updateReg;
  378.         else if(Estado == S_stli) Estado <= S_updateReg;
  379.         else if(Estado == S_updateReg) Estado <= S_updatePC;
  380.         else if(Estado == S_lui) Estado <= S_updateReg;
  381.         else if(Estado == S_updateReg) Estado <= S_updatePC;
  382.         else if(Estado == S_branch) Estado <= S_incPC_loadRegs;
  383.         else if(Estado == S_beginBranch) Estado <= S_opcode;
  384.         else if(Estado == S_updatePC) Estado <= S_incPC_loadRegs;
  385.         else if(Estado == S_srli || Estado == S_srai || Estado == S_slli) Estado <= S_writeReg_I;
  386.  
  387.         end
  388. end
  389.  
  390. always_comb begin
  391.  
  392.     if(Estado == S_over)begin
  393.         selCausa = 1;
  394.         loadCausa = 1;
  395.         PC_inv = PC_out;
  396.         loadEPC = 1;
  397.  
  398.         seladd = 3'b001;
  399.         selPC = 3'b001;
  400.     end
  401.     else if(Estado == S_over2) begin
  402.         loadEPC = 0;
  403.         load_PC = 0;
  404.     end
  405.     else if(Estado == S_reset1)begin
  406.         writeReg = 0;
  407.         ALUSrcA = 3'b0;
  408.         ALUSrcB = 3'b001;
  409.         ALUfct = 3'd0;
  410.         PC_in = s;
  411.         entrada64 = -8;
  412.         selPC = 3'b000;
  413.     end
  414.     else if(Estado == S_reset2) begin
  415.         load_ir = 0;
  416.     end
  417.     else if(Estado == S_incPC_loadRegs) begin
  418.     // espero q n de merda 
  419.         seladd = 3'b000;
  420.         selPC = 3'b000;
  421.  
  422.         loadAOut = 0;
  423.         load_PC = 0;
  424.         ALUSrcA = 3'b0;
  425.         ALUSrcB = 3'b001;
  426.         ALUfct = 3'd1;
  427.         PC_in = Alu;
  428.  
  429.         Wr64 = 0;
  430.         writeReg = 0;
  431.        
  432.        
  433.         loadRegA = 1;  
  434.         loadRegB = 1;
  435.         load_ir = 1;
  436.     end
  437.     else if(Estado == S_Store1) begin
  438.         load_ir = 0;
  439.         load_PC = 0;
  440.         loadMDR = 0;
  441.         loadAOut = 1;  
  442.         ALUSrcA = 3'b001;
  443.             ALUSrcB = 3'b100;  
  444.         ALUfct = 3'd1;
  445.         seletorB = 3'b000;
  446.         Wr64 = 0;
  447.     end
  448.     else if (Estado == S_Store2)begin
  449.         load_PC = 0;
  450.         memToReg = 3'b000;
  451.         loadMDR = 0;
  452.         load_ir = 0;
  453.         Wr64 = 1;
  454.     end
  455.     else if(Estado == S_Store2_w)begin
  456.         seletorB = 3'b001;
  457.         load_PC = 0;
  458.         memToReg = 3'b000;
  459.         loadMDR = 0;
  460.         load_ir = 0;
  461.         Wr64 = 1;      
  462.     end
  463.     else if(Estado == S_Store2_h)begin
  464.         seletorB = 3'b010;
  465.         load_PC = 0;
  466.         memToReg = 3'b000;
  467.         loadMDR = 0;
  468.         load_ir = 0;
  469.         Wr64 = 1;      
  470.     end
  471.     else if(Estado == S_Store2_b)begin
  472.         seletorB = 3'b011;
  473.         load_PC = 0;
  474.         memToReg = 3'b000;
  475.         loadMDR = 0;
  476.         load_ir = 0;
  477.         Wr64 = 1;      
  478.     end
  479.     else if(Estado == S_beginBranch) begin
  480.         writeReg = 0;
  481.         Wr64 = 0;
  482.         load_PC = 0;
  483.         load_ir = 0;   
  484.         loadRegA = 1;  
  485.         loadRegB = 1;
  486.     end
  487.     else if(Estado == S_opcode) begin
  488.         load_ir = 0;
  489.     end
  490.     else if(Estado == S_aluOp_I) begin
  491.    
  492.         load_ir = 0;
  493.         load_PC = 0;
  494.         loadAOut = 1;
  495.  
  496.         loadSRLIout = 1;
  497.         loadSRAIout = 1;
  498.         loadSLLIout = 1;
  499.  
  500.         ALUSrcA = 3'b001;
  501.             ALUSrcB = 3'b010;  
  502.         ALUfct = 3'd1;
  503.     end
  504.     else if(Estado == S_opindef) begin
  505.         selCausa = 0;
  506.         loadCausa = 1;
  507.         PC_inv = PC_out ;
  508.         loadEPC = 1;
  509.  
  510.         seladd = 3'b010;
  511.         selPC = 3'b001;
  512.         load_PC = 1;
  513.     end
  514.     else if(Estado == S_opindef2) begin
  515.         loadEPC = 0;
  516.         load_PC = 0;
  517.         loadCausa = 0;
  518.  
  519.     end
  520.     else if(Estado == S_loadMDR_I) begin
  521.         loadMDR = 1;
  522.     end
  523.     else if(Estado == S_memToReg_I)begin
  524.         memToReg = 1;
  525.     end
  526.     else if(Estado == S_addi) begin
  527.         //loadAOut = 0;
  528.         memToReg = 3'b000;
  529.         loadMDR = 0;
  530.     end
  531.     else if(Estado == S_updateReg) begin
  532.         loadAOut = 0;
  533.         load_PC = 0;
  534.         memToReg = 3'b000;
  535.         loadMDR = 0;
  536.         load_ir = 0;
  537.         writeReg = 1;
  538.     end
  539.     else if(Estado == S_writeReg_I) begin
  540.         writeReg = 1;
  541.     end
  542.     else if(Estado == S_Sb_1) begin
  543.         load_ir = 0;
  544.         load_PC = 0;
  545.         loadAOut = 1;
  546.         ALUSrcA = 3'b011;
  547.         ALUSrcB = 3'b011;
  548.         ALUfct = 3'd1;
  549.     end
  550.     else if(Estado == S_jal_1) begin
  551.         load_ir = 0;
  552.         load_PC = 0;
  553.         loadAOut = 1;
  554.         ALUSrcA = 3'b011;
  555.         ALUSrcB = 3'b101;
  556.         ALUfct = 3'd1;
  557.     end
  558.     else if(Estado == S_jal_2) begin
  559.         load_ir = 0;
  560.         loadAOut = 0;
  561.         memToReg = 3'b110;
  562.         writeReg = 1;
  563.     end
  564.     else if(Estado == S_jal_Branch) begin
  565.         writeReg = 0;
  566.         PC_out = Aout;
  567.         PC_in = PC_out + 4;
  568.         load_ir = 1;
  569.         //$display("%d",PC_out);
  570.     end
  571.     else if(Estado == S_jalr_1) begin
  572.         load_ir = 0;
  573.         load_PC = 0;
  574.         writeReg = 0;
  575.         memToReg = 3'b110;
  576.         loadAOut = 1;
  577.         ALUSrcA = 3'b1;
  578.         ALUSrcB = 3'b010;
  579.         ALUfct = 3'd1;
  580.     end
  581.     else if(Estado == S_jalr_2) begin
  582.         load_ir = 0;
  583.         loadAOut = 0;
  584.         writeReg = 1;
  585.         ALUSrcA = 3'b011;
  586.         ALUSrcA = 3'b110;
  587.         ALUfct = 3'd1;
  588.     end
  589.     else if(Estado == S_jalr_Branch) begin
  590.         writeReg = 0;
  591.         PC_out = s;
  592.         PC_in = PC_out + 4;
  593.         load_ir = 1;
  594.         //$display("%d",PC_out);   
  595.     end
  596.     else if(Estado == S_Sb_2) begin
  597.         loadAOut = 0;
  598.         ALUSrcA = 3'b001;
  599.         ALUSrcB = 3'b000;
  600.         ALUfct = 3'b010;
  601.         load_ir = 0;       
  602.     end
  603.     else if(Estado == S_Sb_3) begin
  604.         load_ir = 0;   
  605.     end
  606.     else if(Estado == S_branch) begin
  607.         writeReg = 0;
  608.         PC_out = Aout;
  609.         PC_in = PC_out + 4;
  610.         load_ir = 1;   
  611.         //$display("%d",PC_out);       
  612.     end
  613.     else if(Estado == S_updatePC) begin
  614.  
  615.         //teste
  616.         loadSRLIout = 0;
  617.         loadSRAIout = 0;
  618.         loadSLLIout = 0;
  619.         //--------
  620.  
  621.         /*loadAOut = 0;
  622.         load_PC = 0;
  623.         ALUSrcA = 3'b0;
  624.         ALUSrcB = 3'b001;
  625.         ALUfct = 3'd1;
  626.         PC_in = Alu;*/
  627.         load_PC = 1;
  628.         load_ir = 0;
  629.         writeReg = 0;
  630.         Wr64 = 0;
  631.     end
  632.     else if(Estado == S_add)begin
  633.         load_PC = 0;
  634.         load_ir = 0;
  635.         loadAOut = 1;
  636.         ALUSrcA = 3'b001;
  637.         ALUSrcB = 3'b000;
  638.         ALUfct = 3'b001;
  639.         writeReg = 1;  
  640.     end
  641.     else if(Estado == S_sub)begin
  642.         load_PC = 0;
  643.         loadAOut = 1;
  644.         load_ir = 0;
  645.         ALUSrcA = 3'b001;
  646.         ALUSrcB = 3'b000;
  647.         ALUfct = 3'b010;   
  648.         writeReg = 1;
  649.     end
  650.     else if(Estado == S_and)begin
  651.         load_PC = 0;
  652.         loadAOut = 1;
  653.         load_ir = 0;
  654.         ALUSrcA = 3'b001;
  655.         ALUSrcB = 3'b000;
  656.         ALUfct = 3'b011;   
  657.         writeReg = 1;
  658.     end
  659.     else if(Estado == S_slt)begin
  660.         load_PC = 0;
  661.         loadAOut = 1;
  662.         load_ir = 0;
  663.         ALUSrcA = 3'b001;
  664.         ALUSrcB = 3'b000;
  665.         ALUfct = 3'b011;
  666.         if(menor) memToReg = 3'b010;
  667.         else memToReg = 3'b011;
  668.         writeReg = 0;
  669.     end
  670.     else if(Estado == S_lui)begin
  671.         load_PC = 0;
  672.         loadAOut = 1;
  673.         load_ir = 0;
  674.         ALUSrcA = 3'b010;
  675.         ALUfct = 3'b000;   
  676.         writeReg = 1;
  677.     end
  678.     else if(Estado == S_srli)begin
  679.         memToReg = 3'b100;
  680.         loadMDR = 0;
  681.     end
  682.     else if(Estado == S_srai)begin
  683.         memToReg = 3'b101;
  684.         loadMDR = 0;   
  685.     end
  686.     else if(Estado == S_slli)begin
  687.         memToReg = 3'b111;
  688.         loadMDR = 0;
  689.     end
  690.     else if(Estado == S_stli)begin
  691.             load_PC = 0;
  692.             loadAOut = 1;
  693.             load_ir = 0;
  694.             ALUSrcA = 3'b001;
  695.             ALUSrcB = 3'b010;
  696.             ALUfct = 3'b011;
  697.             if(menor) memToReg = 3'b010;
  698.             else memToReg = 3'b011;
  699.             writeReg = 0;
  700.     end
  701. end
  702. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement