OpenCores
URL https://opencores.org/ocsvn/minimips_superscalar/minimips_superscalar/trunk

Subversion Repositories minimips_superscalar

[/] [minimips_superscalar/] [trunk/] [bench/] [rom.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 mcafruni
-------------------------------------------------------------------------------
2
--                                                                           --
3
--                                                                           --
4
-- miniMIPS Superscalar Processor : testbench                                --
5
-- based on miniMIPS Processor                                               --
6
--                                                                           --
7
--                                                                           --
8
-- Author : Miguel Cafruni                                                   --
9
-- miguel_cafruni@hotmail.com                                                --
10
--                                                           December 2018   --
11
-------------------------------------------------------------------------------
12
 
13
-- If you encountered any problem, please contact :
14
--
15
--   lmouton@enserg.fr  (2003 version)
16
--   oschneid@enserg.fr (2003 version)
17
--   shangoue@enserg.fr (2003 version)
18
--   miguel_cafruni@hotmail.com (Superscalar version 2018)
19
 
20
library ieee;
21
use ieee.std_logic_1164.all;
22
use ieee.numeric_std.all;
23
use ieee.std_logic_textio.all;
24
use std.textio.all;
25
 
26
library work;
27
use work.pack_mips.all;
28
 
29
entity rom is
30
   generic (mem_size : natural := 256; -- Size of the memory in words
31
            start : natural := 32768;
32
            latency : time := 0 ns);
33
   port(
34
       adr : in bus32;
35
       donnee : out bus32;
36
       ack : out std_logic;
37
       adr2 : in bus32;
38
       donnee2 : out bus32;
39
       ack2 : out std_logic;
40
       load : in std_logic;
41
       fname : in string
42
   );
43
end;
44
 
45
 
46
architecture bench of rom is
47
    type storage_array is array(natural range start to start+4*mem_size - 1) of bus8;
48
    signal storage : storage_array := (others => (others => '0'));    -- The memory
49
    signal adresse : bus16;
50
    signal taille : bus16;
51
begin
52
 
53
 
54
    process (load)
55
        -- Variables for loading the memory
56
        -- The reading is done by blocks
57
        type bin is file of integer;                    -- Binary type file
58
        file load_file : bin;
59
 
60
        variable c : integer ;                          -- Integer (32 bits) read in the file
61
        variable index : integer range storage'range;   -- Index for loading
62
        variable word : bus32;                          -- Word read in the file
63
        variable taille_bloc : integer;                 -- Current size of the block to load
64
        variable tmp : bus16;
65
        variable status : file_open_status;
66
 
67
        variable s : line;
68
        variable big_endian : boolean := true;          -- Define if the processor (on which we work) is little or big endian
69
    begin
70
 
71
    if load='1' then
72
 
73
        -- Reading of the file de fill the memory at the defined address
74
        file_open(status, load_file, fname, read_mode);
75
 
76
        if status=open_ok then
77
 
78
            while not endfile(load_file) loop
79
 
80
                -- Read the header of the block
81
                read(load_file, c);                             -- Read a 32 bit long word
82
                word := bus32(to_unsigned(c, 32));              -- Conversion to a bit vector
83
 
84
                if big_endian then
85
                    tmp := word(7 downto 0) & word(15 downto 8);
86
                else
87
                    tmp := word(31 downto 16);
88
                end if;
89
 
90
                index := to_integer(unsigned(tmp));
91
                adresse <= tmp;
92
 
93
                if big_endian then
94
                    tmp := word(23 downto 16) & word(31 downto 24);
95
                else
96
                    tmp := word(15 downto 0);
97
                end if;
98
 
99
 
100
                taille_bloc := to_integer(unsigned(tmp)) / 4;
101
                taille <= tmp;
102
 
103
                -- Load the block in the ROM
104
                for n in 1 to taille_bloc loop
105
 
106
                    -- The header file is not correct (block too small, ROM to small ...)
107
                    -- The simulation is stopped
108
                    assert (not endfile(load_file) and (index<=storage'high))
109
                        report "L'image n'a pas le bon format ou ne rentre pas dans la rom."
110
                        severity error;
111
 
112
                    if not endfile(load_file) and (index<=storage'high) then
113
                        read(load_file, c);
114
                        word := bus32(to_unsigned(c, 32));
115
                        if (c < 0) then
116
                          word := not(word);
117
                          word := std_logic_vector(unsigned(word)+1);
118
                        end if;
119
                        for i in 0 to 3 loop
120
 
121
                            if big_endian then
122
                                storage(index+i) <= word(8*(i+1)-1 downto 8*i);
123
                            else
124
                                storage(index+(3-i)) <= word(8*(i+1)-1 downto 8*i);
125
                            end if;
126
 
127
                        end loop;
128
                        index := index + 4;
129
                    end if;
130
                end loop;
131
 
132
            end loop;
133
 
134
            file_close(load_file);
135
 
136
        else
137
            assert false
138
                report "Impossible d'ouvrir le fichier specifie."
139
                severity error;
140
 
141
        end if;
142
 
143
    end if;
144
 
145
    end process;
146
 
147
 
148
    process(adr) -- Request for reading the ROM
149
        variable inadr : integer;
150
        variable i : natural;
151
    begin
152
            inadr := to_integer(unsigned(adr));
153
 
154
            if (inadr>=storage'low) and (inadr<=storage'high) then
155
                for i in 0 to 3 loop
156
                    donnee(8*(i+1)-1 downto 8*i) <= storage(inadr+3-i) after latency;
157
                end loop;
158
                ack <= '0', '1' after latency;
159
            else
160
                donnee <= (others => 'Z');
161
                ack <= 'L';
162
            end if;
163
    end process;
164
 
165
 
166
    process(adr2) -- Request for reading the ROM
167
        variable inadr2 : integer;
168
        variable i2 : natural;
169
    begin
170
            inadr2 := to_integer(unsigned(adr2));
171
 
172
            if (inadr2>=storage'low) and (inadr2<=storage'high) then
173
                for i2 in 0 to 3 loop
174
                    donnee2(8*(i2+1)-1 downto 8*i2) <= storage(inadr2+3-i2) after latency;
175
                end loop;
176
                ack2 <= '0', '1' after latency;
177
            else
178
                donnee2 <= (others => 'Z');
179
                ack2 <= 'L';
180
            end if;
181
    end process;
182
 
183
end bench;
184
 
185
 
186
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.