diff --git a/hdl/dpram_generic.vhd b/hdl/dpram_generic.vhd index 87fdd9a456e2b7cfff7eb5df2983317c2b191b0d..99d3637e059b26ab05c13887be76e8cb49b41bb0 100644 --- a/hdl/dpram_generic.vhd +++ b/hdl/dpram_generic.vhd @@ -9,11 +9,9 @@ use ieee.numeric_std.all; entity dpram_generic is - generic ( g_addr_width : natural := 15; g_data_width : natural := 42 - ); port ( clk_i : in std_logic; @@ -38,55 +36,51 @@ entity dpram_generic is qb_o : out std_logic_vector(g_data_width-1 downto 0); valid_a_o : out std_logic; valid_b_o : out std_logic - - ); end dpram_generic; - architecture rtl of dpram_generic is component RAM1K18 --- generic (MEMORYFILE:string := ""); - - port(A_DOUT : out std_logic_vector(17 downto 0); - B_DOUT : out std_logic_vector(17 downto 0); - BUSY : out std_logic; - A_CLK : in std_logic := 'U'; - A_DOUT_CLK : in std_logic := 'U'; - A_ARST_N : in std_logic := 'U'; - A_DOUT_EN : in std_logic := 'U'; - A_BLK : in std_logic_vector(2 downto 0) := (others => 'U'); - A_DOUT_ARST_N : in std_logic := 'U'; - A_DOUT_SRST_N : in std_logic := 'U'; - A_DIN : in std_logic_vector(17 downto 0) := (others => 'U'); - A_ADDR : in std_logic_vector(13 downto 0) := (others => 'U'); - A_WEN : in std_logic_vector(1 downto 0) := (others => 'U'); - B_CLK : in std_logic := 'U'; - B_DOUT_CLK : in std_logic := 'U'; - B_ARST_N : in std_logic := 'U'; - B_DOUT_EN : in std_logic := 'U'; - B_BLK : in std_logic_vector(2 downto 0) := (others => 'U'); - B_DOUT_ARST_N : in std_logic := 'U'; - B_DOUT_SRST_N : in std_logic := 'U'; - B_DIN : in std_logic_vector(17 downto 0) := (others => 'U'); - B_ADDR : in std_logic_vector(13 downto 0) := (others => 'U'); - B_WEN : in std_logic_vector(1 downto 0) := (others => 'U'); - A_EN : in std_logic := 'U'; - A_DOUT_LAT : in std_logic := 'U'; - A_WIDTH : in std_logic_vector(2 downto 0) := (others => 'U'); - A_WMODE : in std_logic := 'U'; - B_EN : in std_logic := 'U'; - B_DOUT_LAT : in std_logic := 'U'; - B_WIDTH : in std_logic_vector(2 downto 0) := (others => 'U'); - B_WMODE : in std_logic := 'U'; - SII_LOCK : in std_logic := 'U' - ); + -- generic (MEMORYFILE:string := ""); + port ( + A_DOUT : out std_logic_vector(17 downto 0); + B_DOUT : out std_logic_vector(17 downto 0); + BUSY : out std_logic; + A_CLK : in std_logic := 'U'; + A_DOUT_CLK : in std_logic := 'U'; + A_ARST_N : in std_logic := 'U'; + A_DOUT_EN : in std_logic := 'U'; + A_BLK : in std_logic_vector(2 downto 0) := (others => 'U'); + A_DOUT_ARST_N : in std_logic := 'U'; + A_DOUT_SRST_N : in std_logic := 'U'; + A_DIN : in std_logic_vector(17 downto 0) := (others => 'U'); + A_ADDR : in std_logic_vector(13 downto 0) := (others => 'U'); + A_WEN : in std_logic_vector(1 downto 0) := (others => 'U'); + B_CLK : in std_logic := 'U'; + B_DOUT_CLK : in std_logic := 'U'; + B_ARST_N : in std_logic := 'U'; + B_DOUT_EN : in std_logic := 'U'; + B_BLK : in std_logic_vector(2 downto 0) := (others => 'U'); + B_DOUT_ARST_N : in std_logic := 'U'; + B_DOUT_SRST_N : in std_logic := 'U'; + B_DIN : in std_logic_vector(17 downto 0) := (others => 'U'); + B_ADDR : in std_logic_vector(13 downto 0) := (others => 'U'); + B_WEN : in std_logic_vector(1 downto 0) := (others => 'U'); + A_EN : in std_logic := 'U'; + A_DOUT_LAT : in std_logic := 'U'; + A_WIDTH : in std_logic_vector(2 downto 0) := (others => 'U'); + A_WMODE : in std_logic := 'U'; + B_EN : in std_logic := 'U'; + B_DOUT_LAT : in std_logic := 'U'; + B_WIDTH : in std_logic_vector(2 downto 0) := (others => 'U'); + B_WMODE : in std_logic := 'U'; + SII_LOCK : in std_logic := 'U' + ); end component; signal qa, qb, da, db : std_logic_vector (g_data_width downto 0); - - signal addr_match : std_logic; + signal addr_match : std_logic; signal lock_a_req, lock_b_req : std_logic; signal lock_contention : std_logic; @@ -94,21 +88,17 @@ architecture rtl of dpram_generic is signal lock_a_grant, lock_b_grant, lock_a_grant_d, lock_b_grant_d : std_logic; signal wea, web : std_logic_vector (39 downto 0); - - + signal qa_discard_32k, qb_discard_32k : std_logic_vector (17 downto 2); - signal qa_discard_64k, qb_discard_64k : std_logic_vector (17 downto 1); + signal qa_discard_64k, qb_discard_64k : std_logic_vector (17 downto 1); - signal rea, reb : std_logic; - signal wa_voted, wb_voted : std_logic; -attribute syn_radhardlevel : string; -attribute syn_radhardlevel of rtl : architecture is "tmr"; + signal wa_voted : std_logic; + attribute syn_radhardlevel : string; + attribute syn_radhardlevel of rtl : architecture is "tmr"; begin - - addr_match <= '1' when (aa_i (7 downto 2) = ab_i (7 downto 2)) else '0'; --to save LUTs, overhead - --is only 0.5% (random address) + --is only 0.5% (random address) da <= "0" & da_i; db <= "0" & db_i; qa_o <= qa (g_data_width-1 downto 0); @@ -118,43 +108,35 @@ begin wa_voted <= ( (wa_i(1) and wa_i(2)) or (wa_i(1) and wa_i(3)) or (wa_i(2) and wa_i(3))) ; process (lock_b_grant, lock_a_grant, addr_match, ra_i, rb_i, wa_voted, wb_i) - begin - - if (lock_b_grant = '1') then - valid_b_o <= '1'; + begin + if (lock_b_grant = '1') then + valid_b_o <= '1'; else valid_b_o <= '0' when (((rb_i and wa_voted) or lock_a_grant) and addr_match) else '1'; - end if; + end if; - if (lock_a_grant = '1') then + if (lock_a_grant = '1') then valid_a_o <= '1'; -else - valid_a_o <= '0' when (((ra_i and wb_i) or lock_b_grant) and addr_match) else '1'; -end if; -end process; - - -tmr_signals : for i in 0 to 39 generate - wea (i) <= ( (wa_i(1) and wa_i(2)) or (wa_i(1) and wa_i(3)) or (wa_i(2) and wa_i(3))) and valid_a_o; - -- "web" signal not TMRed (it requires a block TMR of the scrubber) - web (i) <= wb_i and valid_b_o; -end generate; - - - + else + valid_a_o <= '0' when (((ra_i and wb_i) or lock_b_grant) and addr_match) else '1'; + end if; + end process; + + tmr_signals : for i in 0 to 39 generate + wea (i) <= ( (wa_i(1) and wa_i(2)) or (wa_i(1) and wa_i(3)) or (wa_i(2) and wa_i(3))) and valid_a_o; + -- "web" signal not TMRed (it requires a block TMR of the scrubber) + web (i) <= wb_i and valid_b_o; + end generate; lock_a_grant_o <= lock_a_grant; lock_b_grant_o <= lock_b_grant; lock_contention <= addr_match and lock_a_req_i and lock_b_req_i; - - lock_a_req <= lock_a_req_i; lock_b_req <= lock_b_req_i; -assert ( (lock_a_grant_o and lock_b_grant_o and addr_match) = '0') report "error grant" severity error; - + assert ( (lock_a_grant_o and lock_b_grant_o and addr_match) = '0') report "error grant" severity error; process (clk_i, rst_i) begin @@ -162,19 +144,17 @@ assert ( (lock_a_grant_o and lock_b_grant_o and addr_match) = '0') report "error if rst_i = '1' then lock_a_grant_d <= '0'; lock_b_grant_d <= '0'; - else - lock_a_grant_d <= lock_a_grant; - lock_b_grant_d <= lock_b_grant; - + else + lock_a_grant_d <= lock_a_grant; + lock_b_grant_d <= lock_b_grant; + end if; end if; - end if; end process; -- lock_a/b_req signal, after the write is done, will always be deasserted for at least one clock cycle process (lock_contention, lock_a_req, lock_b_req, lock_a_grant_d, lock_b_grant_d) begin - if (lock_contention = '0') then lock_a_grant <= lock_a_req; lock_b_grant <= lock_b_req; @@ -184,198 +164,178 @@ assert ( (lock_a_grant_o and lock_b_grant_o and addr_match) = '0') report "error lock_b_grant <= '1'; lock_a_grant <= '0'; elsif (lock_a_req = '1') then - lock_a_grant <= '1'; - lock_b_grant <= '0'; - else - lock_a_grant <= '0'; - lock_b_grant <= '0'; - end if; - else - lock_a_grant <= lock_a_grant_d; - lock_b_grant <= lock_b_grant_d; - end if; + lock_a_grant <= '1'; + lock_b_grant <= '0'; + else + lock_a_grant <= '0'; + lock_b_grant <= '0'; + end if; + else + lock_a_grant <= lock_a_grant_d; + lock_b_grant <= lock_b_grant_d; + end if; end if; - end process; - gen_32k_daec : if (g_addr_width = 15 and g_data_width = 42) generate + gen_32k_daec : if (g_addr_width = 15 and g_data_width = 42) generate gen_bram : for i in 1 to 5 generate gen_byte : for k in 0 to 3 generate - sram_two_bit : RAM1K18 - - port map( - A_WIDTH => "001", - B_WIDTH => "001", - A_WMODE => '1', --write data appears on the corresponding read data port - B_WMODE => '1', --write data appears on the corresponding read data port - A_DOUT_LAT => '1', - B_DOUT_LAT => '1', - A_EN => '1', - B_EN => '1', - A_ARST_N => '1', - B_ARST_N => '1', - A_DOUT_EN => '1', - B_DOUT_EN => '1', - A_DOUT_SRST_N => '1', - B_DOUT_SRST_N => '1', - A_DOUT_ARST_N => '1', - B_DOUT_ARST_N => '1', - SII_LOCK => '1', - A_DOUT_CLK => '1', - B_DOUT_CLK => '1', - - A_CLK => clk_ram_i (8*(i-1)+k), - B_CLK => clk_ram_i (8*(i-1)+k), - - A_WEN (1) => '0', - A_WEN (0) => wea (8*(i-1)+2*k), - B_WEN (1) => '0', - B_WEN (0) => web (8*(i-1)+2*k), - - A_DIN (1 downto 0) => da(8*(i-1)+2*k+1 downto 8*(i-1)+2*k) , - A_DIN (17 downto 2) => (others => '0'), - B_DIN (1 downto 0) => db(8*(i-1)+2*k+1 downto 8*(i-1)+2*k), - B_DIN (17 downto 2) => (others => '0'), - - A_ADDR (0 downto 0) => "0", - A_ADDR (13 downto 1) => aa_i(14 downto 2), - B_ADDR (0 downto 0) => "0", - B_ADDR (13 downto 1) => ab_i(14 downto 2), - - - A_BLK => (others => '1'), - B_BLK => (others => '1'), - - - A_DOUT (17 downto 2) => qa_discard_32k (17 downto 2), - A_DOUT (1 downto 0) => qa(8*(i-1)+2*k+1 downto 8*(i-1)+2*k), - b_DOUT (17 downto 2) => qb_discard_32k (17 downto 2), - B_DOUT (1 downto 0) => qb(8*(i-1)+2*k+1 downto 8*(i-1)+2*k) - - ); - + inst_sram_two_bit : RAM1K18 + + port map( + A_WIDTH => "001", + B_WIDTH => "001", + A_WMODE => '1', --write data appears on the corresponding read data port + B_WMODE => '1', --write data appears on the corresponding read data port + A_DOUT_LAT => '1', + B_DOUT_LAT => '1', + A_EN => '1', + B_EN => '1', + A_ARST_N => '1', + B_ARST_N => '1', + A_DOUT_EN => '1', + B_DOUT_EN => '1', + A_DOUT_SRST_N => '1', + B_DOUT_SRST_N => '1', + A_DOUT_ARST_N => '1', + B_DOUT_ARST_N => '1', + SII_LOCK => '1', + A_DOUT_CLK => '1', + B_DOUT_CLK => '1', + + A_CLK => clk_ram_i (8*(i-1)+k), + B_CLK => clk_ram_i (8*(i-1)+k), + + A_WEN (1) => '0', + A_WEN (0) => wea (8*(i-1)+2*k), + B_WEN (1) => '0', + B_WEN (0) => web (8*(i-1)+2*k), + + A_DIN (1 downto 0) => da(8*(i-1)+2*k+1 downto 8*(i-1)+2*k) , + A_DIN (17 downto 2) => (others => '0'), + B_DIN (1 downto 0) => db(8*(i-1)+2*k+1 downto 8*(i-1)+2*k), + B_DIN (17 downto 2) => (others => '0'), + + A_ADDR (0 downto 0) => "0", + A_ADDR (13 downto 1) => aa_i(14 downto 2), + B_ADDR (0 downto 0) => "0", + B_ADDR (13 downto 1) => ab_i(14 downto 2), + + A_BLK => (others => '1'), + B_BLK => (others => '1'), + + A_DOUT (17 downto 2) => qa_discard_32k (17 downto 2), + A_DOUT (1 downto 0) => qa(8*(i-1)+2*k+1 downto 8*(i-1)+2*k), + b_DOUT (17 downto 2) => qb_discard_32k (17 downto 2), + B_DOUT (1 downto 0) => qb(8*(i-1)+2*k+1 downto 8*(i-1)+2*k) + ); end generate gen_byte; - end generate gen_bram; - sram_two_bit : RAM1K18 - - port map( - A_WIDTH => "001", - B_WIDTH => "001", - A_WMODE => '1', --write data appears on the corresponding read data port - B_WMODE => '1', --write data appears on the corresponding read data port - A_DOUT_LAT => '1', - B_DOUT_LAT => '1', - A_EN => '1', - B_EN => '1', - A_ARST_N => '1', - B_ARST_N => '1', - A_DOUT_EN => '1', - B_DOUT_EN => '1', - A_DOUT_SRST_N => '1', - B_DOUT_SRST_N => '1', - A_DOUT_ARST_N => '1', - B_DOUT_ARST_N => '1', - SII_LOCK => '1', - A_DOUT_CLK => '1', - B_DOUT_CLK => '1', - - A_CLK => clk_i, - B_CLK => clk_i, - - A_WEN (1) => '0', - A_WEN (0) => wea (39), - B_WEN (1) => '0', - B_WEN (0) => web (39), - - A_DIN (1 downto 0) => da(41 downto 40), - A_DIN (17 downto 2) => (others => '0'), - B_DIN (1 downto 0) => db(41 downto 40), - B_DIN (17 downto 2) => (others => '0'), - - A_ADDR (0 downto 0) => "0", - A_ADDR (13 downto 1) => aa_i(14 downto 2), - B_ADDR (0 downto 0) => "0", - B_ADDR (13 downto 1) => ab_i(14 downto 2), - - A_BLK => (others => '1'), - B_BLK => (others => '1'), - - A_DOUT (17 downto 2) => qa_discard_32k(17 downto 2), - A_DOUT (1 downto 0) => qa(41 downto 40), - b_DOUT (17 downto 2) => qb_discard_32k(17 downto 2), - B_DOUT (1 downto 0) => qb(41 downto 40) - - ); - - + sram_two_bit : RAM1K18 + port map( + A_WIDTH => "001", + B_WIDTH => "001", + A_WMODE => '1', --write data appears on the corresponding read data port + B_WMODE => '1', --write data appears on the corresponding read data port + A_DOUT_LAT => '1', + B_DOUT_LAT => '1', + A_EN => '1', + B_EN => '1', + A_ARST_N => '1', + B_ARST_N => '1', + A_DOUT_EN => '1', + B_DOUT_EN => '1', + A_DOUT_SRST_N => '1', + B_DOUT_SRST_N => '1', + A_DOUT_ARST_N => '1', + B_DOUT_ARST_N => '1', + SII_LOCK => '1', + A_DOUT_CLK => '1', + B_DOUT_CLK => '1', + + A_CLK => clk_i, + B_CLK => clk_i, + + A_WEN (1) => '0', + A_WEN (0) => wea (39), + B_WEN (1) => '0', + B_WEN (0) => web (39), + + A_DIN (1 downto 0) => da(41 downto 40), + A_DIN (17 downto 2) => (others => '0'), + B_DIN (1 downto 0) => db(41 downto 40), + B_DIN (17 downto 2) => (others => '0'), + + A_ADDR (0 downto 0) => "0", + A_ADDR (13 downto 1) => aa_i(14 downto 2), + B_ADDR (0 downto 0) => "0", + B_ADDR (13 downto 1) => ab_i(14 downto 2), + + A_BLK => (others => '1'), + B_BLK => (others => '1'), + + A_DOUT (17 downto 2) => qa_discard_32k(17 downto 2), + A_DOUT (1 downto 0) => qa(41 downto 40), + b_DOUT (17 downto 2) => qb_discard_32k(17 downto 2), + B_DOUT (1 downto 0) => qb(41 downto 40) + ); end generate gen_32k_daec; gen_64k : if g_addr_width = 16 generate - gen_bram : for i in 1 to 5 generate - gen_byte : for k in 0 to 7 generate - sram_bit : RAM1K18 - - port map( - A_WIDTH => "000", - B_WIDTH => "000", - A_WMODE => '1', --write data appears on the corresponding read data port - B_WMODE => '1', --write data appears on the corresponding read data port - A_DOUT_LAT => '1', - B_DOUT_LAT => '1', - A_EN => '1', - B_EN => '1', - A_ARST_N => '1', - B_ARST_N => '1', - A_DOUT_EN => '1', - B_DOUT_EN => '1', - A_DOUT_SRST_N => '1', - B_DOUT_SRST_N => '1', - A_DOUT_ARST_N => '1', - B_DOUT_ARST_N => '1', - SII_LOCK => '1', - A_DOUT_CLK => '1', - B_DOUT_CLK => '1', - - A_CLK => clk_ram_i (8*(i-1)+k), - B_CLK => clk_ram_i (8*(i-1)+k), - - A_WEN (1) => '0', - A_WEN (0) => wea (8*(i-1)+k), - B_WEN (1) => '0', - B_WEN (0) => web (8*(i-1)+k), - - A_DIN (0 downto 0) => da(8*(i-1)+k downto 8*(i-1)+k), - A_DIN (17 downto 1) => (others => '0'), - B_DIN (0 downto 0) => db(8*(i-1)+k downto 8*(i-1)+k), - B_DIN (17 downto 1) => (others => '0'), - - --A_ADDR (0 downto 0) => "0", - A_ADDR (13 downto 0) => aa_i(15 downto 2), - --B_ADDR (0 downto 0) => "0", - B_ADDR (13 downto 0) => ab_i(15 downto 2), - - - A_BLK => (others => '1'), - B_BLK => (others => '1'), - - A_DOUT (17 downto 1) => qa_discard_64k, - A_DOUT (0 downto 0) => qa(8*(i-1)+k downto 8*(i-1)+k), - b_DOUT (17 downto 1) => qb_discard_64k, - B_DOUT (0 downto 0) => qb(8*(i-1)+k downto 8*(i-1)+k) - - ); + port map( + A_WIDTH => "000", + B_WIDTH => "000", + A_WMODE => '1', --write data appears on the corresponding read data port + B_WMODE => '1', --write data appears on the corresponding read data port + A_DOUT_LAT => '1', + B_DOUT_LAT => '1', + A_EN => '1', + B_EN => '1', + A_ARST_N => '1', + B_ARST_N => '1', + A_DOUT_EN => '1', + B_DOUT_EN => '1', + A_DOUT_SRST_N => '1', + B_DOUT_SRST_N => '1', + A_DOUT_ARST_N => '1', + B_DOUT_ARST_N => '1', + SII_LOCK => '1', + A_DOUT_CLK => '1', + B_DOUT_CLK => '1', + + A_CLK => clk_ram_i (8*(i-1)+k), + B_CLK => clk_ram_i (8*(i-1)+k), + + A_WEN (1) => '0', + A_WEN (0) => wea (8*(i-1)+k), + B_WEN (1) => '0', + B_WEN (0) => web (8*(i-1)+k), + + A_DIN (0 downto 0) => da(8*(i-1)+k downto 8*(i-1)+k), + A_DIN (17 downto 1) => (others => '0'), + B_DIN (0 downto 0) => db(8*(i-1)+k downto 8*(i-1)+k), + B_DIN (17 downto 1) => (others => '0'), + + --A_ADDR (0 downto 0) => "0", + A_ADDR (13 downto 0) => aa_i(15 downto 2), + --B_ADDR (0 downto 0) => "0", + B_ADDR (13 downto 0) => ab_i(15 downto 2), + + A_BLK => (others => '1'), + B_BLK => (others => '1'), + + A_DOUT (17 downto 1) => qa_discard_64k, + A_DOUT (0 downto 0) => qa(8*(i-1)+k downto 8*(i-1)+k), + b_DOUT (17 downto 1) => qb_discard_64k, + B_DOUT (0 downto 0) => qb(8*(i-1)+k downto 8*(i-1)+k) + ); end generate gen_byte; - end generate gen_bram; - end generate gen_64k; - - - - end architecture; \ No newline at end of file + end generate gen_64k; +end architecture; diff --git a/hdl/ram_voter.vhd b/hdl/ram_voter.vhd index 84f1cb8ce2ddd2df2b08c407edc6009f02646b04..1f6bc85583c79364acec5baea750998827121ea3 100644 --- a/hdl/ram_voter.vhd +++ b/hdl/ram_voter.vhd @@ -23,52 +23,40 @@ use ieee.numeric_std.all; use work.voter.all; entity ram_voter is - generic ( - g_addr_width : natural := 15; - g_data_width : natural := 38 - - ); - port ( - da_vot_i : in t_voter_stdvector (open)(g_data_width-1 downto 0); - aa_vot_i : in t_voter_stdvector (open) (g_addr_width-1 downto 0); - wa_vot_i : in t_voter_stdlogic; - ra_vot_i : in t_voter_stdlogic; - - lock_a_req_vot_i : in t_voter_stdlogic; - - da_o : out std_logic_vector (g_data_width-1 downto 0); - aa_o : out std_logic_vector (g_addr_width-1 downto 0); - wa_o : out std_logic; - ra_o : out std_logic; - lock_a_req_o : out std_logic - - - ); - - + generic ( + g_addr_width : natural := 15; + g_data_width : natural := 38 + ); + port ( + da_vot_i : in t_voter_stdvector (open)(g_data_width-1 downto 0); + aa_vot_i : in t_voter_stdvector (open) (g_addr_width-1 downto 0); + wa_vot_i : in t_voter_stdlogic; + ra_vot_i : in t_voter_stdlogic; + + lock_a_req_vot_i : in t_voter_stdlogic; + + da_o : out std_logic_vector (g_data_width-1 downto 0); + aa_o : out std_logic_vector (g_addr_width-1 downto 0); + wa_o : out std_logic; + ra_o : out std_logic; + lock_a_req_o : out std_logic + ); end ram_voter; architecture rtl of ram_voter is - - begin da : for i in da_o'range generate da_o(i) <= (da_vot_i(1)(i) and da_vot_i(2)(i)) or (da_vot_i(2)(i) and da_vot_i(3)(i)) or (da_vot_i(1)(i) and da_vot_i(3)(i)); - end generate; aa : for i in aa_o'range generate aa_o(i) <= (aa_vot_i(1)(i) and aa_vot_i(2)(i)) or (aa_vot_i(2)(i) and aa_vot_i(3)(i)) or (aa_vot_i(1)(i) and aa_vot_i(3)(i)); - end generate; wa_o <= (wa_vot_i(1) and wa_vot_i(2)) or (wa_vot_i(2) and wa_vot_i(3)) or (wa_vot_i(1) and wa_vot_i(3)); ra_o <= (ra_vot_i(1) and ra_vot_i(2)) or (ra_vot_i(2) and ra_vot_i(3)) or (ra_vot_i(1) and ra_vot_i(3)); - lock_a_req_o <= (lock_a_req_vot_i(1) and lock_a_req_vot_i(2)) or (lock_a_req_vot_i(2) and lock_a_req_vot_i(3)) or (lock_a_req_vot_i(1) and lock_a_req_vot_i(3)); - - end architecture; diff --git a/hdl/secded_ecc.vhd b/hdl/secded_ecc.vhd index 4650e2ce96ce8c5d7b0e22dd923e14788af1f687..9f5d17b5faed65b2b2c28e1f32fe8aa836801357 100644 --- a/hdl/secded_ecc.vhd +++ b/hdl/secded_ecc.vhd @@ -165,7 +165,6 @@ architecture rtl of secded_ecc is end f_ecc_errors; function f_ecc_one_error (syndrome : std_logic_vector (6 downto 0)) return std_logic is - variable syndrome_bound_check : std_logic; begin if Is_x (syndrome (0)) then return '0'; diff --git a/hdl/seu_counters.vhd b/hdl/seu_counters.vhd index b86b2b0786fc38a71f14ded90ad1b57e10e88cf2..946ae7f96d52f0e97351222656f4a1c68602cb43 100644 --- a/hdl/seu_counters.vhd +++ b/hdl/seu_counters.vhd @@ -13,12 +13,8 @@ use work.wishbone_pkg.all; --use smartfusion2.all; use work.voter.all; -use work.wb_voter_pkg.all; - - entity seu_counters is - port ( clk_i : in std_logic; rst_i : in std_logic; @@ -34,16 +30,14 @@ entity seu_counters is se_iram_o : out std_logic_vector (15 downto 0); de_iram_o : out std_logic_vector (15 downto 0) - ); - end entity seu_counters; architecture rtl of seu_counters is signal se_iram_counter,de_iram_counter,se_dram_counter,de_dram_counter : unsigned (15 downto 0); - attribute syn_radhardlevel : string; -attribute syn_radhardlevel of rtl : architecture is "tmr"; + attribute syn_radhardlevel : string; + attribute syn_radhardlevel of rtl : architecture is "tmr"; begin diff --git a/hdl/urv_core_DTMR.vhd b/hdl/urv_core_DTMR.vhd index 9c0cfda5ef6eed2906c1426afd5870584c50e2e8..2d124197c20bfa4a61edeeb4193618ff83e064f5 100644 --- a/hdl/urv_core_DTMR.vhd +++ b/hdl/urv_core_DTMR.vhd @@ -187,12 +187,12 @@ end component; signal im_addr, dm_addr, dram_addr : std_logic_vector(31 downto 0); - signal im_data, im_data_cpu, im_data_bank1, dram_data_in, dram_data_out : std_logic_vector(31 downto 0); - signal im_valid, im_valid_cpu, im_valid_bank1 : std_logic; + signal im_data, dram_data_in, dram_data_out : std_logic_vector(31 downto 0); + signal im_valid : std_logic; - signal dm_data_s, dm_data_l, dm_data_ram, dm_wb_rdata : std_logic_vector(31 downto 0); + signal dm_data_s, dm_data_l, dm_wb_rdata : std_logic_vector(31 downto 0); signal dm_data_select, dram_bwe : std_logic_vector(3 downto 0); - signal dm_load, dm_store, dm_done, dm_ready, dram_we, dram_re : std_logic; + signal dm_load, dm_store, dram_we, dram_re : std_logic; signal dram_done_r, dram_done_w : std_logic; signal dm_is_wishbone, dm_cycle_in_progress, dm_load_done_wb, dm_store_done_wb : std_logic; @@ -384,11 +384,11 @@ end generate; dram_addr <= (others => '0'); else -- signals from uRV data interface to the data-ram are sampled to improve fmax - if (dram_done_r or dram_done_w) then + if (dram_done_r or dram_done_w) then dram_we <= '0'; dram_re <= '0'; - end if; - + end if; + if (dm_is_wishbone = '0' and (dm_load = '1' or dm_store = '1')) then dram_addr <= dm_addr; dram_data_in <= dm_data_s; @@ -420,7 +420,7 @@ end generate; dm_load_done_wb <= '0'; dm_cycle_in_progress <= '0'; end if; - + else if(cpu_dwb_i.stall = '0') then cpu_dwb_o.stb <= '0'; diff --git a/hdl/urv_soc.vhd b/hdl/urv_soc.vhd index 43683dbf66aa293720c0a2dd649f289f306726ca..852e1239c6f84d668ffea57bd2b5f30a4f471f5b 100644 --- a/hdl/urv_soc.vhd +++ b/hdl/urv_soc.vhd @@ -1,82 +1,69 @@ - library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use STD.textio.all; - library work; use work.wishbone_pkg.all; - - use work.voter.ALL; use work.wb_master_voter_pkg.all; use work.wb_slave_voter_pkg.all; entity urv_soc is - port ( - clk_i : in std_logic; - clk_ram_i : in std_logic_vector (39 downto 0); - rst_i : in std_logic; - - DEVRST_I : in std_logic; + clk_i : in std_logic; + clk_ram_i : in std_logic_vector (39 downto 0); + rst_i : in std_logic; + DEVRST_I : in std_logic; apb_psel_o : out std_logic; - apb_pwr_o : out std_logic; - apb_pen_o : out std_logic; - apb_paddr_o : out std_logic_vector(31 downto 0); - apb_pwdat_o : out std_logic_vector(31 downto 0); - apb_prdat_i : in std_logic_vector(31 downto 0); - apb_pready_i : in std_logic; -- - apb_pslverr_i : in std_logic; -- - - - uart_tx_o : out std_logic; + apb_pwr_o : out std_logic; + apb_pen_o : out std_logic; + apb_paddr_o : out std_logic_vector(31 downto 0); + apb_pwdat_o : out std_logic_vector(31 downto 0); + apb_prdat_i : in std_logic_vector(31 downto 0); + apb_pready_i : in std_logic; -- + apb_pslverr_i : in std_logic; -- + uart_tx_o : out std_logic; --TX - eth_tx_clk_i : in std_logic; - eth_txd_o : out std_logic_vector (3 downto 0); - eth_txen_o : out std_logic; - eth_txerr_o : out std_logic; + eth_tx_clk_i : in std_logic; + eth_txd_o : out std_logic_vector (3 downto 0); + eth_txen_o : out std_logic; + eth_txerr_o : out std_logic; --RX - eth_rx_clk_i : in std_logic; - eth_rxd_i : in std_logic_vector (3 downto 0); - eth_rxdv_i : in std_logic; - eth_rxerr_i : in std_logic; - + eth_rx_clk_i : in std_logic; + eth_rxd_i : in std_logic_vector (3 downto 0); + eth_rxdv_i : in std_logic; + eth_rxerr_i : in std_logic; --MIIM - eth_mdc_o : out std_logic; - eth_md_i : in std_logic; - eth_md_o : out std_logic; - eth_oe_o : out std_logic; - - eth_rst_o : out std_logic; - - reboot_o : out std_logic - ); + eth_mdc_o : out std_logic; + eth_md_i : in std_logic; + eth_md_o : out std_logic; + eth_oe_o : out std_logic; + eth_rst_o : out std_logic; + + reboot_o : out std_logic + ); end entity urv_soc; architecture rtl of urv_soc is - - -constant g_dram_data_width : integer := 39; -constant g_dram_addr_width : integer := 16; -constant g_m2s090 : boolean := true; + constant g_dram_data_width : integer := 39; + constant g_dram_addr_width : integer := 16; + constant g_m2s090 : boolean := true; function f_voter_stdlogic (a : std_logic; b : std_logic; c : std_logic) return std_logic is begin - return (a and b) or (a and c) or (b and c); + return (a and b) or (a and c) or (b and c); end f_voter_stdlogic; - component uart port ( reset_i : in std_logic; @@ -88,863 +75,602 @@ constant g_m2s090 : boolean := true; tx_req_i : in std_logic); end component; + constant c_SLAVE_NUM : natural := 7; + -- only one master to reduce LUT + -- tested in radiation also with 2 masters, no problems + constant c_MASTER_NUM : natural := 1; + + constant c_SLAVE_WD : integer := 0; + constant c_SLAVE_UART : integer := 1; + constant c_SLAVE_SEC : integer := 2; + constant c_SLAVE_ETH : integer := 3; + constant c_SLAVE_DRAM : integer := 4; + constant c_SLAVE_SUPERVISOR : integer := 5; + constant c_SLAVE_ENVM : integer := 6; + + constant c_CNX_ADDRESS : t_wishbone_address_array(c_SLAVE_NUM-1 downto 0) := ( + c_SLAVE_WD => x"81000000", + c_SLAVE_UART => x"82000000", + c_SLAVE_SEC => x"83000000", + c_SLAVE_ETH => x"84000000", + c_SLAVE_DRAM => x"85000000", + c_SLAVE_SUPERVISOR => x"86000000", + c_SLAVE_ENVM => x"87000000" + ); - component xwb_uart - - port( - clk_sys_i : in std_logic; - rst_i : in std_logic; - - -- Wishbone - slave_i : in t_wishbone_slave_in; - slave_o : out t_wishbone_slave_out; - desc_o : out t_wishbone_device_descriptor; - --- Port for BIT field: 'TX busy' in reg: 'Status Register' - uart_sr_tx_busy_i : in std_logic; --- Port for MONOSTABLE field: 'TX trigger' in reg: 'Status Register' - uart_sr_tx_send_o : out std_logic; - uart_tdr_tx_data_o : out std_logic_vector(7 downto 0) + constant c_CNX_MASK : t_wishbone_address_array(c_SLAVE_NUM-1 downto 0) := ( + c_SLAVE_WD => x"ff000000", + c_SLAVE_UART => x"ff000000", + c_SLAVE_SEC => x"ff000000", + c_SLAVE_ETH => x"FF000000", + c_SLAVE_DRAM => x"FF000000", + c_SLAVE_SUPERVISOR => x"ff000000", + c_SLAVE_ENVM => x"FF000000" + ); + signal cnx_master_in : t_wishbone_master_in_array(c_SLAVE_NUM-1 downto 0); + signal cnx_master_out : t_wishbone_master_out_array(c_SLAVE_NUM-1 downto 0); + signal cnx_slave_in : t_wishbone_slave_in_array(c_MASTER_NUM-1 downto 0); + signal cnx_slave_out : t_wishbone_slave_out_array(c_MASTER_NUM-1 downto 0); + + + signal cpu_dwb_out_voted : t_wishbone_master_out; + signal cpu_dwb_out : t_voter_wb_master; + signal cpu_dwb_in : t_wishbone_master_in; + + signal envm_wb_iram_in : t_wishbone_slave_in; + signal envm_wb_iram_out : t_wishbone_slave_out; + + signal eth_m_wb_out : t_wishbone_master_out; + signal eth_m_wb_in : t_wishbone_master_in; + + signal supervisor_wb_out : t_voter_wb_slave; + signal rst_cpu_sv, reboot_sv, boot_done_sv : std_logic_vector (3 downto 1); + signal reboot_sv_voted : std_logic; + signal boot_done : std_logic; + + signal first_de : std_logic; + + type fsm_uart_states is (idle, wait_write, wait_lf); + signal fsm_uart : fsm_uart_states := idle; + + signal uart_ready, uart_ready_wb, dm_uart_write_done : std_logic; + signal uart_tx_data, uart_tx_data_wb : std_logic_vector (7 downto 0); + + signal rst_cpu, rst_cpu_boot, rst_cpu_wd : std_logic; + signal wd_counter : unsigned (28 downto 0); + + signal wd_heartbeat : std_logic; + + signal tx_req, tx_req_wb : std_logic; + + + signal q_cpu_iram : t_voter_stdvector (open)(38 downto 0); + signal q_cpu_dram : t_voter_stdvector(open)(g_dram_data_width-1 downto 0); + signal a_cpu_iram : t_voter_stdvector (open)(15 downto 0); + signal a_cpu_dram : t_voter_stdvector (open)(g_dram_addr_width-1 downto 0); + signal we_cpu_iram, we_cpu_dram : std_logic_vector (3 downto 1); + signal re_cpu_iram, re_cpu_dram : t_voter_stdlogic; + signal lock_cpu_dram_req, lock_cpu_iram_req : t_voter_stdlogic; + signal d_cpu_iram, d_wb_iram : std_logic_vector (38 downto 0); + signal d_cpu_dram, d_wb_dram : std_logic_vector (g_dram_data_width-1 downto 0); + signal q_cpu_iram_voted, q_wb_iram : std_logic_vector (38 downto 0); + signal q_cpu_dram_voted, q_wb_dram : std_logic_vector (g_dram_data_width-1 downto 0); + + signal a_cpu_iram_voted, a_wb_iram : std_logic_vector (15 downto 0); + signal a_cpu_dram_voted, a_wb_dram : std_logic_vector (g_dram_addr_width-1 downto 0); + signal re_cpu_iram_voted, re_cpu_dram_voted, re_wb_dram, re_wb_iram : std_logic; + signal we_wb_dram, we_wb_iram : std_logic; + signal lock_cpu_dram_req_voted, lock_wb_dram_req : std_logic; + signal lock_cpu_iram_req_voted, lock_wb_iram_req : std_logic; + signal lock_cpu_dram_grant, lock_wb_dram_grant : std_logic; + signal lock_wb_iram_grant, lock_cpu_iram_grant : std_logic; + signal valid_cpu_iram, valid_cpu_dram, valid_wb_iram, valid_wb_dram : std_logic; + + signal se_iram, se_dram : std_logic_vector (1 to 3); + signal de_iram, de_dram : std_logic_vector (1 to 3); + + signal se_iram_voted, se_dram_voted, de_iram_voted, de_dram_voted : std_logic; + signal se_iram_scrubber, de_iram_scrubber : std_logic; + signal se_dram_scrubber, de_dram_scrubber : std_logic; + + signal reboot_board : std_logic; + + signal irq_eth : std_logic; + signal se_iram_counts, de_iram_counts, se_dram_counts, de_dram_counts : std_logic_vector (15 downto 0); + + signal first_time : std_logic; + + attribute syn_radhardlevel : string; + attribute syn_radhardlevel of rtl : architecture is "tmr"; +begin + rst_cpu <= rst_cpu_boot; + + reboot_board <= rst_cpu_wd or reboot_sv_voted; --(not rst_cpu and (de_iram_voted or de_dram_voted or de_iram_scrubber or de_dram_scrubber)) ; + reboot_o <= reboot_board; + + iram : entity work.dpram_generic + generic map ( + g_addr_width => 16, + g_data_width => 39) + port map ( + clk_i => clk_i, + clk_ram_i => clk_ram_i, + rst_i => rst_i, + da_i => q_cpu_iram_voted, + db_i => q_wb_iram, + aa_i => a_cpu_iram_voted, + ab_i => a_wb_iram, + wa_i => we_cpu_iram,--we_cpu_iram_voted, + wb_i => we_wb_iram, + ra_i => re_cpu_iram_voted, + rb_i => re_wb_iram, + + lock_a_req_i => lock_cpu_iram_req_voted, + lock_b_req_i => lock_wb_iram_req, + lock_a_grant_o => lock_cpu_iram_grant, + lock_b_grant_o => lock_wb_iram_grant, + + qa_o => d_cpu_iram, + qb_o => d_wb_iram, + valid_a_o => valid_cpu_iram, + valid_b_o => valid_wb_iram ); - end component; - - - component xwb_seu_regs - - port( - clk_sys_i : in std_logic; - rst_i : in std_logic; - - -- Wishbone - slave_i : in t_wishbone_slave_in; - slave_o : out t_wishbone_slave_out; - desc_o : out t_wishbone_device_descriptor; - - - iram_seu_regs_see_se_i : in std_logic_vector(15 downto 0); - iram_seu_regs_see_de_i : in std_logic_vector(15 downto 0); - dram_seu_regs_see_se_i : in std_logic_vector(15 downto 0); - dram_seu_regs_see_de_i : in std_logic_vector(15 downto 0) + iram_voter : entity work.ram_voter + generic map ( + g_addr_width => 16, + g_data_width => 39 + ) + port map ( + da_vot_i => q_cpu_iram, + aa_vot_i => a_cpu_iram, + wa_vot_i => (others => '0'), --we_cpu_iram, + ra_vot_i => re_cpu_iram, + + lock_a_req_vot_i => lock_cpu_iram_req, + lock_a_req_o => lock_cpu_iram_req_voted, + + da_o => q_cpu_iram_voted, + aa_o => a_cpu_iram_voted, + -- wa_o => we_cpu_iram_voted, + ra_o => re_cpu_iram_voted ); - end component; - - - component xwb_wd_reg - - port( - clk_sys_i : in std_logic; - rst_i : in std_logic; + dram : entity work.dpram_generic + generic map ( + g_addr_width => g_dram_addr_width, + g_data_width => g_dram_data_width) + port map ( + clk_i => clk_i, + clk_ram_i => clk_ram_i, + rst_i => rst_i, + da_i => q_cpu_dram_voted, + db_i => q_wb_dram, + aa_i => a_cpu_dram_voted, + ab_i => a_wb_dram, + wa_i => we_cpu_dram,--we_cpu_dram_voted, + wb_i => we_wb_dram, + ra_i => re_cpu_dram_voted, + rb_i => re_wb_dram, + + lock_a_req_i => lock_cpu_dram_req_voted, + lock_b_req_i => lock_wb_dram_req, + lock_a_grant_o => lock_cpu_dram_grant, + lock_b_grant_o => lock_wb_dram_grant, + + qa_o => d_cpu_dram, + qb_o => d_wb_dram, + valid_a_o => valid_cpu_dram, + valid_b_o => valid_wb_dram + ); + + dram_voter : entity work.ram_voter + generic map( + g_addr_width => g_dram_addr_width, + g_data_width => g_dram_data_width) + port map ( + da_vot_i => q_cpu_dram, + aa_vot_i => a_cpu_dram, + wa_vot_i => (others => '0'), --we_cpu_dram, + ra_vot_i => re_cpu_dram, + + lock_a_req_vot_i => lock_cpu_dram_req, + lock_a_req_o => lock_cpu_dram_req_voted, + + da_o => q_cpu_dram_voted, + aa_o => a_cpu_dram_voted, + --wa_o => we_cpu_dram_voted, + ra_o => re_cpu_dram_voted + ); + + gen_cores : for k in 1 to 3 generate + + urv_core : entity work.urv_core_DTMR + generic map ( + g_m2s090 => g_m2s090, + g_dram_data_width => g_dram_data_width, + g_dram_addr_width => g_dram_addr_width + ) + port map ( + clk_i => clk_i, + rst_i => rst_cpu or rst_cpu_sv (k), --(1)rst_cpu_sv(k), --rst_cpu, + + -- to the IRAM primitive + d_iram_i => d_cpu_iram, + q_iram_o => q_cpu_iram(k), + a_iram_o => a_cpu_iram(k), + we_iram_o => we_cpu_iram(k), + re_iram_o => re_cpu_iram(k), + valid_iram_i => valid_cpu_iram, + lock_iram_req_o => lock_cpu_iram_req(k), + lock_iram_grant_i => lock_cpu_iram_grant, + + -- to the DRAM primitive + d_dram_i => d_cpu_dram, + q_dram_o => q_cpu_dram(k), + a_dram_o => a_cpu_dram(k), + we_dram_o => we_cpu_dram(k), + re_dram_o => re_cpu_dram(k), + valid_dram_i => valid_cpu_dram, + lock_dram_req_o => lock_cpu_dram_req(k), + lock_dram_grant_i => lock_cpu_dram_grant, + + iram_single_error_p_o => se_iram(k), + iram_double_error_p_o => de_iram(k), + + dram_single_error_p_o => se_dram(k), + dram_double_error_p_o => de_dram(k), + irq_i => irq_eth, + -- to the Wishbone xbar + cpu_dwb_o => cpu_dwb_out(k), + cpu_dwb_i => cpu_dwb_in + ); + + supervisor : entity work.urv_supervisor + generic map ( + g_cpu_id => k) + port map( + clk_i => clk_i, + rst_i => rst_i, + + slave_i => cnx_master_out(c_SLAVE_SUPERVISOR), + slave_o => supervisor_wb_out (k), + + pc_i => a_cpu_iram, + stall_i => ('0', '0', '0'), + boot_done_o => boot_done_sv (k), + rst_cpu_o => rst_cpu_sv (k), + reboot_o => reboot_sv (k) + ); + end generate; + + wb_cpu_voter : entity work.wb_master_voter + port map ( + m_wb_i => cpu_dwb_out, + m_wb_o => cpu_dwb_out_voted + ); - -- Wishbone - slave_i : in t_wishbone_slave_in; - slave_o : out t_wishbone_slave_out; - desc_o : out t_wishbone_device_descriptor; - -- Port for MONOSTABLE field: 'Heartbeat' in reg: 'Watchdog' - wd_reg_heartbeat_o : out std_logic + wb_supervisor_voter : entity work.wb_slave_voter + port map ( + s_wb_i => supervisor_wb_out, + s_wb_o => cnx_master_in(c_SLAVE_SUPERVISOR) ); - end component; + reboot_sv_voted <= f_voter_stdlogic (reboot_sv(1), reboot_sv(2), reboot_sv(3)); + boot_done <= f_voter_stdlogic (boot_done_sv (1), boot_done_sv(2),boot_done_sv(3)); + + se_iram_voted <= f_voter_stdlogic(se_iram (1), se_iram(2), se_iram(3)); + se_dram_voted <= f_voter_stdlogic(se_dram (1), se_dram(2), se_dram(3)); + de_iram_voted <= f_voter_stdlogic(de_iram (1), de_iram(2), de_iram(3)); + de_dram_voted <= f_voter_stdlogic(de_dram (1), de_dram(2), de_dram(3)); + envm_wb : entity work.wb_envm + port map ( + clk_i => clk_i, + rst_i => rst_i, + rst_cpu_o => rst_cpu_boot, - component xwb_ram_adapter + apb_psel_o => apb_psel_o, + apb_pwr_o => apb_pwr_o, + apb_pen_o => apb_pen_o, + apb_paddr_o => apb_paddr_o, + apb_pwdat_o => apb_pwdat_o, + apb_prdat_i => apb_prdat_i, + apb_pready_i => apb_pready_i, - generic ( - g_addr_width : natural := 15; - g_data_width :natural := 38; - g_is_iram : boolean := false; - g_is_dram : boolean := false + master_i => envm_wb_iram_out, + master_o => envm_wb_iram_in, + slave_i => cnx_master_out (c_SLAVE_ENVM), + slave_o => cnx_master_in (c_SLAVE_ENVM) ); - port ( - clk_i : in std_logic; - rst_i : in std_logic; - boot_done_i : in std_logic; + + xwb_iram : entity work.xwb_ram_adapter + generic map ( + g_addr_width => 16, + g_data_width => 39, + g_is_iram => true, + g_is_dram => false + ) + port map( + clk_i => clk_i, + rst_i => rst_i, + boot_done_i => boot_done, -- Wishbone - slave_i : in t_wishbone_slave_in; - slave_o : out t_wishbone_slave_out; + slave_i => envm_wb_iram_in, + slave_o => envm_wb_iram_out, -- ram interface - d_ram_i : in std_logic_vector (g_data_width-1 downto 0); - q_ram_o : out std_logic_vector (g_data_width-1 downto 0); - a_ram_o : out std_logic_vector (g_addr_width-1 downto 0); - we_ram_o : out std_logic; - re_ram_o : out std_logic; - valid_ram_i : in std_logic; - lock_req_o : out std_logic; - lock_grant_i : in std_logic; - single_error_p_o : out std_logic; - double_error_p_o : out std_logic - - ); - end component; - - - - component dpram_generic - - generic ( - g_addr_width : natural := 15; - g_data_width : natural := 38 + d_ram_i => d_wb_iram, + q_ram_o => q_wb_iram, + a_ram_o => a_wb_iram, + we_ram_o => we_wb_iram, + re_ram_o => re_wb_iram, + valid_ram_i => valid_wb_iram, + lock_req_o => lock_wb_iram_req, + lock_grant_i => lock_wb_iram_grant, + single_error_p_o => se_iram_scrubber, + double_error_p_o => de_iram_scrubber ); - port ( - clk_i : in std_logic; - rst_i : in std_logic; - clk_ram_i : in std_logic_vector (39 downto 0); - da_i : in std_logic_vector(g_data_width-1 downto 0); - db_i : in std_logic_vector(g_data_width-1 downto 0); - aa_i : in std_logic_vector(g_addr_width-1 downto 0); - ab_i : in std_logic_vector(g_addr_width-1 downto 0); - wa_i : in std_logic_vector (3 downto 1); - wb_i : in std_logic; - ra_i : in std_logic; - rb_i : in std_logic; - - qa_o : out std_logic_vector(g_data_width-1 downto 0); - qb_o : out std_logic_vector(g_data_width-1 downto 0); - - lock_a_req_i : in std_logic; - lock_b_req_i : in std_logic; - lock_a_grant_o : out std_logic; - lock_b_grant_o : out std_logic; - - valid_a_o : out std_logic; - valid_b_o : out std_logic - - - ); - end component; - - - - - component ram_voter - generic ( - g_addr_width : natural := 15; - g_data_width : natural := 38 - - ); - port ( - - - da_vot_i : in t_voter_stdvector; - aa_vot_i : in t_voter_stdvector; - wa_vot_i : in t_voter_stdlogic; - ra_vot_i : in t_voter_stdlogic; - - lock_a_req_vot_i : in t_voter_stdlogic; - - da_o : out std_logic_vector(g_data_width-1 downto 0); - aa_o : out std_logic_vector(g_addr_width-1 downto 0); - wa_o : out std_logic; - ra_o : out std_logic; - lock_a_req_o : out std_logic - ); - - - end component; - - - - -component seu_counters is - port ( - clk_i : in std_logic; - rst_i : in std_logic; - - event_se_iram : in std_logic; - event_de_iram : in std_logic; - event_se_dram : in std_logic; - event_de_dram : in std_logic; - - - se_dram_o : out std_logic_vector (15 downto 0); - de_dram_o : out std_logic_vector (15 downto 0); - - se_iram_o : out std_logic_vector (15 downto 0); - de_iram_o : out std_logic_vector (15 downto 0) - - ); - -end component; - - - constant c_SLAVE_NUM : natural := 7; - -- only one master to reduce LUT - -- tested in radiation also with 2 masters, no problems - constant c_MASTER_NUM : natural := 1; - - constant c_SLAVE_WD : integer := 0; - constant c_SLAVE_UART : integer := 1; - constant c_SLAVE_SEC : integer := 2; - constant c_SLAVE_ETH : integer := 3; - constant c_SLAVE_DRAM : integer := 4; - constant c_SLAVE_SUPERVISOR : integer := 5; - constant c_SLAVE_ENVM : integer := 6; - - constant c_CNX_ADDRESS : t_wishbone_address_array(c_SLAVE_NUM-1 downto 0) := ( - c_SLAVE_WD => x"81000000", - c_SLAVE_UART => x"82000000", - c_SLAVE_SEC => x"83000000", - c_SLAVE_ETH => x"84000000", - c_SLAVE_DRAM => x"85000000", - c_SLAVE_SUPERVISOR => x"86000000", - c_SLAVE_ENVM => x"87000000" - ); - - constant c_CNX_MASK : t_wishbone_address_array(c_SLAVE_NUM-1 downto 0) := ( - c_SLAVE_WD => x"ff000000", - c_SLAVE_UART => x"ff000000", - c_SLAVE_SEC => x"ff000000", - c_SLAVE_ETH => x"FF000000", - c_SLAVE_DRAM => x"FF000000", - c_SLAVE_SUPERVISOR => x"ff000000", - c_SLAVE_ENVM => x"FF000000" - - ); - - signal cnx_master_in : t_wishbone_master_in_array(c_SLAVE_NUM-1 downto 0); - signal cnx_master_out : t_wishbone_master_out_array(c_SLAVE_NUM-1 downto 0); - signal cnx_slave_in : t_wishbone_slave_in_array(c_MASTER_NUM-1 downto 0); - signal cnx_slave_out : t_wishbone_slave_out_array(c_MASTER_NUM-1 downto 0); - - - signal cpu_dwb_out_voted : t_wishbone_master_out; - signal cpu_dwb_out : t_voter_wb_master; - signal cpu_dwb_in : t_wishbone_master_in; - - signal envm_wb_iram_in: t_wishbone_slave_in; - signal envm_wb_iram_out : t_wishbone_slave_out; - - signal eth_m_wb_out : t_wishbone_master_out; - signal eth_m_wb_in : t_wishbone_master_in; - - signal supervisor_wb_out : t_voter_wb_slave; - signal rst_cpu_sv, reboot_sv, boot_done_sv : std_logic_vector (3 downto 1); - signal rst_cpu_sv_voted, reboot_sv_voted : std_logic; - signal boot_done : std_logic; - - signal cpu_rst, cpu_rst_d : std_logic; - - - - signal first_de : std_logic; - - signal de_counter, se_counter : unsigned (15 downto 0); - - type fsm_uart_states is (idle, wait_write, wait_lf); - signal fsm_uart : fsm_uart_states := idle; - - signal uart_ready, uart_ready_wb, dm_uart_write_done : std_logic; - signal uart_tx_data, uart_tx_data_wb : std_logic_vector (7 downto 0); - signal dm_counter_read_done, dm_uart_read_done : std_logic; - - signal rst_cpu, rst_cpu_boot, rst_cpu_wd : std_logic; - signal wd_counter : unsigned (28 downto 0); - signal dm_counter_write_done : std_logic; - - signal wd_heartbeat : std_logic; - - signal tx_req, tx_req_wb : std_logic; - - - signal q_cpu_iram : t_voter_stdvector (open)(38 downto 0); - signal q_cpu_dram : t_voter_stdvector(open)(g_dram_data_width-1 downto 0); - signal a_cpu_iram : t_voter_stdvector (open)(15 downto 0); - signal a_cpu_dram : t_voter_stdvector (open)(g_dram_addr_width-1 downto 0); - signal we_cpu_iram, we_cpu_dram : std_logic_vector (3 downto 1); - signal re_cpu_iram, re_cpu_dram : t_voter_stdlogic; - signal lock_cpu_dram_req, lock_cpu_iram_req : t_voter_stdlogic; -signal selector : std_logic; - signal d_cpu_iram, d_wb_iram, d_cpu_iram_seu : std_logic_vector (38 downto 0); - signal d_cpu_dram, d_wb_dram : std_logic_vector (g_dram_data_width-1 downto 0); - signal q_cpu_iram_voted, q_wb_iram : std_logic_vector (38 downto 0); -signal q_cpu_dram_voted, q_wb_dram : std_logic_vector (g_dram_data_width-1 downto 0); - - signal a_cpu_iram_voted, a_wb_iram : std_logic_vector (15 downto 0); - signal a_cpu_dram_voted, a_wb_dram : std_logic_vector (g_dram_addr_width-1 downto 0); - signal re_cpu_iram_voted, re_cpu_dram_voted, re_wb_dram, re_wb_iram : std_logic; - signal we_cpu_iram_voted, we_cpu_dram_voted, we_wb_dram, we_wb_iram : std_logic; - signal lock_cpu_dram_req_voted, lock_wb_dram_req, lock_cpu_dram_grant, lock_wb_dram_grant : std_logic; - signal lock_cpu_iram_req_voted, lock_wb_iram_req, lock_wb_iram_grant, lock_cpu_iram_grant : std_logic; - signal valid_cpu_iram, valid_cpu_dram, valid_wb_iram, valid_wb_dram : std_logic; - - signal se_iram, se_dram : std_logic_vector (1 to 3); - signal de_iram, de_dram : std_logic_vector (1 to 3); - - signal se_iram_voted, se_dram_voted, de_iram_voted, de_dram_voted : std_logic; - signal se_iram_scrubber, de_iram_scrubber : std_logic; - signal se_dram_scrubber, de_dram_scrubber : std_logic; - - signal reboot_board, reboot_board_f : std_logic; - - signal irq_eth : std_logic; - signal uart_debug_ready, tx_debug_req : std_logic; - signal uart_debug_data : std_logic_vector (7 downto 0); - signal se_iram_counts, de_iram_counts, se_dram_counts, de_dram_counts : std_logic_vector (15 downto 0); - - - signal first_time : std_logic; - - attribute syn_radhardlevel : string; - attribute syn_radhardlevel of rtl : architecture is "tmr"; - - begin - - rst_cpu <= rst_cpu_boot; - - reboot_board <= rst_cpu_wd or reboot_sv_voted; --(not rst_cpu and (de_iram_voted or de_dram_voted or de_iram_scrubber or de_dram_scrubber)) ; - reboot_o <= reboot_board; - - - - iram : dpram_generic - generic map ( - g_addr_width => 16, - g_data_width => 39) - port map ( - clk_i => clk_i, - clk_ram_i => clk_ram_i, - rst_i => rst_i, - da_i => q_cpu_iram_voted, - db_i => q_wb_iram, - aa_i => a_cpu_iram_voted, - ab_i => a_wb_iram, - wa_i => we_cpu_iram,--we_cpu_iram_voted, - wb_i => we_wb_iram, - ra_i => re_cpu_iram_voted, - rb_i => re_wb_iram, - - lock_a_req_i => lock_cpu_iram_req_voted, - lock_b_req_i => lock_wb_iram_req, - lock_a_grant_o => lock_cpu_iram_grant, - lock_b_grant_o => lock_wb_iram_grant, - - qa_o => d_cpu_iram, - qb_o => d_wb_iram, - valid_a_o => valid_cpu_iram, - valid_b_o => valid_wb_iram - - ); - - - - iram_voter : ram_voter - generic map( - g_addr_width => 16, - g_data_width => 39 - ) - port map ( - da_vot_i => q_cpu_iram, - aa_vot_i => a_cpu_iram, - wa_vot_i => (others => '0'), --we_cpu_iram, - ra_vot_i => re_cpu_iram, - - lock_a_req_vot_i => lock_cpu_iram_req, - lock_a_req_o => lock_cpu_iram_req_voted, - - da_o => q_cpu_iram_voted, - aa_o => a_cpu_iram_voted, - -- wa_o => we_cpu_iram_voted, - ra_o => re_cpu_iram_voted - ); - - - dram : dpram_generic - generic map ( - g_addr_width => g_dram_addr_width, - g_data_width => g_dram_data_width) - port map ( - clk_i => clk_i, - clk_ram_i => clk_ram_i, - rst_i => rst_i, - da_i => q_cpu_dram_voted, - db_i => q_wb_dram, - aa_i => a_cpu_dram_voted, - ab_i => a_wb_dram, - wa_i => we_cpu_dram,--we_cpu_dram_voted, - wb_i => we_wb_dram, - ra_i => re_cpu_dram_voted, - rb_i => re_wb_dram, - - - lock_a_req_i => lock_cpu_dram_req_voted, - lock_b_req_i => lock_wb_dram_req, - lock_a_grant_o => lock_cpu_dram_grant, - lock_b_grant_o => lock_wb_dram_grant, - - qa_o => d_cpu_dram, - qb_o => d_wb_dram, - valid_a_o => valid_cpu_dram, - valid_b_o => valid_wb_dram - - - ); + xwb_dram : entity work.xwb_ram_adapter + generic map ( + g_addr_width => g_dram_addr_width, + g_data_width => g_dram_data_width, + g_is_iram => false, + g_is_dram => true + ) + port map( + clk_i => clk_i, + rst_i => rst_i, + boot_done_i => boot_done, - - - dram_voter : ram_voter - generic map( - g_addr_width => g_dram_addr_width, - g_data_width => g_dram_data_width) - port map ( - da_vot_i => q_cpu_dram, - aa_vot_i => a_cpu_dram, - wa_vot_i => (others => '0'), --we_cpu_dram, - ra_vot_i => re_cpu_dram, - - lock_a_req_vot_i => lock_cpu_dram_req, - lock_a_req_o => lock_cpu_dram_req_voted, - - da_o => q_cpu_dram_voted, - aa_o => a_cpu_dram_voted, - --wa_o => we_cpu_dram_voted, - ra_o => re_cpu_dram_voted - ); - - - + -- Wishbone + slave_i => eth_m_wb_out, --cnx_master_out(c_SLAVE_DRAM), + slave_o => eth_m_wb_in,--cnx_master_in(c_SLAVE_DRAM), - gen_cores : for k in 1 to 3 generate - - urv_core : entity work.urv_core_DTMR - - generic map( - g_m2s090 => g_m2s090, - g_dram_data_width => g_dram_data_width, - g_dram_addr_width => g_dram_addr_width - ) - port map ( - clk_i => clk_i, - rst_i => rst_cpu or rst_cpu_sv (k), --(1)rst_cpu_sv(k), --rst_cpu, - - -- to the IRAM primitive - d_iram_i => d_cpu_iram, - q_iram_o => q_cpu_iram(k), - a_iram_o => a_cpu_iram(k), - we_iram_o => we_cpu_iram(k), - re_iram_o => re_cpu_iram(k), - valid_iram_i => valid_cpu_iram, - lock_iram_req_o => lock_cpu_iram_req(k), - lock_iram_grant_i => lock_cpu_iram_grant, - - - - -- to the DRAM primitive - d_dram_i => d_cpu_dram, - q_dram_o => q_cpu_dram(k), - a_dram_o => a_cpu_dram(k), - we_dram_o => we_cpu_dram(k), - re_dram_o => re_cpu_dram(k), - valid_dram_i => valid_cpu_dram, - lock_dram_req_o => lock_cpu_dram_req(k), - lock_dram_grant_i => lock_cpu_dram_grant, - - iram_single_error_p_o => se_iram(k), - iram_double_error_p_o => de_iram(k), - - dram_single_error_p_o => se_dram(k), - dram_double_error_p_o => de_dram(k), - irq_i => irq_eth, - -- to the Wishbone xbar - cpu_dwb_o => cpu_dwb_out(k), - cpu_dwb_i => cpu_dwb_in - - ); - - supervisor : entity work.urv_supervisor - generic map ( - g_cpu_id => k) - port map( - clk_i => clk_i, - rst_i => rst_i, - - slave_i => cnx_master_out(c_SLAVE_SUPERVISOR), - slave_o => supervisor_wb_out (k), - - pc_i => a_cpu_iram, - stall_i => ('0', '0', '0'), - boot_done_o => boot_done_sv (k), - rst_cpu_o => rst_cpu_sv (k), - reboot_o => reboot_sv (k) - - ); - - - end generate; - - wb_cpu_voter : entity work.wb_master_voter - port map ( - m_wb_i => cpu_dwb_out, - m_wb_o => cpu_dwb_out_voted - ); - - wb_supervisor_voter : entity work.wb_slave_voter - port map ( - s_wb_i => supervisor_wb_out, - s_wb_o => cnx_master_in(c_SLAVE_SUPERVISOR) - ); - - reboot_sv_voted <= f_voter_stdlogic (reboot_sv(1), reboot_sv(2), reboot_sv(3)); - boot_done <= f_voter_stdlogic (boot_done_sv (1), boot_done_sv(2),boot_done_sv(3)); - - se_iram_voted <= f_voter_stdlogic(se_iram (1), se_iram(2), se_iram(3)); - se_dram_voted <= f_voter_stdlogic(se_dram (1), se_dram(2), se_dram(3)); - de_iram_voted <= f_voter_stdlogic(de_iram (1), de_iram(2), de_iram(3)); - de_dram_voted <= f_voter_stdlogic(de_dram (1), de_dram(2), de_dram(3)); + -- ram interface + d_ram_i => d_wb_dram, + q_ram_o => q_wb_dram, + a_ram_o => a_wb_dram, + we_ram_o => we_wb_dram, + re_ram_o => re_wb_dram, + valid_ram_i => valid_wb_dram, + lock_req_o => lock_wb_dram_req, + lock_grant_i => lock_wb_dram_grant, + single_error_p_o => se_dram_scrubber, + double_error_p_o => de_dram_scrubber + ); - - envm_wb : entity work.wb_envm - port map ( - clk_i => clk_i, - rst_i => rst_i, - rst_cpu_o => rst_cpu_boot, - - apb_psel_o => apb_psel_o, - apb_pwr_o => apb_pwr_o, - apb_pen_o => apb_pen_o, - apb_paddr_o => apb_paddr_o, - apb_pwdat_o => apb_pwdat_o, - apb_prdat_i => apb_prdat_i, - apb_pready_i => apb_pready_i, - - master_i => envm_wb_iram_out, - master_o => envm_wb_iram_in, - - slave_i => cnx_master_out (c_SLAVE_ENVM), - slave_o => cnx_master_in (c_SLAVE_ENVM) - ); - - - - - xwb_iram : xwb_ram_adapter - generic map ( - g_addr_width => 16, - g_data_width => 39, - g_is_iram => true, - g_is_dram => false - ) - port map( - clk_i => clk_i, - rst_i => rst_i, - boot_done_i => boot_done, - - -- Wishbone - slave_i => envm_wb_iram_in, - slave_o => envm_wb_iram_out, - - -- ram interface - d_ram_i => d_wb_iram, - q_ram_o => q_wb_iram, - a_ram_o => a_wb_iram, - we_ram_o => we_wb_iram, - re_ram_o => re_wb_iram, - valid_ram_i => valid_wb_iram, - lock_req_o => lock_wb_iram_req, - lock_grant_i => lock_wb_iram_grant, - single_error_p_o => se_iram_scrubber, - double_error_p_o => de_iram_scrubber - ); - - + U_Local_Interconnect : entity work.xwb_crossbar + generic map ( + g_NUM_MASTERS => 1, + g_NUM_SLAVES => c_SLAVE_NUM, + g_REGISTERED => true, + g_ADDRESS => c_CNX_ADDRESS, + g_MASK => c_CNX_MASK) + port map ( + clk_sys_i => clk_i, + rst_n_i => not rst_i, + slave_i => cnx_slave_in, --cpu_dwb_out, + slave_o => cnx_slave_out, --cpu_dwb_in, + master_i => cnx_master_in, + master_o => cnx_master_out); + + cnx_slave_in(0) <= cpu_dwb_out_voted; + cpu_dwb_in <= cnx_slave_out(0); + + + mac : entity work.ueth + port map ( + + clk_i => clk_i, + rst_i => rst_i, + + --TX + phy0_tx_clk_i => eth_tx_clk_i, + phy0_txd_o => eth_txd_o, + phy0_txen_o => eth_txen_o, + -- phy0_txerr_o => eth_txerr_o, + + --RX + phy0_rx_clk_i => eth_rx_clk_i, + phy0_rxd_i => eth_rxd_i, + phy0_rxdv_i => eth_rxdv_i, + phy0_rxerr_i => eth_rxerr_i, + + --TX + phy1_tx_clk_i => eth_tx_clk_i, + phy1_txd_o => open, + phy1_txen_o => open, + -- phy1_txerr_o => open, + + --RX + phy1_rx_clk_i => eth_rx_clk_i, + phy1_rxd_i => (others =>'0'), + phy1_rxdv_i => '0', + phy1_rxerr_i => '0', + + + --MIIM + phy_mdc_o => eth_mdc_o, + phy_md_i => eth_md_i, + phy_md_o => eth_md_o, + phy_oe_o => eth_oe_o, + + phy_rst_o => eth_rst_o, + irq_o => irq_eth, + -- Wishbone regs + slave_i => cnx_master_out(c_SLAVE_ETH), + slave_o => cnx_master_in(c_SLAVE_ETH), + + -- Wishbone DMA + master_i => eth_m_wb_in, + master_o => eth_m_wb_out + ); + U_seu_regs : entity work.xwb_seu_regs + port map( + clk_sys_i => clk_i, + rst_i => rst_i, + -- Wishbone + slave_i => cnx_master_out(c_SLAVE_SEC), + slave_o => cnx_master_in(c_SLAVE_SEC), + iram_seu_regs_see_se_i => se_iram_counts, + iram_seu_regs_see_de_i => de_iram_counts, + dram_seu_regs_see_se_i => se_dram_counts, + dram_seu_regs_see_de_i => de_dram_counts + ); + inst_seu_counters: entity work.seu_counters + port map( + clk_i => clk_i, + rst_i => rst_i, - xwb_dram : xwb_ram_adapter - generic map ( - g_addr_width => g_dram_addr_width, - g_data_width => g_dram_data_width, - g_is_iram => false, - g_is_dram => true - ) - port map( - clk_i => clk_i, - rst_i => rst_i, - boot_done_i => boot_done, - - -- Wishbone - slave_i => eth_m_wb_out, --cnx_master_out(c_SLAVE_DRAM), - slave_o => eth_m_wb_in,--cnx_master_in(c_SLAVE_DRAM), - - -- ram interface - d_ram_i => d_wb_dram, - q_ram_o => q_wb_dram, - a_ram_o => a_wb_dram, - we_ram_o => we_wb_dram, - re_ram_o => re_wb_dram, - valid_ram_i => valid_wb_dram, - lock_req_o => lock_wb_dram_req, - lock_grant_i => lock_wb_dram_grant, - single_error_p_o => se_dram_scrubber, - double_error_p_o => de_dram_scrubber - ); - - - - - - U_Local_Interconnect : xwb_crossbar - generic map ( - g_NUM_MASTERS => 1, - g_NUM_SLAVES => c_SLAVE_NUM, - g_REGISTERED => true, - g_ADDRESS => c_CNX_ADDRESS, - g_MASK => c_CNX_MASK) - port map ( - clk_sys_i => clk_i, - rst_n_i => not rst_i, - slave_i => cnx_slave_in, --cpu_dwb_out, - slave_o => cnx_slave_out, --cpu_dwb_in, - master_i => cnx_master_in, - master_o => cnx_master_out); - - cnx_slave_in(0) <= cpu_dwb_out_voted; - cpu_dwb_in <= cnx_slave_out(0); - - -mac : entity work.ueth -port map ( - - clk_i => clk_i, - rst_i => rst_i, - - --TX - phy0_tx_clk_i => eth_tx_clk_i, - phy0_txd_o => eth_txd_o, - phy0_txen_o => eth_txen_o, - -- phy0_txerr_o => eth_txerr_o, - - --RX - phy0_rx_clk_i => eth_rx_clk_i, - phy0_rxd_i => eth_rxd_i, - phy0_rxdv_i => eth_rxdv_i, - phy0_rxerr_i => eth_rxerr_i, - - --TX - phy1_tx_clk_i => eth_tx_clk_i, - phy1_txd_o => open, - phy1_txen_o => open, - -- phy1_txerr_o => open, - - --RX - phy1_rx_clk_i => eth_rx_clk_i, - phy1_rxd_i => (others =>'0'), - phy1_rxdv_i => '0', - phy1_rxerr_i => '0', - - - --MIIM - phy_mdc_o => eth_mdc_o, - phy_md_i => eth_md_i, - phy_md_o => eth_md_o, - phy_oe_o => eth_oe_o, - - phy_rst_o => eth_rst_o, - irq_o => irq_eth, - -- Wishbone regs - slave_i => cnx_master_out(c_SLAVE_ETH), - slave_o => cnx_master_in(c_SLAVE_ETH), - - -- Wishbone DMA - master_i => eth_m_wb_in, - master_o => eth_m_wb_out - -); - - - - - - U_seu_regs : xwb_seu_regs - port map( - clk_sys_i => clk_i, - rst_i => rst_i, - - -- Wishbone - slave_i => cnx_master_out(c_SLAVE_SEC), - slave_o => cnx_master_in(c_SLAVE_SEC), - - iram_seu_regs_see_se_i => se_iram_counts, - iram_seu_regs_see_de_i => de_iram_counts, - dram_seu_regs_see_se_i => se_dram_counts, - dram_seu_regs_see_de_i => de_dram_counts - ); - - inst_seu_counters: seu_counters - - port map( - clk_i => clk_i, - rst_i => rst_i, - - event_se_iram => se_iram_voted or se_iram_scrubber, - event_de_iram => de_iram_voted or de_iram_scrubber, - - event_se_dram => se_dram_voted or se_dram_scrubber, - event_de_dram => de_dram_voted or de_dram_scrubber, - - - se_iram_o => se_iram_counts, - de_iram_o => de_iram_counts, - se_dram_o => se_dram_counts, - de_dram_o => de_dram_counts - - - - ); + event_se_iram => se_iram_voted or se_iram_scrubber, + event_de_iram => de_iram_voted or de_iram_scrubber, + event_se_dram => se_dram_voted or se_dram_scrubber, + event_de_dram => de_dram_voted or de_dram_scrubber, + se_iram_o => se_iram_counts, + de_iram_o => de_iram_counts, + se_dram_o => se_dram_counts, + de_dram_o => de_dram_counts + ); - U_wd_regs : xwb_wd_reg - port map( - clk_sys_i => clk_i, - rst_i => rst_i, - -- Wishbone - slave_i => cnx_master_out(c_SLAVE_WD), - slave_o => cnx_master_in(c_SLAVE_WD), + U_wd_regs : entity work.xwb_wd_reg + port map( + clk_sys_i => clk_i, + rst_i => rst_i, - wd_reg_heartbeat_o => wd_heartbeat - ); + -- Wishbone + slave_i => cnx_master_out(c_SLAVE_WD), + slave_o => cnx_master_in(c_SLAVE_WD), + wd_reg_heartbeat_o => wd_heartbeat + ); + wd : process (clk_i) + begin + if rst_i = '1' then + rst_cpu_wd <= '0'; + wd_counter <= (others => '0'); + elsif rising_edge(clk_i) then + rst_cpu_wd <= '0'; + + wd_counter <= wd_counter + 1; + + if (wd_heartbeat = '1') then + wd_counter <= (others => '0'); + end if; + if (wd_counter = (wd_counter'range => '1')) then + rst_cpu_wd <= '1'; + end if; + end if; + end process; + + U_UART_regs : entity work.xwb_uart + port map ( + clk_sys_i => clk_i, + rst_i => rst_i, + slave_i => cnx_master_out(c_SLAVE_UART), + slave_o => cnx_master_in(c_SLAVE_UART), + uart_sr_tx_busy_i => uart_ready_wb, + uart_sr_tx_send_o => tx_req_wb, + uart_tdr_tx_data_o => uart_tx_data_wb + ); + uart_tx : uart + port map ( + reset_i => devrst_i, + clk_i => clk_i, + txd_o => uart_tx_o, + tx_data_i => uart_tx_data, + tx_wdone_o => dm_uart_write_done, + tx_ready_o => uart_ready, + tx_req_i => tx_req); - wd : process (clk_i) - begin - if rst_i = '1' then - rst_cpu_wd <= '0'; - wd_counter <= (others => '0'); - elsif rising_edge(clk_i) then - rst_cpu_wd <= '0'; - - wd_counter <= wd_counter + 1; - - if (wd_heartbeat = '1') then - wd_counter <= (others => '0'); - end if; - if (wd_counter = (wd_counter'range => '1')) then - rst_cpu_wd <= '1'; - end if; - end if; - end process; + process (clk_i) + begin + if devrst_i = '1' then + first_time <= '1'; + uart_ready_wb <= '0'; + fsm_uart <= idle; + tx_req <= '0'; + first_de <= '1'; + elsif rising_edge (clk_i) then + if (rst_i) then + first_de <= '1'; + + end if; + case (fsm_uart) is + when idle => + uart_ready_wb <= uart_ready; + tx_req <= tx_req_wb; + uart_tx_data <= uart_tx_data_wb; + + if (first_de and (de_iram_voted or de_dram_voted or de_iram_scrubber or de_iram_scrubber)) then + fsm_uart <= wait_write; + uart_tx_data <= x"23"; -- 23# + tx_req <= '1'; + first_de <= '0'; + end if; + if (reboot_sv_voted = '1') then + fsm_uart <= wait_write; + uart_tx_data <= x"24"; -- $ + tx_req <= '1'; + end if; + if (rst_i = '1') then + -- fsm_uart <= wait_write; + -- uart_tx_data <= x"25"; -- % + -- tx_req <= '1'; + end if; + if (first_time = '1') then + first_time <= '0'; + uart_tx_data <= x"40"; -- @ + tx_req <= '1'; + fsm_uart <= wait_write; + end if; + + + when wait_write => + if (uart_ready = '1') then + tx_req <= '1'; + uart_tx_data <= x"0A"; + fsm_uart <= wait_lf; + end if; + + when wait_lf => + if (uart_ready = '1') then + tx_req <= '0'; + fsm_uart <= idle; + end if; + when others => fsm_uart <= idle; + end case; + end if; + end process; + + -- synthesis translate_off + process + begin + loop + wait until rising_edge(clk_i); + if (tx_req = '1') then + --std.textio.write(std.textio.output, to_string(uart_tx_data)); - - U_UART_regs : xwb_uart - - port map ( - clk_sys_i => clk_i, - rst_i => rst_i, - slave_i => cnx_master_out(c_SLAVE_UART), - slave_o => cnx_master_in(c_SLAVE_UART), - uart_sr_tx_busy_i => uart_ready_wb, - uart_sr_tx_send_o => tx_req_wb, - uart_tdr_tx_data_o => uart_tx_data_wb - ); - - uart_tx : uart - port map ( - reset_i => devrst_i, - clk_i => clk_i, - txd_o => uart_tx_o, - tx_data_i => uart_tx_data, - tx_wdone_o => dm_uart_write_done, - tx_ready_o => uart_ready, - tx_req_i => tx_req); - - - process (clk_i) - begin - if devrst_i = '1' then - first_time <= '1'; - uart_ready_wb <= '0'; - fsm_uart <= idle; - tx_req <= '0'; - first_de <= '1'; - elsif rising_edge (clk_i) then - if (rst_i) then - first_de <= '1'; - - end if; - case (fsm_uart) is - when idle => - uart_ready_wb <= uart_ready; - tx_req <= tx_req_wb; - uart_tx_data <= uart_tx_data_wb; - - if (first_de and (de_iram_voted or de_dram_voted or de_iram_scrubber or de_iram_scrubber)) then - fsm_uart <= wait_write; - uart_tx_data <= x"23"; -- 23# - tx_req <= '1'; - first_de <= '0'; - end if; - if (reboot_sv_voted = '1') then - fsm_uart <= wait_write; - uart_tx_data <= x"24"; -- $ - tx_req <= '1'; - end if; - if (rst_i = '1') then - -- fsm_uart <= wait_write; - -- uart_tx_data <= x"25"; -- % - -- tx_req <= '1'; - end if; - if (first_time = '1') then - first_time <= '0'; - uart_tx_data <= x"40"; -- @ - tx_req <= '1'; - fsm_uart <= wait_write; - end if; - - - when wait_write => - if (uart_ready = '1') then - tx_req <= '1'; - uart_tx_data <= x"0A"; - fsm_uart <= wait_lf; - end if; - - when wait_lf => - if (uart_ready = '1') then - tx_req <= '0'; - fsm_uart <= idle; - end if; - when others => fsm_uart <= idle; - end case; - end if; - end process; - - - - - -- synthesis translate_off - - - process - begin - loop - wait until rising_edge(clk_i); - if (tx_req = '1') then - --std.textio.write(std.textio.output, to_string(uart_tx_data)); - - - WRITE (output, (1 => character'val (to_integer(unsigned(uart_tx_data))))); - end if; - - end loop; - end process; - -- synthesis translate_on - - - - + WRITE (output, (1 => character'val (to_integer(unsigned(uart_tx_data))))); + end if; - end architecture; \ No newline at end of file + end loop; + end process; + -- synthesis translate_on +end architecture; diff --git a/hdl/urv_supervisor.vhd b/hdl/urv_supervisor.vhd index 4c5f0a0a0298237754007fc191e634a52020d2bd..3231790ae0dacdb4310e380e194a14269b779d51 100644 --- a/hdl/urv_supervisor.vhd +++ b/hdl/urv_supervisor.vhd @@ -13,7 +13,6 @@ use work.wishbone_pkg.all; --use smartfusion2.all; use work.voter.all; -use work.wb_voter_pkg.all; @@ -48,7 +47,6 @@ architecture rtl of urv_supervisor is signal state_cpu_1, state_cpu_2, state_cpu_3 : std_logic; signal state_cpu : std_logic_vector (3 downto 1); - signal release_cpu : std_logic; type fsm_states is (boot, boot_cnt, voting, lock_step, fatal, fatal_2); constant recovery_dunc : std_logic_vector (15 downto 0) := x"0000"; diff --git a/hdl/wb_envm.vhd b/hdl/wb_envm.vhd index 0cd6b191def46dcff961c53f5d7d3d575a108def..fcf68683cc4c0592c7635e1260a110beb7817c4f 100644 --- a/hdl/wb_envm.vhd +++ b/hdl/wb_envm.vhd @@ -7,19 +7,18 @@ use work.wishbone_pkg.all; entity wb_envm is - port ( - clk_i : in std_logic; - rst_i : in std_logic; - rst_cpu_o : out std_logic; + clk_i : in std_logic; + rst_i : in std_logic; + rst_cpu_o : out std_logic; - apb_psel_o : out std_logic; - apb_pwr_o : out std_logic; - apb_pen_o : out std_logic; - apb_paddr_o : out std_logic_vector(31 downto 0); - apb_pwdat_o : out std_logic_vector(31 downto 0); - apb_prdat_i : in std_logic_vector(31 downto 0); - apb_pready_i : in std_logic; -- + apb_psel_o : out std_logic; + apb_pwr_o : out std_logic; + apb_pen_o : out std_logic; + apb_paddr_o : out std_logic_vector(31 downto 0); + apb_pwdat_o : out std_logic_vector(31 downto 0); + apb_prdat_i : in std_logic_vector(31 downto 0); + apb_pready_i : in std_logic; -- -- to the Wishbone xbar master_i : in t_wishbone_master_in; @@ -27,266 +26,269 @@ entity wb_envm is slave_i : in t_wishbone_slave_in; slave_o : out t_wishbone_slave_out - ); end entity wb_envm; architecture rtl of wb_envm is + constant bootloader_addr : std_logic_vector (31 downto 0) := x"60012000"; -- (bits from 11 to 0 must be 0) + constant bootloader_size : integer := 256; -- words (max 256) -constant bootloader_addr : std_logic_vector (31 downto 0) := x"60012000"; -- (bits from 11 to 0 must be 0) -constant bootloader_size : integer := 256; -- words (max 256) + type fsm_apb_states is (idle, setup, accessing); + type fsm_envm_states is (idle, check_status, poll_bit, data); + type fsm_bootstrap_states is (cold_start, poll_bit, fetch_word, wait_apb, wait_wb, checksum, done); + type fsm_wb_master_states is (idle, wait_ack); -type fsm_apb_states is (idle, setup, accessing); -type fsm_envm_states is (idle, check_status, poll_bit, data); -type fsm_bootstrap_states is (cold_start, poll_bit, fetch_word, wait_apb, wait_wb, checksum, done); -type fsm_wb_master_states is (idle, wait_ack); + signal apb_fsm : fsm_apb_states := idle; + signal envm_fsm : fsm_envm_states := idle; + signal bootstrap_fsm : fsm_bootstrap_states := cold_start; + signal wb_fsm : fsm_wb_master_states := idle; -signal apb_fsm : fsm_apb_states := idle; -signal envm_fsm : fsm_envm_states := idle; -signal bootstrap_fsm : fsm_bootstrap_states := cold_start; -signal wb_fsm : fsm_wb_master_states := idle; + signal apb_addr, apb_addr_boot, apb_addr_wb, envm_addr, envm_data, apb_data, wb_data, wb_data_reg : std_logic_vector (31 downto 0); -signal apb_addr, apb_addr_boot, apb_addr_wb, envm_addr, envm_data, apb_data, wb_data, wb_data_reg : std_logic_vector (31 downto 0); - -signal envm_read_req_p, apb_read_req, apb_read_req_boot, apb_read_req_wb, apb_read_ack : std_logic; -signal wb_write_req, wb_write_req_boot, wb_write_req_wb, wb_write_ack : std_logic; -signal wb_addr, wb_addr_boot, wb_addr_wb : std_logic_vector (16 downto 0); + signal envm_read_req_p, apb_read_req, apb_read_req_boot, apb_read_req_wb, apb_read_ack:std_logic; + signal wb_write_req, wb_write_req_boot, wb_write_req_wb, wb_write_ack : std_logic; + signal wb_addr, wb_addr_boot, wb_addr_wb : std_logic_vector (16 downto 0); signal counter : unsigned (9 downto 0); -attribute syn_encoding : string; -attribute syn_encoding of bootstrap_fsm, wb_fsm, apb_fsm, envm_fsm : signal is "safe,onehot"; + attribute syn_encoding : string; + attribute syn_encoding of bootstrap_fsm, wb_fsm, apb_fsm, envm_fsm : signal is "safe,onehot"; -attribute syn_radhardlevel : string; -attribute syn_radhardlevel of rtl : architecture is "tmr"; + attribute syn_radhardlevel : string; + attribute syn_radhardlevel of rtl : architecture is "tmr"; begin -apb_addr <= apb_addr_boot when (rst_cpu_o = '1') else apb_addr_wb; -apb_read_req <= apb_read_req_boot when (rst_cpu_o = '1') else apb_read_req_wb; + apb_addr <= apb_addr_boot when (rst_cpu_o = '1') else apb_addr_wb; + apb_read_req <= apb_read_req_boot when (rst_cpu_o = '1') else apb_read_req_wb; -process (clk_i) -begin -if rising_edge (clk_i) then - if rst_i = '1' then - rst_cpu_o <= '1'; - bootstrap_fsm <= cold_start; - wb_write_req_boot <= '0'; - else - case (bootstrap_fsm) is - when cold_start => - rst_cpu_o <= '1'; - bootstrap_fsm <= poll_bit; - counter <= (others => '0'); - wb_write_req_boot <= '0'; - apb_addr_boot <= x"60080120"; - apb_read_req_boot <= '1'; - when poll_bit => - apb_read_req_boot <= '0'; - if (apb_read_ack = '1') then - if (apb_data (0) = '1') then -- busy bit - bootstrap_fsm <= fetch_word; - else - apb_read_req_boot <= '1'; - end if; - end if; - when fetch_word => - apb_read_req_boot <= '1'; - apb_addr_boot (31 downto 12) <= bootloader_addr (31 downto 12); - apb_addr_boot (11 downto 2) <= std_logic_vector(counter); - apb_addr_boot (1 downto 0) <= (others => '0'); - bootstrap_fsm <= wait_apb; - when wait_apb => - apb_read_req_boot <= '0'; - if (apb_read_ack = '1') then - bootstrap_fsm <= wait_wb; - wb_write_req_boot <= '1'; - wb_addr_boot <= (others => '0'); - wb_addr_boot (11 downto 2) <= std_logic_vector(counter); - end if; - when wait_wb => - wb_write_req_boot <= '0'; - if (wb_write_ack = '1') then - if (counter >= to_unsigned(bootloader_size-4, counter'length)) then - bootstrap_fsm <= checksum; - else - bootstrap_fsm <= fetch_word; - counter <= counter + 1; - end if; - end if; - when checksum => - -- to be done - bootstrap_fsm <= done; - when done => - rst_cpu_o <= '0'; - when others => - bootstrap_fsm <= done; - end case; - end if; -end if; -end process; + -- Start FSM: copy from NVM to RAM. + process (clk_i) + begin + if rising_edge (clk_i) then + if rst_i = '1' then + rst_cpu_o <= '1'; + bootstrap_fsm <= cold_start; + wb_write_req_boot <= '0'; + else + case (bootstrap_fsm) is + when cold_start => + -- Init + rst_cpu_o <= '1'; + bootstrap_fsm <= poll_bit; + counter <= (others => '0'); + wb_write_req_boot <= '0'; + apb_addr_boot <= x"60080120"; + apb_read_req_boot <= '1'; + when poll_bit => + -- Wait NVM ready + apb_read_req_boot <= '0'; + if (apb_read_ack = '1') then + if (apb_data (0) = '1') then -- busy bit + bootstrap_fsm <= fetch_word; + else + apb_read_req_boot <= '1'; + end if; + end if; + when fetch_word => + -- Read a word from the NVM + apb_read_req_boot <= '1'; + apb_addr_boot (31 downto 12) <= bootloader_addr (31 downto 12); + apb_addr_boot (11 downto 2) <= std_logic_vector(counter); + apb_addr_boot (1 downto 0) <= (others => '0'); + bootstrap_fsm <= wait_apb; + when wait_apb => + -- Wait NVM word + apb_read_req_boot <= '0'; + if (apb_read_ack = '1') then + bootstrap_fsm <= wait_wb; + wb_write_req_boot <= '1'; + wb_addr_boot <= (others => '0'); + wb_addr_boot (11 downto 2) <= std_logic_vector(counter); + end if; + when wait_wb => + -- Write to RAM + wb_write_req_boot <= '0'; + if (wb_write_ack = '1') then + if (counter >= to_unsigned(bootloader_size-4, counter'length)) then + bootstrap_fsm <= checksum; + else + bootstrap_fsm <= fetch_word; + counter <= counter + 1; + end if; + end if; + when checksum => + -- to be done + bootstrap_fsm <= done; + when done => + rst_cpu_o <= '0'; + when others => + bootstrap_fsm <= done; + end case; + end if; + end if; + end process; -wb_addr <= wb_addr_boot when (rst_cpu_o = '1') else wb_addr_wb; -wb_write_req <= wb_write_req_boot when (rst_cpu_o = '1') else wb_write_req_wb; -wb_data <= apb_data when (rst_cpu_o = '1') else wb_data_reg; + wb_addr <= wb_addr_boot when (rst_cpu_o = '1') else wb_addr_wb; + wb_write_req <= wb_write_req_boot when (rst_cpu_o = '1') else wb_write_req_wb; + wb_data <= apb_data when (rst_cpu_o = '1') else wb_data_reg; -process (clk_i) -begin -if rising_edge (clk_i) then - if rst_i = '1' then - wb_fsm <= idle; - master_o.cyc <= '0'; - master_o.stb <= '0'; - master_o.adr <= (others => '0'); - else - case (wb_fsm) is - when idle => - master_o.cyc <= '0'; - master_o.stb <= '0'; - wb_write_ack <= '0'; - if (wb_write_req = '1' and wb_write_ack = '0') then - wb_fsm <= wait_ack; - master_o.cyc <= '1'; - master_o.stb <= '1'; - master_o.we <= '1'; - master_o.sel <= "1111"; - master_o.adr (wb_addr'left downto 0) <= wb_addr; - master_o.dat <= wb_data; - end if; - when wait_ack => - if (master_i.ack = '1') then - master_o.cyc <= '0'; - master_o.stb <= '0'; - master_o.we <= '0'; - wb_write_ack <= '1'; - wb_fsm <= idle; - end if; - when others => - wb_fsm <= idle; - end case; - - - end if; -end if; -end process; + -- WB fsm + process (clk_i) + begin + if rising_edge (clk_i) then + if rst_i = '1' then + wb_fsm <= idle; + master_o.cyc <= '0'; + master_o.stb <= '0'; + master_o.adr <= (others => '0'); + else + case (wb_fsm) is + when idle => + master_o.cyc <= '0'; + master_o.stb <= '0'; + wb_write_ack <= '0'; + if (wb_write_req = '1' and wb_write_ack = '0') then + wb_fsm <= wait_ack; + master_o.cyc <= '1'; + master_o.stb <= '1'; + master_o.we <= '1'; + master_o.sel <= "1111"; + master_o.adr (wb_addr'left downto 0) <= wb_addr; + master_o.dat <= wb_data; + end if; + when wait_ack => + if (master_i.ack = '1') then + master_o.cyc <= '0'; + master_o.stb <= '0'; + master_o.we <= '0'; + wb_write_ack <= '1'; + wb_fsm <= idle; + end if; + when others => + wb_fsm <= idle; + end case; + end if; + end if; + end process; -process (clk_i) -begin -if rising_edge(clk_i) then - if rst_i = '1' then - apb_fsm <= idle; - apb_psel_o <= '0'; - apb_pen_o <= '0'; - apb_pwr_o <= '0'; + -- APB fsm + process (clk_i) + begin + if rising_edge(clk_i) then + if rst_i = '1' then + apb_fsm <= idle; + apb_psel_o <= '0'; + apb_pen_o <= '0'; + apb_pwr_o <= '0'; apb_read_ack <= '0'; - else - case (apb_fsm) is - when idle => - apb_read_ack <= '0'; - if (apb_read_req = '1' and apb_read_ack = '0') then - apb_fsm <= setup; - apb_psel_o <= '1'; - apb_paddr_o <= apb_addr; - end if; - when setup => - apb_pen_o <= '1'; - apb_fsm <= accessing; - when accessing => - if (apb_pready_i = '1') then - apb_data <= apb_prdat_i; - apb_fsm <= idle; - apb_pen_o <= '0'; - apb_psel_o <= '0'; - apb_read_ack <= '1'; - end if; - when others => - apb_fsm <= idle; - end case; - end if; -end if; -end process; - -process (clk_i) -begin -if rising_edge (clk_i) then - if rst_i = '1' then - envm_fsm <= idle; - apb_read_req_wb <= '0'; - else - case (envm_fsm) is - when idle => - if (envm_read_req_p = '1') then - envm_fsm <= check_status; - end if; - when check_status => - if (apb_fsm = idle) then - apb_addr_wb <= x"60080120"; - apb_read_req_wb <= '1'; - envm_fsm <= poll_bit; - end if; - when poll_bit => - apb_read_req_wb <= '0'; - if (apb_read_ack = '1') then - if (apb_data (0) = '1') then -- busy bit - envm_fsm <= data; - apb_addr_wb <= envm_addr; - apb_read_req_wb <= '1'; - else - apb_read_req_wb <= '1'; -- retry - end if; - end if; - when data => - apb_read_req_wb <= '0'; - if (apb_read_ack = '1') then - envm_data <= apb_data; - envm_fsm <= idle; - end if; - when others => - envm_fsm <= idle; - end case; -end if; -end if; -end process; - -process (clk_i) -begin -if rising_edge (clk_i) then - envm_read_req_p <= '0'; - wb_write_req_wb <= '0'; - slave_o.ack <= '0'; - if (slave_i.stb = '1' and slave_i.cyc = '1' and slave_o.ack = '0') then - slave_o.ack <= '1'; - if (slave_i.adr(4 downto 2) = "000") then - slave_o.dat (31 downto 1) <= (others => '0'); - slave_o.dat (0) <= '1' when envm_fsm /= idle else '0'; - elsif (slave_i.adr (4 downto 2) = "001") then - slave_o.dat <= slave_i.dat; - if (slave_i.we = '1') then - envm_addr <= slave_i.dat; - envm_read_req_p <= '1'; - end if; - elsif (slave_i.adr (4 downto 2) = "010") then - slave_o.dat <= envm_data; - elsif (slave_i.adr (4 downto 2) = "100") then - slave_o.dat <= slave_i.dat; - if (slave_i.we = '1') then - wb_addr_wb <= slave_i.dat (wb_addr_wb'left downto 0); - end if; - elsif (slave_i.adr (4 downto 2) = "101") then - slave_o.dat <= slave_i.dat; - if (slave_i.we = '1') then - wb_data_reg <= slave_i.dat; - wb_write_req_wb <= '1'; - end if; - end if; - end if; -end if; -end process; - - - - - + else + case (apb_fsm) is + when idle => + apb_read_ack <= '0'; + if (apb_read_req = '1' and apb_read_ack = '0') then + apb_fsm <= setup; + apb_psel_o <= '1'; + apb_paddr_o <= apb_addr; + end if; + when setup => + apb_pen_o <= '1'; + apb_fsm <= accessing; + when accessing => + if (apb_pready_i = '1') then + apb_data <= apb_prdat_i; + apb_fsm <= idle; + apb_pen_o <= '0'; + apb_psel_o <= '0'; + apb_read_ack <= '1'; + end if; + when others => + apb_fsm <= idle; + end case; + end if; + end if; + end process; + process (clk_i) + begin + if rising_edge (clk_i) then + if rst_i = '1' then + envm_fsm <= idle; + apb_read_req_wb <= '0'; + else + case (envm_fsm) is + when idle => + if (envm_read_req_p = '1') then + envm_fsm <= check_status; + end if; + when check_status => + if (apb_fsm = idle) then + apb_addr_wb <= x"60080120"; + apb_read_req_wb <= '1'; + envm_fsm <= poll_bit; + end if; + when poll_bit => + apb_read_req_wb <= '0'; + if (apb_read_ack = '1') then + if (apb_data (0) = '1') then -- busy bit + envm_fsm <= data; + apb_addr_wb <= envm_addr; + apb_read_req_wb <= '1'; + else + apb_read_req_wb <= '1'; -- retry + end if; + end if; + when data => + apb_read_req_wb <= '0'; + if (apb_read_ack = '1') then + envm_data <= apb_data; + envm_fsm <= idle; + end if; + when others => + envm_fsm <= idle; + end case; + end if; + end if; + end process; + -- WB slave: decode accesses + process (clk_i) + begin + if rising_edge (clk_i) then + envm_read_req_p <= '0'; + wb_write_req_wb <= '0'; + slave_o.ack <= '0'; + if (slave_i.stb = '1' and slave_i.cyc = '1' and slave_o.ack = '0') then + slave_o.ack <= '1'; + if (slave_i.adr(4 downto 2) = "000") then + -- Status + slave_o.dat (31 downto 1) <= (others => '0'); + slave_o.dat (0) <= '1' when envm_fsm /= idle else '0'; + elsif (slave_i.adr (4 downto 2) = "001") then + -- Start NVM read access + slave_o.dat <= slave_i.dat; + if (slave_i.we = '1') then + envm_addr <= slave_i.dat; + envm_read_req_p <= '1'; + end if; + elsif (slave_i.adr (4 downto 2) = "010") then + -- NVM data + slave_o.dat <= envm_data; + elsif (slave_i.adr (4 downto 2) = "100") then + -- ??? + slave_o.dat <= slave_i.dat; + if (slave_i.we = '1') then + wb_addr_wb <= slave_i.dat (wb_addr_wb'left downto 0); + end if; + elsif (slave_i.adr (4 downto 2) = "101") then + -- Start NVM write + slave_o.dat <= slave_i.dat; + if (slave_i.we = '1') then + wb_data_reg <= slave_i.dat; + wb_write_req_wb <= '1'; + end if; + end if; + end if; + end if; + end process; end architecture; diff --git a/hdl/xwb_ram_adapter.vhdl b/hdl/xwb_ram_adapter.vhdl index 2651baf73ed6275c5c204c0bea6360047f0b4f1b..e0df90c293dcdf455e1abaaca4b5c59b66c8b058 100644 --- a/hdl/xwb_ram_adapter.vhdl +++ b/hdl/xwb_ram_adapter.vhdl @@ -39,8 +39,8 @@ entity xwb_ram_adapter is lock_req_o : out std_logic; lock_grant_i : in std_logic; - single_error_p_o : out std_logic; - double_error_p_o : out std_logic + single_error_p_o : out std_logic; + double_error_p_o : out std_logic ); end entity xwb_ram_adapter; @@ -122,22 +122,18 @@ architecture rtl of xwb_ram_adapter is read_fault_p_o : out std_logic; write_fault_p_o : out std_logic ); - - end component; - signal addr_scrubber : unsigned (15 downto 0); signal timeout_wb : unsigned (3 downto 0); - signal pwr, wr : std_logic; type fsm_states is (idle, process_wb, scrubber_read); signal fsm : fsm_states := idle; - signal we, re : std_logic; - signal addr : std_logic_vector (g_addr_width-1 downto 0); - signal data_in, data_out : std_logic_vector (31 downto 0); -signal bwe : std_logic_vector (3 downto 0); + signal we, re : std_logic; + signal addr : std_logic_vector (g_addr_width-1 downto 0); + signal data_in, data_out : std_logic_vector (31 downto 0); + signal bwe : std_logic_vector (3 downto 0); attribute syn_radhardlevel : string; attribute syn_radhardlevel of rtl : architecture is "tmr"; @@ -145,178 +141,165 @@ signal bwe : std_logic_vector (3 downto 0); signal ack, done_r, done_w : std_logic; - signal data_read : std_logic_vector (31 downto 0); - -attribute syn_encoding : string; -attribute syn_encoding of fsm : signal is "safe,onehot"; - + attribute syn_encoding : string; + attribute syn_encoding of fsm : signal is "safe,onehot"; begin - - slave_o.ack <= ack; slave_o.stall <= (not ack) and slave_i.cyc and slave_i.stb; slave_o.err <= '0'; - slave_o.int <= '0'; - slave_o.rty <= '0'; + slave_o.rty <= '0'; + process (clk_i) begin - if rising_edge (clk_i) then - if rst_i = '1' then - fsm <= idle; - addr_scrubber <= (x"0000"); - we <= '0'; - re <= '0'; - ack <= '0'; - timeout_wb <= (others => '0'); - addr <= (others => '0'); - else - - if (timeout_wb /= (timeout_wb'range => '1')) then - timeout_wb <= timeout_wb + 1; - end if; + if rst_i = '1' then + fsm <= idle; + addr_scrubber <= (x"0000"); + we <= '0'; + re <= '0'; + ack <= '0'; + timeout_wb <= (others => '0'); + addr <= (others => '0'); + else + + if (timeout_wb /= (timeout_wb'range => '1')) then + timeout_wb <= timeout_wb + 1; + end if; + + case (fsm) is + when idle => + we <= '0'; + re <= '0'; + ack <= '0'; + if (slave_i.stb = '1' and slave_i.cyc = '1' and ack = '0') then + fsm <= process_wb; + we <= slave_i.we; - case (fsm) is - when idle => - we <= '0'; - re <= '0'; - ack <= '0'; - if (slave_i.stb = '1' and slave_i.cyc = '1' and ack = '0') then - fsm <= process_wb; - we <= slave_i.we; - - if boot_done_i = '0' then + if boot_done_i = '0' then we <= slave_i.we; - elsif (g_is_iram and slave_i.we = '1') then - we <= '0'; - fsm <= idle; + elsif (g_is_iram and slave_i.we = '1') then report "Attempt to write iram in runtime" severity error; - elsif (g_is_dram and slave_i.we = '1') then - if (g_addr_width = 15 and slave_i.adr (g_addr_width-1 downto g_addr_width-3) /= "111") then we <= '0'; fsm <= idle; - report "Attempt to write lower part of dram in runtime" severity error; + elsif (g_is_dram and slave_i.we = '1') then + if (g_addr_width = 15 and slave_i.adr (g_addr_width-1 downto g_addr_width-3) /= "111") then + we <= '0'; + fsm <= idle; + report "Attempt to write lower part of dram in runtime" severity error; + end if; + + if (g_addr_width = 16 and slave_i.adr (g_addr_width-1 downto g_addr_width-4) /= "1111") then + we <= '0'; + fsm <= idle; + report "Attempt to write lower part of dram in runtime" severity error; + end if; end if; - - if (g_addr_width = 16 and slave_i.adr (g_addr_width-1 downto g_addr_width-4) /= "1111") then - we <= '0'; - fsm <= idle; - report "Attempt to write lower part of dram in runtime" severity error; - end if; - end if; - bwe <= slave_i.sel; - re <= not slave_i.we; - data_in <= slave_i.dat; - addr <= slave_i.adr (g_addr_width-1 downto 0); - elsif (boot_done_i = '1' and timeout_wb = (timeout_wb'range => '1')) then - fsm <= scrubber_read; - re <= '1'; - addr <= std_logic_vector(addr_scrubber(g_addr_width-1 downto 0)); - end if; - when process_wb => - - slave_o.dat <= data_out; - - if ((re = '1' and done_r = '1') or (we = '1' and done_w = '1')) then + bwe <= slave_i.sel; + re <= not slave_i.we; + data_in <= slave_i.dat; + addr <= slave_i.adr (g_addr_width-1 downto 0); + elsif (boot_done_i = '1' and timeout_wb = (timeout_wb'range => '1')) then + fsm <= scrubber_read; + re <= '1'; + addr <= std_logic_vector(addr_scrubber(g_addr_width-1 downto 0)); + end if; + + when process_wb => + slave_o.dat <= data_out; + if ((re = '1' and done_r = '1') or (we = '1' and done_w = '1')) then re <= '0'; we <= '0'; fsm <= idle; ack <= '1'; timeout_wb <= (others => '0'); - end if; - - - when scrubber_read => - - if (done_r = '1') then - re <= '0'; - fsm <= idle; - addr_scrubber <= addr_scrubber+4; - end if; - when others => - fsm <= idle; - end case; + end if; + + when scrubber_read => + if (done_r = '1') then + re <= '0'; + fsm <= idle; + addr_scrubber <= addr_scrubber+4; + end if; + when others => + fsm <= idle; + end case; + end if; end if; -end if; end process; -ecc_simple : if g_data_width = 39 generate - ecc_circuitry : secded_ecc - generic map ( - g_addr_width => g_addr_width - ) - port map ( - clk_i => clk_i, - rst_i => rst_i, - - - d_i => data_in, - a_i => addr, - we_i => we and not done_w, - bwe_i => bwe, - re_i => re and not done_r, - - q_o => data_out, - done_r_o => done_r, - done_w_o => done_w, - - --to the BRAM - d_ram_i => d_ram_i, - q_ram_o => q_ram_o, - a_ram_o => a_ram_o, - we_ram_o => we_ram_o, - re_ram_o => re_ram_o, - valid_ram_i => valid_ram_i, - - lock_req_o => lock_req_o, - lock_grant_i => lock_grant_i, - - single_error_p_o => single_error_p_o, - double_error_p_o => double_error_p_o, - read_fault_p_o => open, - write_fault_p_o => open - ); -end generate ecc_simple; - -ecc_daec : if g_data_width = 42 generate - ecc_circuitry : secded_ecc_daec - generic map ( - g_addr_width => g_addr_width - ) - port map ( - clk_i => clk_i, - rst_i => rst_i, - - - d_i => data_in, - a_i => addr, - we_i => we and not done_w, - bwe_i => bwe, - re_i => re and not done_r, - - q_o => data_out, - done_r_o => done_r, - done_w_o => done_w, - - --to the BRAM - d_ram_i => d_ram_i, - q_ram_o => q_ram_o, - a_ram_o => a_ram_o, - we_ram_o => we_ram_o, - re_ram_o => re_ram_o, - valid_ram_i => valid_ram_i, - - lock_req_o => lock_req_o, - lock_grant_i => lock_grant_i, - - single_error_p_o => single_error_p_o, - double_error_p_o => double_error_p_o, - read_fault_p_o => open, - write_fault_p_o => open - ); - -end generate ecc_daec; - - + ecc_simple : if g_data_width = 39 generate + ecc_circuitry : secded_ecc + generic map ( + g_addr_width => g_addr_width + ) + port map ( + clk_i => clk_i, + rst_i => rst_i, + + + d_i => data_in, + a_i => addr, + we_i => we and not done_w, + bwe_i => bwe, + re_i => re and not done_r, + + q_o => data_out, + done_r_o => done_r, + done_w_o => done_w, + + --to the BRAM + d_ram_i => d_ram_i, + q_ram_o => q_ram_o, + a_ram_o => a_ram_o, + we_ram_o => we_ram_o, + re_ram_o => re_ram_o, + valid_ram_i => valid_ram_i, + + lock_req_o => lock_req_o, + lock_grant_i => lock_grant_i, + + single_error_p_o => single_error_p_o, + double_error_p_o => double_error_p_o, + read_fault_p_o => open, + write_fault_p_o => open + ); + end generate ecc_simple; + + ecc_daec : if g_data_width = 42 generate + ecc_circuitry : secded_ecc_daec + generic map ( + g_addr_width => g_addr_width + ) + port map ( + clk_i => clk_i, + rst_i => rst_i, + + d_i => data_in, + a_i => addr, + we_i => we and not done_w, + bwe_i => bwe, + re_i => re and not done_r, + + q_o => data_out, + done_r_o => done_r, + done_w_o => done_w, + + --to the BRAM + d_ram_i => d_ram_i, + q_ram_o => q_ram_o, + a_ram_o => a_ram_o, + we_ram_o => we_ram_o, + re_ram_o => re_ram_o, + valid_ram_i => valid_ram_i, + + lock_req_o => lock_req_o, + lock_grant_i => lock_grant_i, + + single_error_p_o => single_error_p_o, + double_error_p_o => double_error_p_o, + read_fault_p_o => open, + write_fault_p_o => open + ); + end generate ecc_daec; end architecture; \ No newline at end of file diff --git a/hdl/xwb_seu_reg.vhd b/hdl/xwb_seu_reg.vhd index 0d13842ceae7081f247e64fe5da0eff43a32ab87..a2f030c66c53691f66f066703bdb4a67a7a522f9 100644 --- a/hdl/xwb_seu_reg.vhd +++ b/hdl/xwb_seu_reg.vhd @@ -83,8 +83,7 @@ begin slave_o.err <= '0'; slave_o.rty <= '0'; - slave_o.int <='0'; - + desc_o <= (others => '0'); diff --git a/hdl/xwb_uart.vhd b/hdl/xwb_uart.vhd index d8c4f26dd4398dae246a1f8d02f3a14e7243e446..37a645f42fef96302f637006a9347b5b8f7583e8 100644 --- a/hdl/xwb_uart.vhd +++ b/hdl/xwb_uart.vhd @@ -78,7 +78,6 @@ begin slave_o.err <= '0'; slave_o.rty <= '0'; - slave_o.int <='0'; desc_o <= (others => '0'); diff --git a/hdl/xwb_wd_reg.vhd b/hdl/xwb_wd_reg.vhd index bb73699a2de6424d28e7dd97e7fb9fc2d10fe2d5..01190f01578d58b6fd7526256373fb7ace0b2e48 100644 --- a/hdl/xwb_wd_reg.vhd +++ b/hdl/xwb_wd_reg.vhd @@ -70,7 +70,6 @@ begin slave_o.err <= '0'; slave_o.rty <= '0'; - slave_o.int <='0'; desc_o <= (others => '0');