Skip to content

Commit

Permalink
add(examples/vhdl/external_buffer)
Browse files Browse the repository at this point in the history
  • Loading branch information
umarcor committed Apr 20, 2019
1 parent fbd7f3d commit 8bea441
Show file tree
Hide file tree
Showing 4 changed files with 145 additions and 1 deletion.
33 changes: 33 additions & 0 deletions examples/vhdl/external_buffer/run.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
#
# Copyright (c) 2014-2019, Lars Asplund [email protected]

from os import popen, mkdir
from os.path import join, dirname
from vunit import VUnit

std = "2008"
#std = "93"

ui = VUnit.from_argv(vhdl_standard=std)

ui.add_external_arrays([True])

src_path = join(dirname(__file__), "src")

lib = ui.add_library("lib")
lib.add_source_files(join(src_path, "test", "*.vhd"))

try:
mkdir(join(src_path, '..', 'vunit_out'))
except OSError as exc:
pass

c_obj = join(src_path, '..', 'vunit_out', 'main.o')
print(popen('gcc -fPIC -rdynamic -c '+join(src_path, '**', 'main.c')+' -o '+c_obj).read())

ui.set_objects([c_obj])

ui.main()
52 changes: 52 additions & 0 deletions examples/vhdl/external_buffer/src/test/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

extern int ghdl_main (int argc, char **argv);

uint8_t *D[1];

uintptr_t get_addr(uint8_t id) {
//printf("C get_addr(%d): %p\n", id, D[id]);
return (uintptr_t)D[id];
}

void write_byte(uint8_t id, uint32_t i, uint8_t v ) {
//printf("C write_byte(%d, %d): %d\n", id, i, v);
D[id][i] = v;
}

uint8_t read_byte(uint8_t id, uint32_t i) {
//printf("C read_byte(%d, %d): %d\n", id, i, D[id][i]);
return D[id][i];
}

int main(int argc, char **argv) {

const uint32_t length = 5;

D[0] = (uint8_t *) malloc(3*length*sizeof(uint8_t));
if ( D[0] == NULL ) {
perror("execution of malloc() failed!\n");
return -1;
}

int i;
for(i=0; i<length; i++) {
D[0][i] = (i+1)*11;
}

for(i=0; i<3*length; i++) {
printf("%d: %d\n", i, D[0][i]);
}

ghdl_main(argc, argv);

for(i=0; i<3*length; i++) {
printf("%d: %d\n", i, D[0][i]);
}

free(D[0]);

return 0;
}
52 changes: 52 additions & 0 deletions examples/vhdl/external_buffer/src/test/tb_external_buffer.vhd
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this file,
-- You can obtain one at http://mozilla.org/MPL/2.0/.
--
-- Copyright (c) 2014-2019, Lars Asplund [email protected]

--library vunit_lib;
--context vunit_lib.vunit_context;

library vunit_lib;
use vunit_lib.run_pkg.all;
use vunit_lib.logger_pkg.all;
use vunit_lib.byte_vector_ptr_pkg.all;

entity tb_external_buffer is
generic (
runner_cfg : string
);
end entity;

architecture tb of tb_external_buffer is

constant block_len : natural := 5;

constant ebuf: natural := new_byte_vector( 1024, 0, -1); -- external through VHPIDIRECT functions 'read_byte' and 'write_byte'
constant abuf: natural := new_byte_vector( 1024, 0, 1); -- external through access (required VHPIDIRECT function 'get_addr')

begin

main: process
variable val: integer;
begin
test_runner_setup(runner, runner_cfg);
while test_suite loop
if run("test") then
info("Init test");
for x in 0 to block_len-1 loop
val := get(ebuf, x); --report "E get(" & to_string(x) & "): " & to_string(val) severity note;
set(ebuf, block_len+x, val+1); --report "E set(" & to_string(5+x) & "): " & to_string(val) severity note;
end loop;
for x in block_len to 2*block_len-1 loop
val := get(abuf, x); --report "A get(" & to_string(x) & "): " & to_string(val) severity note;
set(abuf, block_len+x, val+2); --report "A set(" & to_string(5+x) & "): " & to_string(val) severity note;
end loop;
info("End test");
end if;
end loop;
test_runner_cleanup(runner);
wait;
end process;

end architecture;
9 changes: 8 additions & 1 deletion vunit/test/acceptance/test_external_run_scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import sys
from vunit import ROOT
from vunit.builtins import VHDL_PATH
from vunit.test.common import has_simulator, check_report, simulator_is
from vunit.test.common import has_simulator, check_report, simulator_is, simulator_check

def simulator_supports_verilog():
"""
Expand Down Expand Up @@ -114,6 +114,13 @@ def test_vhdl_array_axis_vcs_example_project(self):
def test_vhdl_axi_dma_example_project(self):
self.check(join(ROOT, "examples", "vhdl", "axi_dma", "run.py"))

@unittest.skipIf(
simulator_check(lambda simclass: not simclass.supports_vhpi()),
"This simulator/backend does not support interfacing with external C code"
)
def test_vhdl_external_buffer_project(self):
self.check(join(ROOT, "examples", "vhdl", "external_buffer", "run.py"))

def test_vhdl_user_guide_example_project(self):
self.check(join(ROOT, "examples", "vhdl", "user_guide", "run.py"), exit_code=1)
check_report(self.report_file,
Expand Down

0 comments on commit 8bea441

Please sign in to comment.