|
4 | 4 | -- |
5 | 5 | -- Copyright (c) 2014-2019, Lars Asplund lars.anders.asplund@gmail.com |
6 | 6 |
|
| 7 | +library ieee; |
| 8 | +context ieee.ieee_std_context; |
| 9 | + |
7 | 10 | package pkg_c is |
8 | 11 |
|
9 | 12 | function get_param(f: integer) return integer; |
10 | | - attribute foreign of get_param : |
11 | | - function is "VHPIDIRECT get_param"; |
| 13 | + attribute foreign of get_param : function is "VHPIDIRECT get_param"; |
12 | 14 |
|
13 | | - --integer'high is 2147483647, but the limit here seems to be 128 times less. Otherwise, it fails. |
14 | | - constant max_length: integer:= 16777215; |
15 | | - type buffer_t is array(integer range 0 to max_length) of integer; |
16 | | - type buffer_p is access buffer_t; |
| 15 | + procedure write_byte ( id, i, v: integer ) ; |
| 16 | + attribute foreign of write_byte : procedure is "VHPIDIRECT write_byte"; |
17 | 17 |
|
18 | | - impure function get_addr(f: integer) return buffer_p; |
19 | | - attribute foreign of get_addr : |
20 | | - function is "VHPIDIRECT get_addr"; |
| 18 | + impure function read_byte ( id, i: integer ) return integer; |
| 19 | + attribute foreign of read_byte : function is "VHPIDIRECT read_byte"; |
21 | 20 |
|
22 | 21 | type memory_t is record |
23 | 22 | -- Private |
24 | 23 | p_id: integer; |
25 | 24 | end record; |
26 | 25 |
|
27 | 26 | impure function new_memory(id: integer := -1) return memory_t; |
28 | | - procedure write_word ( memory: memory_t; i, v: integer ); |
29 | | - impure function read_word ( memory: memory_t; i: integer ) return integer; |
| 27 | + procedure write_word ( memory: memory_t; i: natural; w: std_logic_vector ); |
| 28 | + impure function read_word ( memory: memory_t; i, bytes_per_word: integer ) return std_logic_vector; |
| 29 | + |
| 30 | + procedure write_byte ( memory: memory_t; i: integer; v: std_logic_vector(7 downto 0) ); |
| 31 | + impure function read_byte ( memory: memory_t; i: integer ) return std_logic_vector; |
30 | 32 |
|
31 | 33 | end pkg_c; |
32 | 34 |
|
33 | 35 | package body pkg_c is |
| 36 | + |
| 37 | + -- VHPI |
| 38 | + |
34 | 39 | function get_param(f: integer) return integer is begin |
35 | 40 | assert false report "VHPI" severity failure; |
36 | 41 | end function; |
37 | 42 |
|
38 | | - impure function get_addr(f: integer) return buffer_p is begin |
| 43 | + procedure write_byte ( id, i, v: integer ) is begin |
| 44 | + assert false report "VHPI" severity failure; |
| 45 | + end procedure; |
| 46 | + |
| 47 | + impure function read_byte ( id, i: integer ) return integer is begin |
39 | 48 | assert false report "VHPI" severity failure; |
40 | 49 | end function; |
41 | 50 |
|
| 51 | + -- VHDL |
| 52 | + |
| 53 | + procedure write_byte ( memory: memory_t; i: integer; v: std_logic_vector(7 downto 0) ) is |
| 54 | + begin |
| 55 | + write_byte(memory.p_id, i, to_integer(unsigned(v))); |
| 56 | + end procedure; |
| 57 | + |
| 58 | + impure function read_byte ( memory: memory_t; i: integer ) return std_logic_vector is begin |
| 59 | + return std_logic_vector(to_unsigned(read_byte(memory.p_id, i), 8)); |
| 60 | + end function; |
| 61 | + |
42 | 62 | impure function new_memory(id: integer := -1) return memory_t is begin |
43 | 63 | return (p_id => id); |
44 | 64 | end; |
45 | 65 |
|
46 | | - procedure write_word ( memory: memory_t; i, v: integer ) is |
47 | | - variable buf: buffer_p := get_addr(memory.p_id); |
48 | | - begin |
49 | | - buf(i) := v; |
| 66 | + procedure write_word ( memory: memory_t; i: natural; w: std_logic_vector ) is begin |
| 67 | + for idx in 0 to w'length/8-1 loop |
| 68 | + write_byte(memory, i + idx, w(8*idx+7 downto 8*idx)); |
| 69 | + end loop; |
50 | 70 | end procedure; |
51 | 71 |
|
52 | | - impure function read_word ( memory: memory_t; i: integer ) return integer is |
53 | | - variable buf: buffer_p := get_addr(memory.p_id); |
| 72 | + impure function read_word ( memory: memory_t; i, bytes_per_word: integer ) return std_logic_vector is |
| 73 | + variable tmp: std_logic_vector(31 downto 0); |
54 | 74 | begin |
55 | | - return buf(i); |
| 75 | + for idx in 0 to bytes_per_word-1 loop |
| 76 | + tmp(8*idx+7 downto 8*idx) := read_byte(memory, i + idx); |
| 77 | + end loop; |
| 78 | + return tmp; |
56 | 79 | end function; |
57 | 80 |
|
58 | 81 | end pkg_c; |
0 commit comments