data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v
1: b'%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:43: Cannot find file containing module: \'Memoria\'\n Memoria memoria (.pc(pc), .instrucao(instrucao));  \n ^~~~~~~\n        ... Looked in:\n             data/full_repos/permissive/100975158/ProcessadorQuartus,data/full_repos/permissive/100975158/Memoria\n             data/full_repos/permissive/100975158/ProcessadorQuartus,data/full_repos/permissive/100975158/Memoria.v\n             data/full_repos/permissive/100975158/ProcessadorQuartus,data/full_repos/permissive/100975158/Memoria.sv\n             Memoria\n             Memoria.v\n             Memoria.sv\n             obj_dir/Memoria\n             obj_dir/Memoria.v\n             obj_dir/Memoria.sv\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:46: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(32)) if_id_pc (.clock(clock), .parada(parada), .limpar(limpar), .in(pc4), .out(pc_2));  \n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:47: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(32)) if_id_inst (.clock(clock), .parada(parada), .limpar(limpar), .in(instrucao), .out(instrucao_2));  \n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:89: Cannot find file containing module: \'BancoDeRegistradores\'\n BancoDeRegistradores registradores(.rs(rs), .rt(rt), .out_rs(out_rs), .out_rt(out_rt), .sinal_escrita(c_escrever_reg_5), .reg_escrita(reg_escrita_5), .dado_escrita(dado_escrita_5));  \n ^~~~~~~~~~~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:95: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(96)) id_ex_dados_reg (.clock(clock), .parada(parada), .limpar(limpar),\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:100: Cannot find file containing module: \'RegPipeline\'\n  RegPipeline #(.TAM(6)) id_ex_funct (.clock(clock), .parada(parada), .limpar(limpar), .in(funct), .out(funct_3));\n  ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:103: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(10)) id_ex_registradores (.clock(clock), .parada(parada), .limpar(limpar),\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:108: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(5)) id_ex_registrador_rs(.clock(clock), .parada(parada), .limpar(1\'b0),  \n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:113: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(32)) id_ex_pc (.clock(clock), .parada(parada), .limpar(1\'b0),\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:117: Cannot find file containing module: \'RegPipeline\'\n  RegPipeline #(.TAM(64)) id_ex_desvios (.clock(clock), .parada(1\'b0), .limpar(limpar),\n  ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:131: Cannot find file containing module: \'Controle\'\n Controle controle  (.opcode(opcode), .c_ALUOp(c_ALUOp), .c_memoria(c_memoria), .c_desvio(c_desvio), .c_fonte_ula(c_fonte_ula), .c_memtoreg(c_memtoreg), .c_escrever_reg(c_escrever_reg), .c_reg_destino(c_reg_destino), .c_jal(c_jal));\n ^~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:141: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(9)) id_ex_micro_sinais(.clock(clock), .parada(1\'b0), .limpar(parada),  \n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:145: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(3)) id_ex_branch_sinais(.clock(clock), .parada(1\'b0), .limpar(limpar),\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:158: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(5)) ex_me_micro_sinais(.clock(clock), .parada(1\'b0), .limpar(limpar),  \n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:166: Cannot find file containing module: \'controleALU\'\n controleALU controle_alu (.funct(funct_3), .opALU(c_ALUOp_3), .sinalOperacao(operacao));  \n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:185: Cannot find file containing module: \'ALU\'\n ALU alu (.sinalOperacao(operacao), .rs(dado1_antecipado), .rt(segundo_operando), .resultado(resultado_ula), .overflow(overflow), .zero(zero));\n ^~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:193: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(2)) ex_me_flags_ula(.clock(clock), .parada(1\'b0), .limpar(limpar),\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:198: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(32)) ex_me_ula_resultado(.clock(clock), .parada(1\'b0), .limpar(limpar),\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:214: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(64)) ex_me_dado_registrador(.clock(clock), .parada(1\'b0), .limpar(limpar),\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:231: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(5)) ex_me_reg_escrita(.clock(clock), .parada(1\'b0), .limpar(limpar), .in(reg_escrita), .out(reg_escrita_4));\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:234: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(64)) ex_me_end_branch(.clock(clock), .parada(1\'b0), .limpar(limpar), .in({branch_end_3, jump_end_3}), .out({branch_end_4, jump_end_4}));\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:237: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(3)) ex_me_sinal_desvio(.clock(clock), .parada(1\'b0), .limpar(limpar), .in(c_desvio_3), .out(c_desvio_4));\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:240: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(32)) ex_me_pc(.clock(clock), .parada(1\'b0), .limpar(limpar), .in(pc_3), .out(pc_4));\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:246: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(3)) me_wb_microsinais(.clock(clock), .parada(1\'b0), .limpar(1\'b0), .in({c_memtoreg_4, c_escrever_reg_4, c_jal_4}), .out({c_memtoreg_5, c_escrever_reg_5, c_jal_5}) );\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:248: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(5)) me_wb_registrador(.clock(clock), .parada(1\'b0), .limpar(1\'b0), .in(reg_escrita_4), .out(reg_escrita_5));\n ^~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:251: Cannot find file containing module: \'MemoriaDeDados\'\n MemoriaDeDados memoria_dados(.clock(clock), .sinal_ler(c_memoria_4[0]), .sinal_escrever(c_memoria_4[1]), .endereco(resultado_ula_4[8:2]), .dado_ler(dado_lido_memoria), .dado_escrever(dado_rt_4));\n ^~~~~~~~~~~~~~\n%Error: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:255: Cannot find file containing module: \'RegPipeline\'\n RegPipeline #(.TAM(96)) me_wb_dados(.clock(clock), .parada(1\'b0), .limpar(1\'b0),\n ^~~~~~~~~~~\n%Warning-WIDTH: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:332: Operator ASSIGNW expects 3 bits on the Assign RHS, but Assign RHS\'s VARREF \'antecipar_a\' generates 2 bits.\n                                                                                         : ... In instance Processador\n assign t_antecipar_a = antecipar_a;\n                      ^\n                ... Use "/* verilator lint_off WIDTH */" and lint_on around source to disable this message.\n%Warning-WIDTH: data/full_repos/permissive/100975158/ProcessadorQuartus/Processador.v:333: Operator ASSIGNW expects 3 bits on the Assign RHS, but Assign RHS\'s VARREF \'antecipar_b\' generates 2 bits.\n                                                                                         : ... In instance Processador\n assign t_antecipar_b = antecipar_b;\n                      ^\n%Error: Exiting due to 27 error(s), 2 warning(s)\n'
module Processador(input clock,
						 output wire[31:0] t_pc, t_inst, t_alu_a, t_alu_b, t_wb_data, t_mem_write_data, t_alu_rst, t_d_rs, t_d_rt,
						 output wire[4:0] t_wb_reg, t_rs, t_rt, t_rd,
						 output wire t_fonte_pc, t_limpar, t_parada, t_escrever_reg,
						 output wire[2:0] t_antecipar_a, t_antecipar_b, t_operacao_alu);



	reg[4:0] reg_pc;
	initial begin
		reg_pc <= 5'b11111;
	end

	reg limpar;
	always @ ( * ) begin
		limpar <= 0;
		if (fonte_pc)
			limpar <= 1;
	end

	assign t_fonte_pc = fonte_pc;
	assign t_limpar = limpar;

	reg [31:0] pc;

	initial begin
		pc <= 32'd0;
	end

	wire [31:0] pc4;
	assign pc4 = pc + 4;

	always @(posedge clock) begin
		if (parada)
			pc <= pc;
		else if (fonte_pc)
			pc <= endereco_salto;
		else
			pc <= pc4;
	end

	wire [31:0] instrucao;
	Memoria memoria (.pc(pc), .instrucao(instrucao));

	wire[31:0] pc_2, instrucao_2;
	RegPipeline #(.TAM(32)) if_id_pc (.clock(clock), .parada(parada), .limpar(limpar), .in(pc4), .out(pc_2));
	RegPipeline #(.TAM(32)) if_id_inst (.clock(clock), .parada(parada), .limpar(limpar), .in(instrucao), .out(instrucao_2));

	assign t_pc = pc;
	assign t_inst = instrucao;





	wire[5:0] opcode;
	wire[4:0] rs, rt, rd;
	wire[4:0] shift;
	wire[5:0] funct;
	wire[15:0] imediato;


	assign opcode = instrucao_2[31:26];
	assign rs = instrucao_2[25:21];
	assign rt = instrucao_2[20:16];
	assign rd = instrucao_2[15:11];
	assign shift = instrucao_2[10:6];
	assign funct = instrucao_2[5:0];
	assign imediato = instrucao_2[15:0];

	wire[31:0] se_imediato;
	assign se_imediato = {{16{imediato[15]}}, imediato[15:0]};

	wire [31:0] jump_end;
	assign jump_end = {pc_2[31:28], instrucao_2[25:0], 2'b00};

	wire [31:0] branch_end;
	assign branch_end = pc_2 + {se_imediato[29:0], 2'b00};

	wire [31:0] out_rs, out_rt;

	assign t_rs = (rs);
	assign t_rt = (rt);
	assign t_rd = (rd);




	BancoDeRegistradores registradores(.rs(rs), .rt(rt), .out_rs(out_rs), .out_rt(out_rt), .sinal_escrita(c_escrever_reg_5), .reg_escrita(reg_escrita_5), .dado_escrita(dado_escrita_5));

	assign t_d_rs = out_rs;
	assign t_d_rt = out_rt;

	wire [31:0] dado_rs_3, dado_rt_3, se_imediato_3;
	RegPipeline #(.TAM(96)) id_ex_dados_reg (.clock(clock), .parada(parada), .limpar(limpar),
																					.in({out_rs, out_rt, se_imediato}),
																					.out({dado_rs_3, dado_rt_3, se_imediato_3}));

  wire [5:0] funct_3;
  RegPipeline #(.TAM(6)) id_ex_funct (.clock(clock), .parada(parada), .limpar(limpar), .in(funct), .out(funct_3));

  wire [4:0] rt_3, rd_3;
	RegPipeline #(.TAM(10)) id_ex_registradores (.clock(clock), .parada(parada), .limpar(limpar),
																					.in({rt, rd}),
																					.out({rt_3, rd_3}));

	wire [4:0] rs_3;
	RegPipeline #(.TAM(5)) id_ex_registrador_rs(.clock(clock), .parada(parada), .limpar(1'b0),
	                      .in (rs),
	                      .out(rs_3));

	wire [31:0] pc_3;
	RegPipeline #(.TAM(32)) id_ex_pc (.clock(clock), .parada(parada), .limpar(1'b0),
																		.in(pc_2), .out(pc_3));

	wire[31:0] branch_end_3, jump_end_3;
  RegPipeline #(.TAM(64)) id_ex_desvios (.clock(clock), .parada(1'b0), .limpar(limpar),
                          .in({branch_end, jump_end}),
                          .out({branch_end_3, jump_end_3}));

  wire[1:0] c_ALUOp;
	wire[1:0] c_memoria;
	wire[2:0] c_desvio;
	wire c_fonte_ula;
	wire c_memtoreg;
	wire c_escrever_reg;
	wire c_reg_destino;
	wire c_jal;


	Controle controle  (.opcode(opcode), .c_ALUOp(c_ALUOp), .c_memoria(c_memoria), .c_desvio(c_desvio), .c_fonte_ula(c_fonte_ula), .c_memtoreg(c_memtoreg), .c_escrever_reg(c_escrever_reg), .c_reg_destino(c_reg_destino), .c_jal(c_jal));

	wire[1:0] c_ALUOp_3;
	wire[1:0] c_memoria_3;
	wire[2:0] c_desvio_3;
	wire c_fonte_ula_3;
	wire c_memtoreg_3;
	wire c_escrever_reg_3;
	wire c_reg_destino_3;
	wire c_jal_3;
	RegPipeline #(.TAM(9)) id_ex_micro_sinais(.clock(clock), .parada(1'b0), .limpar(parada),
																					.in({c_ALUOp, c_memoria, c_fonte_ula, c_memtoreg, c_escrever_reg, c_reg_destino, c_jal}),
																					.out({c_ALUOp_3, c_memoria_3, c_fonte_ula_3, c_memtoreg_3, c_escrever_reg_3, c_reg_destino_3, c_jal_3}));

	RegPipeline #(.TAM(3)) id_ex_branch_sinais(.clock(clock), .parada(1'b0), .limpar(limpar),
																						.in({c_desvio}),
																						.out({c_desvio_3}));






  wire[1:0] c_memoria_4;
	wire c_memtoreg_4;
	wire c_escrever_reg_4;
	wire c_jal_4;
	RegPipeline #(.TAM(5)) ex_me_micro_sinais(.clock(clock), .parada(1'b0), .limpar(limpar),
																					.in({c_memoria_3, c_memtoreg_3, c_escrever_reg_3, c_jal_3}),
																					.out({c_memoria_4, c_memtoreg_4, c_escrever_reg_4, c_jal_4}));

	wire [31:0] segundo_operando;
	assign segundo_operando = (c_fonte_ula_3) ? se_imediato_3 : dado2_antecipado;

  wire [2:0] operacao;
	controleALU controle_alu (.funct(funct_3), .opALU(c_ALUOp_3), .sinalOperacao(operacao));

	assign t_operacao_alu = operacao;

	reg [31:0] dado1_antecipado;
	always @ ( * ) begin
		case (antecipar_a)
			2'b01: dado1_antecipado <= resultado_ula_4;
			2'b10: dado1_antecipado <= dado_escrita_5;
			default: dado1_antecipado <= dado_rs_3;
		endcase
	end

	wire [31:0] resultado_ula;
	wire zero, overflow;

	assign t_alu_a = dado1_antecipado;
	assign t_alu_b = segundo_operando;

	ALU alu (.sinalOperacao(operacao), .rs(dado1_antecipado), .rt(segundo_operando), .resultado(resultado_ula), .overflow(overflow), .zero(zero));


	assign t_alu_rst = resultado_ula;

	wire zero_4;
	wire overflow_4;

	RegPipeline #(.TAM(2)) ex_me_flags_ula(.clock(clock), .parada(1'b0), .limpar(limpar),
																				.in({zero, overflow}),
																				.out({zero_4, overflow_4}));

	wire [31:0] resultado_ula_4;
	RegPipeline #(.TAM(32)) ex_me_ula_resultado(.clock(clock), .parada(1'b0), .limpar(limpar),
																				.in(resultado_ula),
																				.out(resultado_ula_4));



	reg [31:0] dado2_antecipado;
	always @ ( * ) begin
		case (antecipar_b)
			2'b01: dado2_antecipado <= resultado_ula_4;
			2'b10: dado2_antecipado <= dado_escrita_5;
			default: dado2_antecipado <= dado_rt_3;
		endcase
	end

	wire [31:0] dado_rt_4, dado_rs_4;
	RegPipeline #(.TAM(64)) ex_me_dado_registrador(.clock(clock), .parada(1'b0), .limpar(limpar),
																				.in({dado2_antecipado, dado1_antecipado}),
																				.out({dado_rt_4, dado_rs_4}));

	wire [4:0] reg_escrita;
	reg[4:0] reg_escrita_mux;
	always @ ( * ) begin
		if (c_desvio_3 == 3'b100)
			reg_escrita_mux <= reg_pc;
		else if (c_reg_destino_3 == 1'b1)
			reg_escrita_mux <= rd_3;
		else
			reg_escrita_mux <= rt_3;
	end
	assign reg_escrita = reg_escrita_mux;

	wire [4:0] reg_escrita_4;
	RegPipeline #(.TAM(5)) ex_me_reg_escrita(.clock(clock), .parada(1'b0), .limpar(limpar), .in(reg_escrita), .out(reg_escrita_4));

	wire [31:0] branch_end_4, jump_end_4;
	RegPipeline #(.TAM(64)) ex_me_end_branch(.clock(clock), .parada(1'b0), .limpar(limpar), .in({branch_end_3, jump_end_3}), .out({branch_end_4, jump_end_4}));

	wire[2:0] c_desvio_4;
	RegPipeline #(.TAM(3)) ex_me_sinal_desvio(.clock(clock), .parada(1'b0), .limpar(limpar), .in(c_desvio_3), .out(c_desvio_4));

	wire [31:0] pc_4;
	RegPipeline #(.TAM(32)) ex_me_pc(.clock(clock), .parada(1'b0), .limpar(limpar), .in(pc_3), .out(pc_4));




	wire c_memtoreg_5, c_escrever_reg_5, c_jal_5;
	RegPipeline #(.TAM(3)) me_wb_microsinais(.clock(clock), .parada(1'b0), .limpar(1'b0), .in({c_memtoreg_4, c_escrever_reg_4, c_jal_4}), .out({c_memtoreg_5, c_escrever_reg_5, c_jal_5}) );
	wire[4:0] reg_escrita_5;
	RegPipeline #(.TAM(5)) me_wb_registrador(.clock(clock), .parada(1'b0), .limpar(1'b0), .in(reg_escrita_4), .out(reg_escrita_5));

	wire [31:0] dado_lido_memoria;
	MemoriaDeDados memoria_dados(.clock(clock), .sinal_ler(c_memoria_4[0]), .sinal_escrever(c_memoria_4[1]), .endereco(resultado_ula_4[8:2]), .dado_ler(dado_lido_memoria), .dado_escrever(dado_rt_4));
	assign t_mem_write_data = dado_rt_4;

	wire[31:0] resultado_ula_5, dado_memoria_5, pc_5;
	RegPipeline #(.TAM(96)) me_wb_dados(.clock(clock), .parada(1'b0), .limpar(1'b0),
																			.in({resultado_ula_4, dado_lido_memoria, pc_4}),
																			.out({resultado_ula_5, dado_memoria_5, pc_5}));


	wire[31:0] endereco_salto;


	reg[31:0] endereco_salto_mux;
	reg fonte_pc;
	always @ ( * ) begin
    case (c_desvio_4)
      3'b001: begin
				fonte_pc <= zero_4;
				endereco_salto_mux <= branch_end_4;
			end
      3'b010: begin
				fonte_pc <= ~(zero_4);
				endereco_salto_mux <= branch_end_4;
			end
			3'b011: begin
				fonte_pc <= 1'b1;
				endereco_salto_mux <= jump_end_4;
			end
			3'b100: begin
				fonte_pc <= 1'b1;
				endereco_salto_mux <= jump_end_4;
			end
			3'b101: begin
				fonte_pc <= 1'b1;
				endereco_salto_mux <= dado_rs_4;
			end
      default: fonte_pc <= 1'b0;
    endcase
  end
  assign endereco_salto = endereco_salto_mux;





	wire[31:0] dado_escrita_5;
	reg[31:0] dado_escrita_5_mux;

	assign dado_escrita_5 = (c_jal_5) ? pc_5 : (c_memtoreg_5) ? dado_memoria_5 : resultado_ula_5;


	assign t_wb_reg = reg_escrita_5;
	assign t_wb_data = dado_escrita_5;
	assign t_escrever_reg = c_escrever_reg_5;

	reg [1:0] antecipar_a, antecipar_b;
	always @ ( * ) begin
		if (c_escrever_reg_4 && (reg_escrita_4 == rs_3))
			antecipar_a <= 2'b01;
		else if (c_escrever_reg_5 && (reg_escrita_5 == rs_3))
			antecipar_a <= 2'b10;
		else
			antecipar_a <= 2'b00;


		if (c_escrever_reg_4 && (reg_escrita_4 == rt_3))
			antecipar_b <= 2'b01;
		else if (c_escrever_reg_5 && (reg_escrita_5 == rt_3))
			antecipar_b <= 2'b10;
		else
			antecipar_b <= 2'b00;
	end

	assign t_antecipar_a = antecipar_a;
	assign t_antecipar_b = antecipar_b;



	reg parada;
  always @ ( * ) begin
    if (c_memtoreg_3 && ((rt == rt_3) || (rs == rt_3)))
      parada <= 1'b1;
    else
      parada <= 1'b0;
  end

	assign t_parada = parada;


endmodule
module Processador(input clock,
						 output wire[31:0] t_pc, t_inst, t_alu_a, t_alu_b, t_wb_data, t_mem_write_data, t_alu_rst, t_d_rs, t_d_rt,
						 output wire[4:0] t_wb_reg, t_rs, t_rt, t_rd,
						 output wire t_fonte_pc, t_limpar, t_parada, t_escrever_reg,
						 output wire[2:0] t_antecipar_a, t_antecipar_b, t_operacao_alu);




	reg[4:0] reg_pc;
	initial begin
		reg_pc <= 5'b11111;
	end

	reg limpar;
	always @ ( * ) begin
		limpar <= 0;
		if (fonte_pc)
			limpar <= 1;
	end

	assign t_fonte_pc = fonte_pc;
	assign t_limpar = limpar;

	reg [31:0] pc;

	initial begin
		pc <= 32'd0;
	end

	wire [31:0] pc4;
	assign pc4 = pc + 4;

	always @(posedge clock) begin
		if (parada)
			pc <= pc;
		else if (fonte_pc)
			pc <= endereco_salto;
		else
			pc <= pc4;
	end

	wire [31:0] instrucao;
	Memoria memoria (.pc(pc), .instrucao(instrucao));

	wire[31:0] pc_2, instrucao_2;
	RegPipeline #(.TAM(32)) if_id_pc (.clock(clock), .parada(parada), .limpar(limpar), .in(pc4), .out(pc_2));
	RegPipeline #(.TAM(32)) if_id_inst (.clock(clock), .parada(parada), .limpar(limpar), .in(instrucao), .out(instrucao_2));

	assign t_pc = pc;
	assign t_inst = instrucao;





	wire[5:0] opcode;
	wire[4:0] rs, rt, rd;
	wire[4:0] shift;
	wire[5:0] funct;
	wire[15:0] imediato;


	assign opcode = instrucao_2[31:26];
	assign rs = instrucao_2[25:21];
	assign rt = instrucao_2[20:16];
	assign rd = instrucao_2[15:11];
	assign shift = instrucao_2[10:6];
	assign funct = instrucao_2[5:0];
	assign imediato = instrucao_2[15:0];

	wire[31:0] se_imediato;
	assign se_imediato = {{16{imediato[15]}}, imediato[15:0]};

	wire [31:0] jump_end;
	assign jump_end = {pc_2[31:28], instrucao_2[25:0], 2'b00};

	wire [31:0] branch_end;
	assign branch_end = pc_2 + {se_imediato[29:0], 2'b00};

	wire [31:0] out_rs, out_rt;

	assign t_rs = (rs);
	assign t_rt = (rt);
	assign t_rd = (rd);




	BancoDeRegistradores registradores(.rs(rs), .rt(rt), .out_rs(out_rs), .out_rt(out_rt), .sinal_escrita(c_escrever_reg_5), .reg_escrita(reg_escrita_5), .dado_escrita(dado_escrita_5));

	assign t_d_rs = out_rs;
	assign t_d_rt = out_rt;

	wire [31:0] dado_rs_3, dado_rt_3, se_imediato_3;
	RegPipeline #(.TAM(96)) id_ex_dados_reg (.clock(clock), .parada(parada), .limpar(limpar),
																					.in({out_rs, out_rt, se_imediato}),
																					.out({dado_rs_3, dado_rt_3, se_imediato_3}));

  wire [5:0] funct_3;
  RegPipeline #(.TAM(6)) id_ex_funct (.clock(clock), .parada(parada), .limpar(limpar), .in(funct), .out(funct_3));

  wire [4:0] rt_3, rd_3;
	RegPipeline #(.TAM(10)) id_ex_registradores (.clock(clock), .parada(parada), .limpar(limpar),
																					.in({rt, rd}),
																					.out({rt_3, rd_3}));

	wire [4:0] rs_3;
	RegPipeline #(.TAM(5)) id_ex_registrador_rs(.clock(clock), .parada(parada), .limpar(1'b0),
	                      .in (rs),
	                      .out(rs_3));

	wire [31:0] pc_3;
	RegPipeline #(.TAM(32)) id_ex_pc (.clock(clock), .parada(parada), .limpar(1'b0),
																		.in(pc_2), .out(pc_3));

	wire[31:0] branch_end_3, jump_end_3;
  RegPipeline #(.TAM(64)) id_ex_desvios (.clock(clock), .parada(1'b0), .limpar(limpar),
                          .in({branch_end, jump_end}),
                          .out({branch_end_3, jump_end_3}));

  wire[1:0] c_ALUOp;
	wire[1:0] c_memoria;
	wire[2:0] c_desvio;
	wire c_fonte_ula;
	wire c_memtoreg;
	wire c_escrever_reg;
	wire c_reg_destino;
	wire c_jal;


	Controle controle  (.opcode(opcode), .c_ALUOp(c_ALUOp), .c_memoria(c_memoria), .c_desvio(c_desvio), .c_fonte_ula(c_fonte_ula), .c_memtoreg(c_memtoreg), .c_escrever_reg(c_escrever_reg), .c_reg_destino(c_reg_destino), .c_jal(c_jal));

	wire[1:0] c_ALUOp_3;
	wire[1:0] c_memoria_3;
	wire[2:0] c_desvio_3;
	wire c_fonte_ula_3;
	wire c_memtoreg_3;
	wire c_escrever_reg_3;
	wire c_reg_destino_3;
	wire c_jal_3;
	RegPipeline #(.TAM(9)) id_ex_micro_sinais(.clock(clock), .parada(1'b0), .limpar(parada),
																					.in({c_ALUOp, c_memoria, c_fonte_ula, c_memtoreg, c_escrever_reg, c_reg_destino, c_jal}),
																					.out({c_ALUOp_3, c_memoria_3, c_fonte_ula_3, c_memtoreg_3, c_escrever_reg_3, c_reg_destino_3, c_jal_3}));

	RegPipeline #(.TAM(3)) id_ex_branch_sinais(.clock(clock), .parada(1'b0), .limpar(limpar),
																						.in({c_desvio}),
																						.out({c_desvio_3}));






  wire[1:0] c_memoria_4;
	wire c_memtoreg_4;
	wire c_escrever_reg_4;
	wire c_jal_4;
	RegPipeline #(.TAM(5)) ex_me_micro_sinais(.clock(clock), .parada(1'b0), .limpar(limpar),
																					.in({c_memoria_3, c_memtoreg_3, c_escrever_reg_3, c_jal_3}),
																					.out({c_memoria_4, c_memtoreg_4, c_escrever_reg_4, c_jal_4}));

	wire [31:0] segundo_operando;
	assign segundo_operando = (c_fonte_ula_3) ? se_imediato_3 : dado2_antecipado;

  wire [2:0] operacao;
	controleALU controle_alu (.funct(funct_3), .opALU(c_ALUOp_3), .sinalOperacao(operacao));

	assign t_operacao_alu = operacao;

	reg [31:0] dado1_antecipado;
	always @ ( * ) begin
		case (antecipar_a)
			2'b01: dado1_antecipado <= resultado_ula_4;
			2'b10: dado1_antecipado <= dado_escrita_5;
			default: dado1_antecipado <= dado_rs_3;
		endcase
	end

	wire [31:0] resultado_ula;
	wire zero, overflow;

	assign t_alu_a = dado1_antecipado;
	assign t_alu_b = segundo_operando;

	ALU alu (.sinalOperacao(operacao), .rs(dado1_antecipado), .rt(segundo_operando), .resultado(resultado_ula), .overflow(overflow), .zero(zero));


	assign t_alu_rst = resultado_ula;

	wire zero_4;
	wire overflow_4;

	RegPipeline #(.TAM(2)) ex_me_flags_ula(.clock(clock), .parada(1'b0), .limpar(limpar),
																				.in({zero, overflow}),
																				.out({zero_4, overflow_4}));

	wire [31:0] resultado_ula_4;
	RegPipeline #(.TAM(32)) ex_me_ula_resultado(.clock(clock), .parada(1'b0), .limpar(limpar),
																				.in(resultado_ula),
																				.out(resultado_ula_4));



	reg [31:0] dado2_antecipado;
	always @ ( * ) begin
		case (antecipar_b)
			2'b01: dado2_antecipado <= resultado_ula_4;
			2'b10: dado2_antecipado <= dado_escrita_5;
			default: dado2_antecipado <= dado_rt_3;
		endcase
	end

	wire [31:0] dado_rt_4, dado_rs_4;
	RegPipeline #(.TAM(64)) ex_me_dado_registrador(.clock(clock), .parada(1'b0), .limpar(limpar),
																				.in({dado2_antecipado, dado1_antecipado}),
																				.out({dado_rt_4, dado_rs_4}));

	wire [4:0] reg_escrita;
	reg[4:0] reg_escrita_mux;
	always @ ( * ) begin
		if (c_desvio_3 == 3'b100)
			reg_escrita_mux <= reg_pc;
		else if (c_reg_destino_3 == 1'b1)
			reg_escrita_mux <= rd_3;
		else
			reg_escrita_mux <= rt_3;
	end
	assign reg_escrita = reg_escrita_mux;

	wire [4:0] reg_escrita_4;
	RegPipeline #(.TAM(5)) ex_me_reg_escrita(.clock(clock), .parada(1'b0), .limpar(limpar), .in(reg_escrita), .out(reg_escrita_4));

	wire [31:0] branch_end_4, jump_end_4;
	RegPipeline #(.TAM(64)) ex_me_end_branch(.clock(clock), .parada(1'b0), .limpar(limpar), .in({branch_end_3, jump_end_3}), .out({branch_end_4, jump_end_4}));

	wire[2:0] c_desvio_4;
	RegPipeline #(.TAM(3)) ex_me_sinal_desvio(.clock(clock), .parada(1'b0), .limpar(limpar), .in(c_desvio_3), .out(c_desvio_4));

	wire [31:0] pc_4;
	RegPipeline #(.TAM(32)) ex_me_pc(.clock(clock), .parada(1'b0), .limpar(limpar), .in(pc_3), .out(pc_4));




	wire c_memtoreg_5, c_escrever_reg_5, c_jal_5;
	RegPipeline #(.TAM(3)) me_wb_microsinais(.clock(clock), .parada(1'b0), .limpar(1'b0), .in({c_memtoreg_4, c_escrever_reg_4, c_jal_4}), .out({c_memtoreg_5, c_escrever_reg_5, c_jal_5}) );
	wire[4:0] reg_escrita_5;
	RegPipeline #(.TAM(5)) me_wb_registrador(.clock(clock), .parada(1'b0), .limpar(1'b0), .in(reg_escrita_4), .out(reg_escrita_5));

	wire [31:0] dado_lido_memoria;
	MemoriaDeDados memoria_dados(.clock(clock), .sinal_ler(c_memoria_4[0]), .sinal_escrever(c_memoria_4[1]), .endereco(resultado_ula_4[8:2]), .dado_ler(dado_lido_memoria), .dado_escrever(dado_rt_4));
	assign t_mem_write_data = dado_rt_4;

	wire[31:0] resultado_ula_5, dado_memoria_5, pc_5;
	RegPipeline #(.TAM(96)) me_wb_dados(.clock(clock), .parada(1'b0), .limpar(1'b0),
																			.in({resultado_ula_4, dado_lido_memoria, pc_4}),
																			.out({resultado_ula_5, dado_memoria_5, pc_5}));


	wire[31:0] endereco_salto;


	reg[31:0] endereco_salto_mux;
	reg fonte_pc;
	always @ ( * ) begin
    case (c_desvio_4)
      3'b001: begin
				fonte_pc <= zero_4;
				endereco_salto_mux <= branch_end_4;
			end
      3'b010: begin
				fonte_pc <= ~(zero_4);
				endereco_salto_mux <= branch_end_4;
			end
			3'b011: begin
				fonte_pc <= 1'b1;
				endereco_salto_mux <= jump_end_4;
			end
			3'b100: begin
				fonte_pc <= 1'b1;
				endereco_salto_mux <= jump_end_4;
			end
			3'b101: begin
				fonte_pc <= 1'b1;
				endereco_salto_mux <= dado_rs_4;
			end
      default: fonte_pc <= 1'b0;
    endcase
  end
  assign endereco_salto = endereco_salto_mux;





	wire[31:0] dado_escrita_5;
	reg[31:0] dado_escrita_5_mux;

	assign dado_escrita_5 = (c_jal_5) ? pc_5 : (c_memtoreg_5) ? dado_memoria_5 : resultado_ula_5;


	assign t_wb_reg = reg_escrita_5;
	assign t_wb_data = dado_escrita_5;
	assign t_escrever_reg = c_escrever_reg_5;

	reg [1:0] antecipar_a, antecipar_b;
	always @ ( * ) begin
		if (c_escrever_reg_4 && (reg_escrita_4 == rs_3))
			antecipar_a <= 2'b01;
		else if (c_escrever_reg_5 && (reg_escrita_5 == rs_3))
			antecipar_a <= 2'b10;
		else
			antecipar_a <= 2'b00;


		if (c_escrever_reg_4 && (reg_escrita_4 == rt_3))
			antecipar_b <= 2'b01;
		else if (c_escrever_reg_5 && (reg_escrita_5 == rt_3))
			antecipar_b <= 2'b10;
		else
			antecipar_b <= 2'b00;
	end

	assign t_antecipar_a = antecipar_a;
	assign t_antecipar_b = antecipar_b;



	reg parada;
  always @ ( * ) begin
    if (c_memtoreg_3 && ((rt == rt_3) || (rs == rt_3)))
      parada <= 1'b1;
    else
      parada <= 1'b0;
  end

	assign t_parada = parada;


endmodule