Line 90... |
Line 90... |
firq_i : in std_ulogic_vector(3 downto 0);
|
firq_i : in std_ulogic_vector(3 downto 0);
|
-- system time input from MTIME --
|
-- system time input from MTIME --
|
time_i : in std_ulogic_vector(63 downto 0); -- current system time
|
time_i : in std_ulogic_vector(63 downto 0); -- current system time
|
-- physical memory protection --
|
-- physical memory protection --
|
pmp_addr_o : out pmp_addr_if_t; -- addresses
|
pmp_addr_o : out pmp_addr_if_t; -- addresses
|
pmp_maddr_i : in pmp_addr_if_t; -- masked addresses
|
|
pmp_ctrl_o : out pmp_ctrl_if_t; -- configs
|
pmp_ctrl_o : out pmp_ctrl_if_t; -- configs
|
priv_mode_o : out std_ulogic_vector(1 downto 0); -- current CPU privilege level
|
priv_mode_o : out std_ulogic_vector(1 downto 0); -- current CPU privilege level
|
-- bus access exceptions --
|
-- bus access exceptions --
|
mar_i : in std_ulogic_vector(data_width_c-1 downto 0); -- memory address register
|
mar_i : in std_ulogic_vector(data_width_c-1 downto 0); -- memory address register
|
ma_instr_i : in std_ulogic; -- misaligned instruction address
|
ma_instr_i : in std_ulogic; -- misaligned instruction address
|
Line 1465... |
Line 1464... |
csr_rdata_o(04) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- E CPU extension
|
csr_rdata_o(04) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- E CPU extension
|
csr_rdata_o(08) <= not bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- I CPU extension (if not E)
|
csr_rdata_o(08) <= not bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- I CPU extension (if not E)
|
csr_rdata_o(12) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_M); -- M CPU extension
|
csr_rdata_o(12) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_M); -- M CPU extension
|
csr_rdata_o(20) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_U); -- U CPU extension
|
csr_rdata_o(20) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_U); -- U CPU extension
|
csr_rdata_o(23) <= '1'; -- X CPU extension (non-std extensions)
|
csr_rdata_o(23) <= '1'; -- X CPU extension (non-std extensions)
|
csr_rdata_o(25) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zicsr) and bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zifencei); -- Z CPU extension
|
|
csr_rdata_o(30) <= '1'; -- 32-bit architecture (MXL lo)
|
csr_rdata_o(30) <= '1'; -- 32-bit architecture (MXL lo)
|
csr_rdata_o(31) <= '0'; -- 32-bit architecture (MXL hi)
|
csr_rdata_o(31) <= '0'; -- 32-bit architecture (MXL hi)
|
when x"304" => -- R/W: mie - machine interrupt-enable register
|
when x"304" => -- R/W: mie - machine interrupt-enable register
|
csr_rdata_o(03) <= csr.mie_msie; -- machine software IRQ enable
|
csr_rdata_o(03) <= csr.mie_msie; -- machine software IRQ enable
|
csr_rdata_o(07) <= csr.mie_mtie; -- machine timer IRQ enable
|
csr_rdata_o(07) <= csr.mie_mtie; -- machine timer IRQ enable
|
Line 1533... |
Line 1531... |
end if;
|
end if;
|
end if;
|
end if;
|
|
|
when x"3b0" => -- R/W: pmpaddr0 - physical memory protection address register 0
|
when x"3b0" => -- R/W: pmpaddr0 - physical memory protection address register 0
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 1) then
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 1) then
|
csr_rdata_o <= pmp_maddr_i(0)(33 downto 2);
|
csr_rdata_o <= csr.pmpaddr(0);
|
if (csr.pmpcfg(0)(4 downto 3) = "00") then -- mode = off
|
if (csr.pmpcfg(0)(4 downto 3) = "00") then -- mode = off
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
else -- mode = NAPOT
|
else -- mode = NAPOT
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
end if;
|
end if;
|
end if;
|
end if;
|
when x"3b1" => -- R/W: pmpaddr1 - physical memory protection address register 1
|
when x"3b1" => -- R/W: pmpaddr1 - physical memory protection address register 1
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 2) then
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 2) then
|
csr_rdata_o <= pmp_maddr_i(1)(33 downto 2);
|
csr_rdata_o <= csr.pmpaddr(1);
|
if (csr.pmpcfg(1)(4 downto 3) = "00") then -- mode = off
|
if (csr.pmpcfg(1)(4 downto 3) = "00") then -- mode = off
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
else -- mode = NAPOT
|
else -- mode = NAPOT
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
end if;
|
end if;
|
end if;
|
end if;
|
when x"3b2" => -- R/W: pmpaddr2 - physical memory protection address register 2
|
when x"3b2" => -- R/W: pmpaddr2 - physical memory protection address register 2
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 3) then
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 3) then
|
csr_rdata_o <= pmp_maddr_i(2)(33 downto 2);
|
csr_rdata_o <= csr.pmpaddr(2);
|
if (csr.pmpcfg(2)(4 downto 3) = "00") then -- mode = off
|
if (csr.pmpcfg(2)(4 downto 3) = "00") then -- mode = off
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
else -- mode = NAPOT
|
else -- mode = NAPOT
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
end if;
|
end if;
|
end if;
|
end if;
|
when x"3b3" => -- R/W: pmpaddr3 - physical memory protection address register 3
|
when x"3b3" => -- R/W: pmpaddr3 - physical memory protection address register 3
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 4) then
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 4) then
|
csr_rdata_o <= pmp_maddr_i(3)(33 downto 2);
|
csr_rdata_o <= csr.pmpaddr(3);
|
if (csr.pmpcfg(3)(4 downto 3) = "00") then -- mode = off
|
if (csr.pmpcfg(3)(4 downto 3) = "00") then -- mode = off
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
else -- mode = NAPOT
|
else -- mode = NAPOT
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
end if;
|
end if;
|
end if;
|
end if;
|
when x"3b4" => -- R/W: pmpaddr4 - physical memory protection address register 4
|
when x"3b4" => -- R/W: pmpaddr4 - physical memory protection address register 4
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 5) then
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 5) then
|
csr_rdata_o <= pmp_maddr_i(4)(33 downto 2);
|
csr_rdata_o <= csr.pmpaddr(4);
|
if (csr.pmpcfg(4)(4 downto 3) = "00") then -- mode = off
|
if (csr.pmpcfg(4)(4 downto 3) = "00") then -- mode = off
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
else -- mode = NAPOT
|
else -- mode = NAPOT
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
end if;
|
end if;
|
end if;
|
end if;
|
when x"3b5" => -- R/W: pmpaddr5 - physical memory protection address register 5
|
when x"3b5" => -- R/W: pmpaddr5 - physical memory protection address register 5
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 6) then
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 6) then
|
csr_rdata_o <= pmp_maddr_i(5)(33 downto 2);
|
csr_rdata_o <= csr.pmpaddr(5);
|
if (csr.pmpcfg(5)(4 downto 3) = "00") then -- mode = off
|
if (csr.pmpcfg(5)(4 downto 3) = "00") then -- mode = off
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
else -- mode = NAPOT
|
else -- mode = NAPOT
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
end if;
|
end if;
|
end if;
|
end if;
|
when x"3b6" => -- R/W: pmpaddr6 - physical memory protection address register 6
|
when x"3b6" => -- R/W: pmpaddr6 - physical memory protection address register 6
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 7) then
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 7) then
|
csr_rdata_o <= pmp_maddr_i(6)(33 downto 2);
|
csr_rdata_o <= csr.pmpaddr(6);
|
if (csr.pmpcfg(6)(4 downto 3) = "00") then -- mode = off
|
if (csr.pmpcfg(6)(4 downto 3) = "00") then -- mode = off
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
else -- mode = NAPOT
|
else -- mode = NAPOT
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
end if;
|
end if;
|
end if;
|
end if;
|
when x"3b7" => -- R/W: pmpaddr7 - physical memory protection address register 7
|
when x"3b7" => -- R/W: pmpaddr7 - physical memory protection address register 7
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 8) then
|
if (PMP_USE = true) and (PMP_NUM_REGIONS >= 8) then
|
csr_rdata_o <= pmp_maddr_i(7)(33 downto 2);
|
csr_rdata_o <= csr.pmpaddr(7);
|
if (csr.pmpcfg(7)(4 downto 3) = "00") then -- mode = off
|
if (csr.pmpcfg(7)(4 downto 3) = "00") then -- mode = off
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
csr_rdata_o(PMP_GRANULARITY-1 downto 0) <= (others => '0'); -- required for granularity check by SW
|
else -- mode = NAPOT
|
else -- mode = NAPOT
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
csr_rdata_o(PMP_GRANULARITY-2 downto 0) <= (others => '1');
|
end if;
|
end if;
|