diff --git a/Makefile b/Makefile index 58b02c7fd069198ef386a5a9db1925239ed6a763..8315e3b1dce89b7997615744f2e27d052a6d5cbe 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ all: ghdl -a --ieee=synopsys -fexplicit *.vhd ghdl -e --ieee=synopsys -fexplicit tb_main_processor - ./tb_main_processor --stop-time=600ns --vcd=tb.vcd - + ./tb_main_processor --stop-time=1000ns --vcd=tb.vcd + gtk: all gtkwave tb.vcd diff --git a/ctrl.vhd b/ctrl.vhd index 41d0b5ceea809ff0d5ca17b133b7d43d5ce72ab6..bcc15efb008eb53192795f2a1c1810ca972fb3fd 100644 --- a/ctrl.vhd +++ b/ctrl.vhd @@ -17,7 +17,7 @@ -- engineer: darci luiz tomasi junior -- e-mail: dltj007@gmail.com -- date : 25/06/2015 - 19:35 --- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ library ieee; use ieee.std_logic_1164.all; @@ -37,69 +37,68 @@ entity ctrl is end ctrl; architecture arc_ctrl of ctrl is - + begin process(opcode) begin case opcode is --type r - when "000000" => regdst <= '1'; - jump <= '0'; - alusrc <= '0'; - memtoreg <= '0'; - regwrite <= '1'; - memread <= '0'; - memwrite <= '0'; - branch <= '0'; - aluop(1) <= '1'; - aluop(0) <= '0'; - --type lw - when "100011" => regdst <= '0'; - jump <= '0'; - alusrc <= '1'; - memtoreg <= '1'; - regwrite <= '1'; - memread <= '1'; - memwrite <= '0'; - branch <= '0'; - aluop(1) <= '0'; - aluop(0) <= '0'; - --type sw - when "101011" => regdst <= '0'; --x - jump <= '0'; - alusrc <= '1'; - memtoreg <= '0'; --x - regwrite <= '0'; - memread <= '0'; - memwrite <= '1'; - branch <= '0'; - aluop(1) <= '0'; - aluop(0) <= '0'; + when "000000" => regdst <= '1'; + jump <= '0'; + alusrc <= '0'; + memtoreg <= '0'; + regwrite <= '1'; + memread <= '0'; + memwrite <= '0'; + branch <= '0'; + aluop(1) <= '1'; + aluop(0) <= '0'; + --type lw + when "100011" => regdst <= '0'; + jump <= '0'; + alusrc <= '1'; + memtoreg <= '1'; + regwrite <= '1'; + memread <= '1'; + memwrite <= '0'; + branch <= '0'; + aluop(1) <= '0'; + aluop(0) <= '0'; + --type sw + when "101011" => regdst <= '0'; --x + jump <= '0'; + alusrc <= '1'; + memtoreg <= '0'; --x + regwrite <= '0'; + memread <= '0'; + memwrite <= '1'; + branch <= '0'; + aluop(1) <= '0'; + aluop(0) <= '0'; --type jump - when "000010" => regdst <= '0'; --x - jump <= '1'; - alusrc <= '0'; - memtoreg <= '0'; --x - regwrite <= '0'; - memread <= '0'; - memwrite <= '0'; - branch <= '0'; - aluop(1) <= '1'; - aluop(0) <= '0'; + when "000010" => regdst <= '0'; --x + jump <= '1'; + alusrc <= '0'; + memtoreg <= '0'; --x + regwrite <= '0'; + memread <= '0'; + memwrite <= '0'; + branch <= '0'; + aluop(1) <= '1'; + aluop(0) <= '0'; --type beq - when others => regdst <= '0'; --x - jump <= '0'; - alusrc <= '0'; - memtoreg <= '0'; --x - regwrite <= '0'; - memread <= '0'; - memwrite <= '0'; - branch <= '1'; - aluop(1) <= '0'; - aluop(0) <= '1'; - + when others => regdst <= '0'; --x + jump <= '0'; + alusrc <= '0'; + memtoreg <= '0'; --x + regwrite <= '0'; + memread <= '0'; + memwrite <= '0'; + branch <= '1'; + aluop(1) <= '0'; + aluop(0) <= '1'; + end case; end process; end arc_ctrl; - diff --git a/hazard.vhd b/hazard.vhd new file mode 100644 index 0000000000000000000000000000000000000000..8703ec9471c57d398c82601ba8785473e94960c6 --- /dev/null +++ b/hazard.vhd @@ -0,0 +1,31 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity hazard is + port( + id_opcode : in std_logic_vector(5 downto 0); + if_rs : in std_logic_vector(4 downto 0); + if_rt : in std_logic_vector(4 downto 0); + id_rt : in std_logic_vector(4 downto 0); + flush : out std_logic + ); +end hazard; + +architecture arc_hazard of hazard is +begin + process(id_opcode, if_rt, if_rs, id_rt) + begin + -- id instruction is lw + if (id_opcode = "100011") then + -- id instruction changes if_rs or if_rt + if (if_rs = id_rt) or (if_rt = id_rt) then + flush <= '1'; + else + flush <= '0'; + end if; + else + flush <= '0'; + end if; + end process; +end architecture arc_hazard; diff --git a/inst.vhd b/inst.vhd index c001b4d85bdd598d04da3dedcdc26c763a1ab1f4..0d65edab55b16b48761626b71b2f78765ac42562 100644 --- a/inst.vhd +++ b/inst.vhd @@ -17,7 +17,7 @@ -- engineer: darci luiz tomasi junior -- e-mail: dltj007@gmail.com -- date : 01/07/2015 - 19:14 --- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; @@ -33,8 +33,8 @@ end inst; architecture arc_inst of inst is --deve ser 0 to 255 o array para facilitar a leitura do programa em ordem crescente type memory is array (0 to 255) of std_logic_vector(31 downto 0); - signal program : memory := ( x"118d0004", x"ac890000" ,x"012c4820",x"01886020", - x"08100000",x"ac890000",x"00000000",x"00000000",x"00000000",x"00000000",x"00000000", + signal program : memory := ( x"118d0005", x"012c4820" ,x"ac890000",x"01886020", + x"08100000",x"ac880000",x"ac890000",x"8c890000",x"ac890000",x"00000000",x"00000000", x"00000000",x"00000000",x"00000000",x"00000000",x"00000000",x"00000000",x"00000000", x"00000000",x"00000000",x"00000000",x"00000000",x"00000000",x"00000000",x"00000000", x"00000000",x"00000000",x"00000000",x"00000000",x"00000000",x"00000000",x"00000000", @@ -73,6 +73,5 @@ architecture arc_inst of inst is begin --o fator - x"00400000" devido ao incio das instrues no software mars out_a <= program(to_integer((unsigned(in_a) - x"00400000") srl 2)); - -end arc_inst; +end arc_inst; diff --git a/main_cttrl.vhd b/main_cttrl.vhd index 670119e7a86e86761df171259220ef1064f32423..75fbda2fd14f1c945048feca2faad59aa2cd85f7 100644 --- a/main_cttrl.vhd +++ b/main_cttrl.vhd @@ -16,269 +16,280 @@ -- -- engineer: darci luiz tomasi junior -- e-mail: dltj007@gmail.com --- date : 01/07/2015 - 22:08 +-- date : 01/07/2015 - 22:08 -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity main_processor is - port( - clk : in std_logic; - reset : in std_logic - ); +port( + clk : in std_logic; + reset : in std_logic +); end main_processor; architecture arc_main_processor of main_processor is - component add_pc is - port( - in_a : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component add is - port( - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component and_1 is - port( - branch : in std_logic; - in_a : in std_logic; - out_a : out std_logic - ); - end component; - - component concat is - port( - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component compare is - port( - inp_a: in std_logic_vector(31 downto 0); - inp_b: in std_logic_vector(31 downto 0); - outp: out std_logic - ); - end component; - - component ctrl is - port( - opcode : in std_logic_vector(5 downto 0); - regdst : out std_logic; - jump : out std_logic; - branch : out std_logic; - memread : out std_logic; - memtoreg : out std_logic; - aluop : out std_logic_vector(1 downto 0); - memwrite : out std_logic; - alusrc : out std_logic; - regwrite : out std_logic - ); - end component; - - component extend_signal is - port( - in_a : in std_logic_vector (15 downto 0); - out_a : out std_logic_vector (31 downto 0) - ); - end component; - - component inst is - port( - in_a : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component forward is - port( - reset : in std_logic; - rs : in std_logic_vector(4 downto 0); - rt : in std_logic_vector(4 downto 0); - writeMm: in std_logic; - rd_mm : in std_logic_vector(4 downto 0); - writeWb: in std_logic; - rd_wb : in std_logic_vector(4 downto 0); - sela : out std_logic_vector(1 downto 0); - selb : out std_logic_vector(1 downto 0) - ); - end component; - - component mem is - port( - clk : in std_logic; - reset : in std_logic; - memwrite : in std_logic; - memread : in std_logic; - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component mux is - port( - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - in_c : in std_logic_vector(31 downto 0); - sel : in std_logic_vector(1 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component mux2 is - port( - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - sel : in std_logic; - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component mx_1 is - port( - regdst : in std_logic; - in_a : in std_logic_vector(4 downto 0); - in_b : in std_logic_vector(4 downto 0); - out_a : out std_logic_vector(4 downto 0) - ); - end component; - - component mx_2 is - port( - alusrc : in std_logic; - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component mx_3 is - port( - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - in_c : in std_logic; - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component mx_4 is - port( - jump : in std_logic; - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component mx_5 is - port( - memtoreg : in std_logic; - in_a : in std_logic_vector(31 downto 0); - in_b : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component pc is - port( - clk : in std_logic; - reset : in std_logic; - in_a : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) - ); - end component; - - component reg is - port( - clk : in std_logic; - reset : in std_logic; - regwrite : in std_logic; - in_a : in std_logic_vector(4 downto 0); - in_b : in std_logic_vector(4 downto 0); - in_c : in std_logic_vector(4 downto 0); - in_d : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0); - out_b : out std_logic_vector(31 downto 0) - ); - end component; - - component reg128 is - port( - clk: in std_logic; - rst: in std_logic; - inp: in std_logic_vector(127 downto 0); - outp: out std_logic_vector(127 downto 0) - ); - end component; - - component reg64 is - port( - clk: in std_logic; - rst: in std_logic; - inp: in std_logic_vector(63 downto 0); - outp: out std_logic_vector(63 downto 0) - ); - end component; - - component sl_1 is - port( - in_a : in std_logic_vector (31 downto 0); - out_a : out std_logic_vector (31 downto 0) - ); - end component; - - component sl_2 is - port( - in_a : in std_logic_vector (31 downto 0); - out_a : out std_logic_vector (31 downto 0) - ); - end component; - - component ula_ctrl is - port ( - aluop : in std_logic_vector (1 downto 0); - in_a : in std_logic_vector (5 downto 0); - out_a : out std_logic_vector (2 downto 0) - ); - end component; - - component ula is - port( - in_a : in std_logic_vector (31 downto 0); --rs - in_b : in std_logic_vector (31 downto 0); --rt - in_c : in std_logic_vector (2 downto 0); - out_a : out std_logic_vector (31 downto 0); - zero : out std_logic - ); - end component; - +component add_pc is + port( + in_a : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component add is + port( + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component and_1 is + port( + branch : in std_logic; + in_a : in std_logic; + out_a : out std_logic + ); +end component; + +component concat is + port( + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + + component compare is + port( + inp_a: in std_logic_vector(31 downto 0); + inp_b: in std_logic_vector(31 downto 0); + outp: out std_logic + ); + end component; + +component ctrl is + port( + opcode : in std_logic_vector(5 downto 0); + regdst : out std_logic; + jump : out std_logic; + branch : out std_logic; + memread : out std_logic; + memtoreg : out std_logic; + aluop : out std_logic_vector(1 downto 0); + memwrite : out std_logic; + alusrc : out std_logic; + regwrite : out std_logic + ); +end component; + +component extend_signal is + port( + in_a : in std_logic_vector (15 downto 0); + out_a : out std_logic_vector (31 downto 0) + ); +end component; + +component inst is + port( + in_a : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component forward is + port( + reset : in std_logic; + rs : in std_logic_vector(4 downto 0); + rt : in std_logic_vector(4 downto 0); + writeMm: in std_logic; + rd_mm : in std_logic_vector(4 downto 0); + writeWb: in std_logic; + rd_wb : in std_logic_vector(4 downto 0); + sela : out std_logic_vector(1 downto 0); + selb : out std_logic_vector(1 downto 0) + ); +end component; + +component hazard is + port( + id_opcode : in std_logic_vector(5 downto 0); + if_rs : in std_logic_vector(4 downto 0); + if_rt : in std_logic_vector(4 downto 0); + id_rt : in std_logic_vector(4 downto 0); + flush : out std_logic + ); +end component; + +component mem is + port( + clk : in std_logic; + reset : in std_logic; + memwrite : in std_logic; + memread : in std_logic; + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component mux3 is + port( + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + in_c : in std_logic_vector(31 downto 0); + sel : in std_logic_vector(1 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component mux2 is + port( + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + sel : in std_logic; + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component mx_1 is + port( + regdst : in std_logic; + in_a : in std_logic_vector(4 downto 0); + in_b : in std_logic_vector(4 downto 0); + out_a : out std_logic_vector(4 downto 0) + ); +end component; + +component mx_2 is + port( + alusrc : in std_logic; + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component mx_3 is + port( + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + in_c : in std_logic; + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component mx_4 is + port( + jump : in std_logic; + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component mx_5 is + port( + memtoreg : in std_logic; + in_a : in std_logic_vector(31 downto 0); + in_b : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component pc is + port( + clk : in std_logic; + reset : in std_logic; + pc_write : in std_logic; + in_a : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) + ); +end component; + +component reg is + port( + clk : in std_logic; + reset : in std_logic; + regwrite : in std_logic; + in_a : in std_logic_vector(4 downto 0); + in_b : in std_logic_vector(4 downto 0); + in_c : in std_logic_vector(4 downto 0); + in_d : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0); + out_b : out std_logic_vector(31 downto 0) + ); +end component; + +component reg128 is + port( + clk: in std_logic; + rst: in std_logic; + inp: in std_logic_vector(127 downto 0); + outp: out std_logic_vector(127 downto 0) + ); +end component; + +component reg64 is + port( + clk: in std_logic; + rst: in std_logic; + inp: in std_logic_vector(63 downto 0); + outp: out std_logic_vector(63 downto 0) + ); +end component; + +component sl_1 is + port( + in_a : in std_logic_vector (31 downto 0); + out_a : out std_logic_vector (31 downto 0) + ); +end component; + +component sl_2 is + port( + in_a : in std_logic_vector (31 downto 0); + out_a : out std_logic_vector (31 downto 0) + ); +end component; + +component ula_ctrl is + port ( + aluop : in std_logic_vector (1 downto 0); + in_a : in std_logic_vector (5 downto 0); + out_a : out std_logic_vector (2 downto 0) + ); +end component; + +component ula is + port( + in_a : in std_logic_vector (31 downto 0); --rs + in_b : in std_logic_vector (31 downto 0); --rt + in_c : in std_logic_vector (2 downto 0); + out_a : out std_logic_vector (31 downto 0); + zero : out std_logic + ); +end component; + --add_pc signal s_add_pc_out_a : std_logic_vector(31 downto 0); signal s_mx_pc_out_a : std_logic_vector(31 downto 0); signal s_sel_mux_pc : std_logic; - + --add signal s_add_out_a : std_logic_vector(31 downto 0); - + --and_1 signal s_and_1_out_a : std_logic; - + --concat signal s_concat_out_a : std_logic_vector(31 downto 0); - + --ctrl - signal s_ctrl_regdst : std_logic; - signal s_ctrl_jump : std_logic; + signal s_ctrl_regdst : std_logic; + signal s_ctrl_jump : std_logic; signal s_ctrl_branch : std_logic; signal s_ctrl_memread : std_logic; signal s_ctrl_memtoreg : std_logic; @@ -287,81 +298,85 @@ architecture arc_main_processor of main_processor is signal s_ctrl_alusrc : std_logic; signal s_ctrl_regwrite : std_logic; - -- cmp + -- cmp signal s_cmp_zero : std_logic; - -- forward - signal s_sela_frwrd : std_logic_vector(1 downto 0); - signal s_selb_frwrd : std_logic_vector(1 downto 0); - signal s_rs_ex : std_logic_vector(4 downto 0); - signal s_rt_ex : std_logic_vector(4 downto 0); - signal s_rd_mm : std_logic_vector(4 downto 0); - signal s_rd_wb : std_logic_vector(4 downto 0); - signal s_wrtMm : std_logic; - signal s_wrtWb : std_logic; - signal s_ex_aluSrc: std_logic; - signal s_frwrd_b: std_logic_vector(31 downto 0); - signal s_mm_frwrd: std_logic_vector(31 downto 0); + -- forward + signal s_sela_frwrd : std_logic_vector(1 downto 0); + signal s_selb_frwrd : std_logic_vector(1 downto 0); + signal s_rs_ex : std_logic_vector(4 downto 0); + signal s_rt_ex : std_logic_vector(4 downto 0); + signal s_rd_mm : std_logic_vector(4 downto 0); + signal s_rd_wb : std_logic_vector(4 downto 0); + signal s_wrtMm : std_logic; + signal s_wrtWb : std_logic; + signal s_ex_aluSrc: std_logic; + signal s_frwrd_b: std_logic_vector(31 downto 0); + signal s_mm_frwrd: std_logic_vector(31 downto 0); --inst signal s_inst_out_a : std_logic_vector(31 downto 0); - + signal s_mux_flush_in_b : std_logic_vector(31 downto 0); + signal s_mux_flush_sel : std_logic; + signal s_mux_flush_out : std_logic_vector(31 downto 0); + --extend_signal signal s_extend_signal_out_a :std_logic_vector (31 downto 0); - + --mem signal s_mem_out_a : std_logic_vector(31 downto 0); - + --mx_1 signal s_mx_1_out_a : std_logic_vector(4 downto 0); - + --mx_2 signal s_mx_2_out_a : std_logic_vector(31 downto 0); - + --mx_3 signal s_mx_3_out_a : std_logic_vector(31 downto 0); - + --mx_4 signal s_mx_4_out_a : std_logic_vector(31 downto 0); - + --mx_5 signal s_mx_5_out_a : std_logic_vector(31 downto 0); - + --pc signal s_pc_out_a : std_logic_vector(31 downto 0); - + signal s_pc_write : std_logic; + --reg signal s_reg_out_a : std_logic_vector(31 downto 0); signal s_reg_out_b : std_logic_vector(31 downto 0); - - -- pipeline registers - signal s_if_id_in : std_logic_vector(63 downto 0); - signal s_if_id_out : std_logic_vector(63 downto 0); - signal s_id_ex_in : std_logic_vector(127 downto 0); - signal s_id_ex_out : std_logic_vector(127 downto 0); - signal s_ex_mm_in : std_logic_vector(127 downto 0); - signal s_ex_mm_out : std_logic_vector(127 downto 0); - signal s_mm_wb_in : std_logic_vector(127 downto 0); - signal s_mm_wb_out : std_logic_vector(127 downto 0); + + -- pipeline registers + signal s_if_id_in : std_logic_vector(63 downto 0); + signal s_if_id_out : std_logic_vector(63 downto 0); + signal s_id_ex_in : std_logic_vector(127 downto 0); + signal s_id_ex_out : std_logic_vector(127 downto 0); + signal s_ex_mm_in : std_logic_vector(127 downto 0); + signal s_ex_mm_out : std_logic_vector(127 downto 0); + signal s_mm_wb_in : std_logic_vector(127 downto 0); + signal s_mm_wb_out : std_logic_vector(127 downto 0); --sl_1 signal s_sl_1_out_a : std_logic_vector (31 downto 0); - + --sl_2 signal s_sl_2_out_a : std_logic_vector (31 downto 0); - + --ula_ctrl signal s_ula_ctrl_out_a : std_logic_vector (2 downto 0); - + --ula signal s_alu_inp_a : std_logic_vector (31 downto 0); signal s_ula_out_a : std_logic_vector (31 downto 0); --demais sinais signal s_geral_opcode : std_logic_vector(5 downto 0); - signal s_geral_rs : std_logic_vector(4 downto 0); - signal s_geral_rt : std_logic_vector(4 downto 0); - signal s_geral_rd : std_logic_vector(4 downto 0); + signal s_geral_rs : std_logic_vector(4 downto 0); + signal s_geral_rt : std_logic_vector(4 downto 0); + signal s_geral_rd : std_logic_vector(4 downto 0); signal s_geral_i_type : std_logic_vector(15 downto 0); signal s_geral_funct : std_logic_vector(5 downto 0); signal s_geral_jump : std_logic_vector(31 downto 0); @@ -369,20 +384,26 @@ architecture arc_main_processor of main_processor is begin - s_sel_mux_pc <= s_ctrl_jump or s_and_1_out_a; - c_mux2 : mux2 port map(s_add_pc_out_a, s_mx_4_out_a, s_sel_mux_pc, - s_mx_pc_out_a); - c_pc : pc port map(clk, reset, s_mx_pc_out_a, s_pc_out_a); + s_sel_mux_pc <= s_ctrl_jump or s_and_1_out_a; + -- intruction in next stage is lw and rd is rs or rt in this one + c_data_hazard: hazard port map(s_geral_opcode,s_inst_out_a(25 downto 21), + s_inst_out_a(20 downto 16), s_geral_rt, s_mux_flush_sel); + s_pc_write <= not s_mux_flush_sel; + c_mux2 : mux2 port map(s_add_pc_out_a, s_mx_4_out_a, s_sel_mux_pc, + s_mx_pc_out_a); + c_pc : pc port map(clk, reset, s_pc_write, s_mx_pc_out_a, s_pc_out_a); c_add_pc : add_pc port map(s_pc_out_a, s_add_pc_out_a); c_inst : inst port map(s_pc_out_a, s_inst_out_a); - - -- IF/ID - -- |63 32 | 31 0| - s_if_id_in <= s_add_pc_out_a(31 downto 0) & s_inst_out_a(31 downto 0); - c_if_id : reg64 port map(clk, reset, s_if_id_in, s_if_id_out); - -- s_add_pc_out é a parte mais significativa do registrador + c_mux_flush : mux2 port map(s_inst_out_a, x"00000000", s_mux_flush_sel, + s_mux_flush_out); + + -- IF/ID + -- |63 32 | 31 0| + s_if_id_in <= s_add_pc_out_a(31 downto 0) & s_mux_flush_out(31 downto 0); + c_if_id : reg64 port map(clk, reset, s_if_id_in, s_if_id_out); + -- s_add_pc_out é a parte mais significativa do registrador s_geral_pc_4 <= s_if_id_out(63 downto 32); - -- s_inst_out_a é a menos significativa deste registrador + -- s_inst_out_a é a menos significativa deste registrador s_geral_opcode <= s_if_id_out(31 downto 26); s_geral_rs <= s_if_id_out(25 downto 21); s_geral_rt <= s_if_id_out(20 downto 16); @@ -391,75 +412,74 @@ begin s_geral_funct <= s_if_id_out(5 downto 0); s_geral_jump <= s_if_id_out(31 downto 0); - c_sl_1 : sl_1 port map(s_geral_jump, s_sl_1_out_a); - c_ctrl : ctrl port map(s_geral_opcode, s_ctrl_regdst, s_ctrl_jump, s_ctrl_branch, - s_ctrl_memread, s_ctrl_memtoreg, s_ctrl_aluop, s_ctrl_memwrite, - s_ctrl_alusrc, s_ctrl_regwrite); - c_concat : concat port map(s_sl_1_out_a, s_geral_pc_4, s_concat_out_a); - c_sl_2 : sl_2 port map(s_extend_signal_out_a, s_sl_2_out_a); - c_reg : reg port map(clk, reset, s_mm_wb_out(70), s_geral_rs, s_geral_rt, - s_mm_wb_out(4 downto 0), s_mx_5_out_a, s_reg_out_a, s_reg_out_b); - c_extend_signal : extend_signal port map(s_geral_i_type, s_extend_signal_out_a); - c_add : add port map(s_geral_pc_4, s_sl_2_out_a, s_add_out_a); - c_cmp: compare port map (s_reg_out_a, s_reg_out_b, s_cmp_zero); - c_ula_ctrl : ula_ctrl port map(s_ctrl_aluop, s_geral_funct, s_ula_ctrl_out_a); - c_mx_3 : mx_3 port map(s_geral_pc_4, s_add_out_a, s_and_1_out_a, s_mx_3_out_a); - c_and_1 : and_1 port map(s_ctrl_branch, s_cmp_zero, s_and_1_out_a); - c_mx_4 : mx_4 port map(s_ctrl_jump, s_concat_out_a, s_mx_3_out_a, s_mx_4_out_a); - - -- ID/EX 41 zeros to put the input in the least sign & control & reg_out_a & reg_out_b & - -- inp_alu_b & rs & rt & rd & alu_control - -- |127-0| 119 | 118 | 117 | 116 - s_id_ex_in <= x"00" & s_ctrl_regwrite & s_ctrl_memtoreg & s_ctrl_memwrite & s_ctrl_memread - -- | 115 | 114 | 113 82 | 81 50 | 49 18 - & s_ctrl_regdst & s_ctrl_alusrc & s_reg_out_a & s_reg_out_b & s_extend_signal_out_a - -- | 17 13 | 12 8 | 7 3 | 2 0| - & s_geral_rs & s_geral_rt & s_geral_rd & s_ula_ctrl_out_a; - c_id_ex : reg128 port map(clk, reset, s_id_ex_in, s_id_ex_out); - - -- forwarding unity - s_rs_ex <= s_id_ex_out(17 downto 13); - s_rt_ex <= s_id_ex_out(12 downto 8); - s_rd_mm <= s_ex_mm_out(4 downto 0); - s_rd_wb <= s_mm_wb_out(4 downto 0); - s_wrtMm <= s_ex_mm_out(72); - s_wrtWb <= s_mm_wb_out(70); - s_mm_frwrd <= s_ex_mm_out(68 downto 37); - s_ex_aluSrc <= s_id_ex_out(114); - c_forward: forward port map(reset, s_rs_ex, s_rt_ex, s_wrtMm, s_rd_mm, - s_wrtWb, s_rd_wb, s_sela_frwrd, s_selb_frwrd); - - -- reg_out_a ula_out_ant - c_mux_fwrd_a: mux port map(s_id_ex_out(113 downto 82), s_mm_frwrd, s_mx_5_out_a, - s_sela_frwrd, s_alu_inp_a); - -- reg_out_b ula_out_ant - c_mux_fwrd_b: mux port map(s_id_ex_out(81 downto 50), s_mm_frwrd, s_mx_5_out_a, - s_selb_frwrd, s_frwrd_b); - - c_mx_2 : mx_2 port map(s_ex_aluSrc, s_frwrd_b, s_id_ex_out(49 downto 18), - s_mx_2_out_a); - c_ula : ula port map(s_alu_inp_a, s_mx_2_out_a, s_id_ex_out(2 downto 0), s_ula_out_a, open); - c_mx_1 : mx_1 port map(s_id_ex_out(115), s_id_ex_out(12 downto 8), s_id_ex_out(7 downto 3), - s_mx_1_out_a); - - -- EX/MM 56 zeros & control & alu_out & inp_alu_b & reg_dst - -- |127 73 | 72 69 | 68 37 | 36 5 - s_ex_mm_in <= x"0000000000000"& "000" & s_id_ex_out(119 downto 116) & s_ula_out_a & s_id_ex_out(81 downto 50) - -- | 4 0| - & s_mx_1_out_a; - c_ex_mm : reg128 port map(clk, reset, s_ex_mm_in, s_ex_mm_out); - - c_mem : mem port map(clk, reset, s_ex_mm_out(70), s_ex_mm_out(69), s_ex_mm_out(68 downto 37), - s_ex_mm_out(36 downto 5), s_mem_out_a); - - -- MM/WB - -- |127 71 | 70 69 | 68 37 | 36 5 - s_mm_wb_in <= x"00000000000000" & '0' & s_ex_mm_out(72 downto 71) & s_mem_out_a & s_ex_mm_out(68 downto 37) - -- | 4 0| - & s_ex_mm_out(4 downto 0); - c_mm_wb : reg128 port map(clk, reset, s_mm_wb_in, s_mm_wb_out); - - c_mx_5 : mx_5 port map(s_mm_wb_out(69), s_mm_wb_out(68 downto 37), s_mm_wb_out(36 downto 5), s_mx_5_out_a); - -end arc_main_processor; + c_sl_1 : sl_1 port map(s_geral_jump, s_sl_1_out_a); + c_ctrl : ctrl port map(s_geral_opcode, s_ctrl_regdst, s_ctrl_jump, s_ctrl_branch, + s_ctrl_memread, s_ctrl_memtoreg, s_ctrl_aluop, s_ctrl_memwrite, + s_ctrl_alusrc, s_ctrl_regwrite); + c_concat : concat port map(s_sl_1_out_a, s_geral_pc_4, s_concat_out_a); + c_sl_2 : sl_2 port map(s_extend_signal_out_a, s_sl_2_out_a); + c_reg : reg port map(clk, reset, s_mm_wb_out(70), s_geral_rs, s_geral_rt, + s_mm_wb_out(4 downto 0), s_mx_5_out_a, s_reg_out_a, s_reg_out_b); + c_extend_signal : extend_signal port map(s_geral_i_type, s_extend_signal_out_a); + c_add : add port map(s_geral_pc_4, s_sl_2_out_a, s_add_out_a); + c_cmp: compare port map (s_reg_out_a, s_reg_out_b, s_cmp_zero); + c_ula_ctrl : ula_ctrl port map(s_ctrl_aluop, s_geral_funct, s_ula_ctrl_out_a); + c_mx_3 : mx_3 port map(s_geral_pc_4, s_add_out_a, s_and_1_out_a, s_mx_3_out_a); + c_and_1 : and_1 port map(s_ctrl_branch, s_cmp_zero, s_and_1_out_a); + c_mx_4 : mx_4 port map(s_ctrl_jump, s_concat_out_a, s_mx_3_out_a, s_mx_4_out_a); + + -- ID/EX 41 zeros to put the input in the least sign & control & reg_out_a & reg_out_b & + -- inp_alu_b & rs & rt & rd & alu_control + -- |127-0| 119 | 118 | 117 | 116 + s_id_ex_in <= x"00" & s_ctrl_regwrite & s_ctrl_memtoreg & s_ctrl_memwrite & s_ctrl_memread + -- | 115 | 114 | 113 82 | 81 50 | 49 18 + & s_ctrl_regdst & s_ctrl_alusrc & s_reg_out_a & s_reg_out_b & s_extend_signal_out_a + -- | 17 13 | 12 8 | 7 3 | 2 0| + & s_geral_rs & s_geral_rt & s_geral_rd & s_ula_ctrl_out_a; + c_id_ex : reg128 port map(clk, reset, s_id_ex_in, s_id_ex_out); + + -- forwarding unity + s_rs_ex <= s_id_ex_out(17 downto 13); + s_rt_ex <= s_id_ex_out(12 downto 8); + s_rd_mm <= s_ex_mm_out(4 downto 0); + s_rd_wb <= s_mm_wb_out(4 downto 0); + s_wrtMm <= s_ex_mm_out(72); + s_wrtWb <= s_mm_wb_out(70); + s_mm_frwrd <= s_ex_mm_out(68 downto 37); + s_ex_aluSrc <= s_id_ex_out(114); + c_forward: forward port map(reset, s_rs_ex, s_rt_ex, s_wrtMm, s_rd_mm, + s_wrtWb, s_rd_wb, s_sela_frwrd, s_selb_frwrd); + + -- reg_out_a ula_out_ant + c_mux_fwrd_a: mux3 port map(s_id_ex_out(113 downto 82), s_mm_frwrd, s_mx_5_out_a, + s_sela_frwrd, s_alu_inp_a); + -- reg_out_b ula_out_ant + c_mux_fwrd_b: mux3 port map(s_id_ex_out(81 downto 50), s_mm_frwrd, s_mx_5_out_a, + s_selb_frwrd, s_frwrd_b); + c_mx_2 : mx_2 port map(s_ex_aluSrc, s_frwrd_b, s_id_ex_out(49 downto 18), + s_mx_2_out_a); + c_ula : ula port map(s_alu_inp_a, s_mx_2_out_a, s_id_ex_out(2 downto 0), s_ula_out_a, open); + c_mx_1 : mx_1 port map(s_id_ex_out(115), s_id_ex_out(12 downto 8), s_id_ex_out(7 downto 3), + s_mx_1_out_a); + + -- EX/MM 56 zeros & control & alu_out & inp_alu_b & reg_dst + -- |127 73 | 72 69 | 68 37 | 36 5 + s_ex_mm_in <= x"0000000000000"& "000" & s_id_ex_out(119 downto 116) & s_ula_out_a & s_id_ex_out(81 downto 50) + -- | 4 0| + & s_mx_1_out_a; + c_ex_mm : reg128 port map(clk, reset, s_ex_mm_in, s_ex_mm_out); + + c_mem : mem port map(clk, reset, s_ex_mm_out(70), s_ex_mm_out(69), s_ex_mm_out(68 downto 37), + s_ex_mm_out(36 downto 5), s_mem_out_a); + + -- MM/WB + -- |127 71 | 70 69 | 68 37 | 36 5 + s_mm_wb_in <= x"00000000000000" & '0' & s_ex_mm_out(72 downto 71) & s_mem_out_a & s_ex_mm_out(68 downto 37) + -- | 4 0| + & s_ex_mm_out(4 downto 0); + c_mm_wb : reg128 port map(clk, reset, s_mm_wb_in, s_mm_wb_out); + + c_mx_5 : mx_5 port map(s_mm_wb_out(69), s_mm_wb_out(68 downto 37), s_mm_wb_out(36 downto 5), s_mx_5_out_a); + +end arc_main_processor; diff --git a/mux.vhd b/mux3.vhd similarity index 92% rename from mux.vhd rename to mux3.vhd index dc9499ea52054558282f467cffabdd18820593ea..b36ce307869a8432c4725802668489eaa7a3a323 100644 --- a/mux.vhd +++ b/mux3.vhd @@ -17,11 +17,11 @@ -- engineer: darci luiz tomasi junior -- e-mail: dltj007@gmail.com -- date : 08/07/2015 - 19:11 --- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ library ieee; use ieee.std_logic_1164.all; -entity mux is +entity mux3 is port( in_a : in std_logic_vector(31 downto 0); in_b : in std_logic_vector(31 downto 0); @@ -29,14 +29,14 @@ entity mux is sel : in std_logic_vector(1 downto 0); out_a : out std_logic_vector(31 downto 0) ); -end mux; +end mux3; -architecture arc_mux of mux is +architecture arc_mux3 of mux3 is begin process(sel, in_a, in_b, in_c) begin - if sel = "00" then + if sel = "00" then out_a <= in_a; elsif sel = "01" then out_a <= in_b; @@ -44,5 +44,4 @@ begin out_a <= in_c; end if; end process; -end arc_mux; - +end arc_mux3; diff --git a/pc.vhd b/pc.vhd index d7f8b4ce8608fede80aa2456f3924e299528ddf8..27b4643d4f127d3db14153f4940c4efb137ee208 100644 --- a/pc.vhd +++ b/pc.vhd @@ -16,30 +16,32 @@ -- -- engineer: darci luiz tomasi junior -- e-mail: dltj007@gmail.com --- date : 01/07/2015 - 19:53 --- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-- date : 01/07/2015 - 19:53 +-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ library ieee; use ieee.std_logic_1164.all; entity pc is port( - clk : in std_logic; - reset : in std_logic; - in_a : in std_logic_vector(31 downto 0); - out_a : out std_logic_vector(31 downto 0) + clk : in std_logic; + reset : in std_logic; + pc_write: in std_logic; + in_a : in std_logic_vector(31 downto 0); + out_a : out std_logic_vector(31 downto 0) ); end pc; architecture arc_pc of pc is - + begin process(clk, reset) begin if reset = '1' then out_a <= x"00400000"; --para utilizar com o mars elsif clk'event and clk = '1' then - out_a <= in_a; + if pc_write = '1' then + out_a <= in_a; + end if; end if; end process; end arc_pc; - diff --git a/sum.asm b/sum.asm index 60b1377932f744d1b05ee30a17b347eca8c9af94..f2209a731ec7730f3c3425cc751b64301e8ff225 100644 --- a/sum.asm +++ b/sum.asm @@ -9,12 +9,16 @@ # li $t5, 6 # la $a0, xffff0000 for: beq $t4,$t5,fimfor - sw $t1, 0($a0) # j = j*i; add $t1, $t1, $t4 + + sw $t1, 0($a0) add $t4, $t4, $t0 j for + sw $t0, 0($a0) -fimfor: sw $t1, 0($a0) \ No newline at end of file +fimfor: sw $t1, 0($a0) + lw $t1 0($a0) + sw $t1 0($a0) \ No newline at end of file diff --git a/sum.hex b/sum.hex index dd8926d769429703f05c839307096b7bb6346ae1..d19e24d854139acc6bc8089c4f04a393891e5a71 100644 --- a/sum.hex +++ b/sum.hex @@ -1,6 +1,9 @@ -118d0004 -ac890000 +118d0005 012c4820 +ac890000 01886020 08100000 +ac880000 +ac890000 +8c890000 ac890000