Skip to content

Commit c3f67a7

Browse files
committed
style(examples/vhdl/array_axis_vcs): avoid using protected shared variables
1 parent aee9b4b commit c3f67a7

3 files changed

Lines changed: 41 additions & 32 deletions

File tree

examples/vhdl/array_axis_vcs/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
# vu.set_sim_option('modelsim.init_files.after_load',['runall_addwave.do'])
2424

2525
c_obj = join(root, 'src', 'test', 'main.o')
26-
print(os.popen('gcc -fPIC -rdynamic -c '+join(root, 'src/**/*.c')+' -o '+c_obj).read())
26+
print(os.popen('gcc -fPIC -rdynamic -c '+join(root, 'src/**/main.c')+' -o '+c_obj).read())
2727

2828
for tb in lib.get_test_benches(pattern='*tb_c_*', allow_empty=False):
2929
tb.set_sim_options.get('ghdl.elab_flags', ["-Wl," + " ".join([c_obj])], overwrite=False)

examples/vhdl/array_axis_vcs/src/test/pkg_c.vhd

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,49 @@ package pkg_c is
1010
attribute foreign of get_param :
1111
function is "VHPIDIRECT get_param";
1212

13-
constant stream_length : integer := get_param(0);
14-
15-
type buffer_t is array(integer range 0 to stream_length-1) of integer;
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;
1616
type buffer_p is access buffer_t;
1717

1818
impure function get_addr(f: integer) return buffer_p;
1919
attribute foreign of get_addr :
2020
function is "VHPIDIRECT get_addr";
2121

22-
type buffet_t_prot is protected
23-
procedure init ( i: integer );
24-
procedure set ( i: integer; v: integer);
25-
impure function get (i: integer) return integer;
26-
end protected buffet_t_prot;
22+
type memory_t is record
23+
-- Private
24+
p_id: integer;
25+
end record;
26+
27+
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;
2730

2831
end pkg_c;
2932

3033
package body pkg_c is
3134
function get_param(f: integer) return integer is begin
3235
assert false report "VHPI" severity failure;
33-
end get_param;
36+
end function;
3437

3538
impure function get_addr(f: integer) return buffer_p is begin
3639
assert false report "VHPI" severity failure;
37-
end get_addr;
38-
39-
type buffet_t_prot is protected body
40-
variable var: buffer_p;
41-
procedure init ( i: integer ) is begin
42-
var := get_addr(i);
43-
end procedure;
44-
procedure set ( i: integer; v: integer ) is begin
45-
var(i) := v;
46-
end procedure;
47-
impure function get ( i: integer ) return integer is begin
48-
return var(i);
49-
end get;
50-
end protected body buffet_t_prot;
40+
end function;
41+
42+
impure function new_memory(id: integer := -1) return memory_t is begin
43+
return (p_id => id);
44+
end;
45+
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;
50+
end procedure;
51+
52+
impure function read_word ( memory: memory_t; i: integer ) return integer is
53+
variable buf: buffer_p := get_addr(memory.p_id);
54+
begin
55+
return buf(i);
56+
end function;
57+
5158
end pkg_c;

examples/vhdl/array_axis_vcs/src/test/tb_c_axis_loop.vhd

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ library vunit_lib;
1818
context vunit_lib.vunit_context;
1919
context vunit_lib.vc_context;
2020

21+
use work.pkg_c;
2122
use work.pkg_c.all;
2223

2324
entity tb_c_axis_loop is
@@ -30,20 +31,23 @@ end entity;
3031
architecture tb of tb_c_axis_loop is
3132
-- Simulation constants
3233

33-
constant clk_period : time := 20 ns;
34-
constant data_width : natural := get_param(1);
35-
constant fifo_depth : natural := get_param(2);
34+
constant clk_period : time := 20 ns;
35+
constant stream_length : integer := get_param(0);
36+
constant data_width : natural := get_param(1);
37+
constant fifo_depth : natural := get_param(2);
3638

3739
-- AXI4Stream Verification Components
3840

3941
constant m_axis : axi_stream_master_t := new_axi_stream_master(data_length => data_width);
4042
constant s_axis : axi_stream_slave_t := new_axi_stream_slave(data_length => data_width);
4143

44+
constant ibuffer: pkg_c.memory_t := pkg_c.new_memory(0);
45+
constant obuffer: pkg_c.memory_t := pkg_c.new_memory(1);
46+
4247
-- tb signals and variables
4348

4449
signal clk, rst, rstn : std_logic := '0';
4550
signal start, sent, saved : boolean := false;
46-
shared variable ibuffer, obuffer: buffet_t_prot;
4751

4852
begin
4953

@@ -62,8 +66,6 @@ begin
6266
test_runner_setup(runner, runner_cfg);
6367
while test_suite loop
6468
if run("test") then
65-
ibuffer.init(0);
66-
obuffer.init(1);
6769
rst <= '1';
6870
wait for 15*clk_period;
6971
rst <= '0';
@@ -84,7 +86,7 @@ begin
8486

8587
for y in 0 to stream_length-1 loop
8688
wait until rising_edge(clk);
87-
push_axi_stream(net, m_axis, std_logic_vector(to_signed(ibuffer.get(y), data_width)) , tlast => '0');
89+
push_axi_stream(net, m_axis, std_logic_vector(to_signed(pkg_c.read_word(ibuffer, y), data_width)) , tlast => '0');
8890
end loop;
8991

9092
info("m_I sent!");
@@ -104,7 +106,7 @@ begin
104106

105107
for y in 0 to stream_length-1 loop
106108
pop_axi_stream(net, s_axis, tdata => o, tlast => last);
107-
obuffer.set(y,to_integer(signed(o)));
109+
pkg_c.write_word(obuffer, y, to_integer(signed(o)));
108110
end loop;
109111

110112
info("m_O read!");

0 commit comments

Comments
 (0)