[Libre-soc-bugs] [Bug 502] determine SRAM block size and implement it
bugzilla-daemon at libre-soc.org
bugzilla-daemon at libre-soc.org
Sun Dec 6 12:35:53 GMT 2020
https://bugs.libre-soc.org/show_bug.cgi?id=502
--- Comment #8 from Staf Verhaegen <staf at fibraservi.eu> ---
As asked in
http://lists.libre-soc.org/pipermail/libre-soc-dev/2020-December/001451.html
below is a generic SRAM simulation model in VHDL. I had to adapt the model for
multiple WE bits so the model is not fully tested. It does analyze with ghdl
though.
-- Generic SRAM simulation model
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity sram is
port (
CLK: in std_logic;
-- Width of address will determine number of words in the RAM
A: in std_logic_vector;
-- D and Q have to have the same width
D: in std_logic_vector;
Q: out std_logic_vector;
-- Width of WE determines the write granularity
WE: in std_logic_vector
);
end entity sram;
architecture rtl of sram is
constant WEWORDBITS: integer := (D'length)/(WE'length);
type word is array (WE'length - 1 downto 0) of
std_logic_vector(WEWORDBITS - 1 downto 0);
type ram_type is array (0 to (2**A'length) - 1) of word;
signal RAM: ram_type;
signal A_hold: std_logic_vector(A'range);
signal addr: integer;
signal addr_hold: integer;
begin
addr <= to_integer(unsigned(A));
addr_hold <= to_integer(unsigned(A_hold));
process(CLK) is
begin
if (rising_edge(CLK)) then
A_hold <= A;
for weword in 0 to WE'length - 1 loop
if WE(weword) = '1' then
-- Write cycle
RAM(addr)(weword) <= D((weword + 1)*WEWORDBITS - 1 downto
weword*WEWORDBITS);
end if;
end loop;
end if;
end process;
read: for weword in 0 to WE'length - 1 generate
begin
Q((weword + 1)*WEWORDBITS - 1 downto weword*WEWORDBITS) <=
RAM(addr_hold)(weword);
end generate;
end architecture rtl;
--
You are receiving this mail because:
You are on the CC list for the bug.
More information about the libre-soc-bugs
mailing list