aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna/issue715/LRAM.vhdl
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2018-12-04 04:48:50 +0100
committerTristan Gingold <tgingold@free.fr>2018-12-04 04:48:50 +0100
commit4ee9742dfe7e97ecd1bc4dd8fb323591ae57b118 (patch)
tree927e190c938dce79955e4458ce6d5d8ddc0644d1 /testsuite/gna/issue715/LRAM.vhdl
parent8fb41b61659c2ee3d86dc9aebb0b60e5582a5ac1 (diff)
downloadghdl-4ee9742dfe7e97ecd1bc4dd8fb323591ae57b118.tar.gz
ghdl-4ee9742dfe7e97ecd1bc4dd8fb323591ae57b118.tar.bz2
ghdl-4ee9742dfe7e97ecd1bc4dd8fb323591ae57b118.zip
Add reproducer for #715
Diffstat (limited to 'testsuite/gna/issue715/LRAM.vhdl')
-rw-r--r--testsuite/gna/issue715/LRAM.vhdl78
1 files changed, 78 insertions, 0 deletions
diff --git a/testsuite/gna/issue715/LRAM.vhdl b/testsuite/gna/issue715/LRAM.vhdl
new file mode 100644
index 000000000..e6ec79bb6
--- /dev/null
+++ b/testsuite/gna/issue715/LRAM.vhdl
@@ -0,0 +1,78 @@
+-------------------------------------------------------------------------------
+--
+-- walter d. gallegos
+-- www.waltergallegos.com
+-- Programmable Logic Consulting
+--
+-- Este archivo y documentacion son propiedad intelectual de Walter D. Gallegos
+--
+-------------------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL, IEEE.NUMERIC_STD.ALL;
+USE STD.TextIO.ALL;
+
+ENTITY LRAM IS
+GENERIC ( size : INTEGER := 14; fName : STRING := "IntDemo.mem"; startAdr : INTEGER := 0);
+ PORT (
+ CLOCK : IN STD_LOGIC;
+ WR : IN STD_LOGIC;
+ BEA : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
+ DIA : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
+ DOA : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
+ ADRA : IN STD_LOGIC_VECTOR (size-1 DOWNTO 0);
+ DOB : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
+ ADRB : IN STD_LOGIC_VECTOR (size-1 DOWNTO 0)
+ );
+END LRAM;
+
+ARCHITECTURE WDG0 OF LRAM IS
+
+ CONSTANT depth : INTEGER := (2**size)-1;
+ TYPE LocalRAMDesc IS ARRAY (0 TO depth) OF STD_LOGIC_VECTOR(31 DOWNTO 0);
+
+ IMPURE FUNCTION Init (fName : STRING) RETURN LocalRAMDesc IS
+ FILE f : TEXT OPEN READ_MODE IS fName;
+ VARIABLE l : LINE;
+ VARIABLE b : STD_LOGIC_VECTOR(31 DOWNTO 0);
+ VARIABLE m : LocalRAMDesc := (OTHERS => (OTHERS => '0'));
+ BEGIN
+ FOR i IN startAdr TO depth LOOP
+ EXIT WHEN endfile(f);
+ IF (i = depth) THEN
+ REPORT "LRAM : Error memory full " SEVERITY FAILURE;
+ END IF;
+ readline(f, l); hread(l, b);
+ m(i) := STD_LOGIC_VECTOR(RESIZE(UNSIGNED(b), 32));
+ END LOOP;
+ REPORT ("LRAM : loaded from " & fName & LF) SEVERITY NOTE;
+ RETURN m;
+ END FUNCTION;
+
+ SIGNAL LocalRAM : LocalRAMDesc := Init(fName);
+ SIGNAL data, code : STD_LOGIC_VECTOR(31 DOWNTO 0);
+
+ -- XILINX ATTRIBUTE
+ ATTRIBUTE ram_style : STRING;
+ ATTRIBUTE ram_style OF LocalRAM : SIGNAL IS "block";
+ -- XILINX END ATTRIBUTE
+
+BEGIN
+
+ CodeDataMemory : PROCESS(CLOCK)
+ BEGIN
+ IF rising_edge(CLOCK) THEN
+ FOR i IN DIA'RANGE LOOP
+ IF (BEA(i/8) AND WR)= '1' THEN
+ LocalRAM(TO_INTEGER(UNSIGNED(ADRA)))(i) <= DIA(i);
+ END IF;
+ END LOOP;
+ data <= LocalRAM(TO_INTEGER(UNSIGNED(ADRA)));
+ code <= LocalRAM(TO_INTEGER(UNSIGNED(ADRB)));
+ END IF;
+ END PROCESS CodeDataMemory;
+
+ DOA <= data;
+ DOB <= code;
+
+END WDG0;