ghdl: fix llvm backend, add passthru.tests
This commit is contained in:
parent
ac1d24c911
commit
123ec34638
@ -1,4 +1,4 @@
|
|||||||
{ stdenv, fetchFromGitHub, gnat, zlib, llvm, lib
|
{ stdenv, fetchFromGitHub, callPackage, gnat, zlib, llvm, lib
|
||||||
, backend ? "mcode" }:
|
, backend ? "mcode" }:
|
||||||
|
|
||||||
assert backend == "mcode" || backend == "llvm";
|
assert backend == "mcode" || backend == "llvm";
|
||||||
@ -17,6 +17,7 @@ stdenv.mkDerivation rec {
|
|||||||
LIBRARY_PATH = "${stdenv.cc.libc}/lib";
|
LIBRARY_PATH = "${stdenv.cc.libc}/lib";
|
||||||
|
|
||||||
buildInputs = [ gnat zlib ] ++ lib.optional (backend == "llvm") [ llvm ];
|
buildInputs = [ gnat zlib ] ++ lib.optional (backend == "llvm") [ llvm ];
|
||||||
|
propagatedBuildInputs = lib.optionals (backend == "llvm") [ zlib ];
|
||||||
|
|
||||||
preConfigure = ''
|
preConfigure = ''
|
||||||
# If llvm 7.0 works, 7.x releases should work too.
|
# If llvm 7.0 works, 7.x releases should work too.
|
||||||
@ -30,6 +31,15 @@ stdenv.mkDerivation rec {
|
|||||||
|
|
||||||
enableParallelBuilding = true;
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
# run with either of
|
||||||
|
# nix-build -A ghdl-mcode.passthru.tests
|
||||||
|
# nix-build -A ghdl-llvm.passthru.tests
|
||||||
|
tests = {
|
||||||
|
simple = callPackage ./test-simple.nix { inherit backend; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
homepage = "https://github.com/ghdl/ghdl";
|
homepage = "https://github.com/ghdl/ghdl";
|
||||||
description = "VHDL 2008/93/87 simulator";
|
description = "VHDL 2008/93/87 simulator";
|
||||||
|
8
pkgs/development/compilers/ghdl/expected-output.txt
Normal file
8
pkgs/development/compilers/ghdl/expected-output.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
simple-tb.vhd:71:5:@700ms:(report note): 32
|
||||||
|
simple-tb.vhd:71:5:@900ms:(report note): 78
|
||||||
|
simple-tb.vhd:71:5:@1100ms:(report note): 105
|
||||||
|
simple-tb.vhd:71:5:@1300ms:(report note): 120
|
||||||
|
simple-tb.vhd:71:5:@1500ms:(report note): 79
|
||||||
|
simple-tb.vhd:71:5:@1700ms:(report note): 83
|
||||||
|
simple-tb.vhd:71:5:@1900ms:(report note): 32
|
||||||
|
simple-tb.vhd:75:1:@2100ms:(report note): All tests passed.
|
78
pkgs/development/compilers/ghdl/simple-tb.vhd
Normal file
78
pkgs/development/compilers/ghdl/simple-tb.vhd
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
library ieee;
|
||||||
|
use IEEE.STD_LOGIC_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
library STD;
|
||||||
|
use STD.textio.all;
|
||||||
|
|
||||||
|
entity tb is
|
||||||
|
end tb;
|
||||||
|
|
||||||
|
architecture beh of tb is
|
||||||
|
|
||||||
|
component simple
|
||||||
|
port (
|
||||||
|
CLK, RESET : in std_ulogic;
|
||||||
|
DATA_OUT : out std_ulogic_vector(7 downto 0);
|
||||||
|
DONE_OUT : out std_ulogic
|
||||||
|
);
|
||||||
|
end component;
|
||||||
|
|
||||||
|
signal data : std_ulogic_vector(7 downto 0) := "00100000";
|
||||||
|
signal clk : std_ulogic;
|
||||||
|
signal RESET : std_ulogic := '0';
|
||||||
|
signal done : std_ulogic := '0';
|
||||||
|
signal cyclecount : integer := 0;
|
||||||
|
|
||||||
|
constant cycle_time_c : time := 200 ms;
|
||||||
|
constant maxcycles : integer := 100;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
simple1 : simple
|
||||||
|
port map (
|
||||||
|
CLK => clk,
|
||||||
|
RESET => RESET,
|
||||||
|
DATA_OUT => data,
|
||||||
|
DONE_OUT => done
|
||||||
|
);
|
||||||
|
|
||||||
|
clk_process : process
|
||||||
|
begin
|
||||||
|
clk <= '0';
|
||||||
|
wait for cycle_time_c/2;
|
||||||
|
clk <= '1';
|
||||||
|
wait for cycle_time_c/2;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
count_process : process(CLK)
|
||||||
|
begin
|
||||||
|
if (CLK'event and CLK ='1') then
|
||||||
|
if (RESET = '1') then
|
||||||
|
cyclecount <= 0;
|
||||||
|
else
|
||||||
|
cyclecount <= cyclecount + 1;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
test : process
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
RESET <= '1';
|
||||||
|
wait until (clk'event and clk='1');
|
||||||
|
wait until (clk'event and clk='1');
|
||||||
|
RESET <= '0';
|
||||||
|
wait until (clk'event and clk='1');
|
||||||
|
for cyclecnt in 1 to maxcycles loop
|
||||||
|
exit when done = '1';
|
||||||
|
wait until (clk'event and clk='1');
|
||||||
|
report integer'image(to_integer(unsigned(data)));
|
||||||
|
end loop;
|
||||||
|
wait until (clk'event and clk='1');
|
||||||
|
|
||||||
|
report "All tests passed." severity NOTE;
|
||||||
|
wait;
|
||||||
|
end process;
|
||||||
|
end beh;
|
45
pkgs/development/compilers/ghdl/simple.vhd
Normal file
45
pkgs/development/compilers/ghdl/simple.vhd
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
library IEEE;
|
||||||
|
use IEEE.STD_LOGIC_1164.all;
|
||||||
|
use IEEE.NUMERIC_STD.ALL;
|
||||||
|
use IEEE.STD_LOGIC_MISC.or_reduce;
|
||||||
|
|
||||||
|
entity simple is
|
||||||
|
|
||||||
|
port (
|
||||||
|
CLK, RESET : in std_ulogic;
|
||||||
|
DATA_OUT : out std_ulogic_vector(7 downto 0);
|
||||||
|
DONE_OUT : out std_ulogic
|
||||||
|
);
|
||||||
|
end simple;
|
||||||
|
|
||||||
|
architecture beh of simple is
|
||||||
|
|
||||||
|
signal data : std_ulogic_vector(7 downto 0);
|
||||||
|
signal done: std_ulogic;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
proc_ctr : process(CLK)
|
||||||
|
begin
|
||||||
|
if (CLK = '1' and CLK'event) then
|
||||||
|
if (RESET = '1') then
|
||||||
|
data <= "01011111";
|
||||||
|
done <= '0';
|
||||||
|
else
|
||||||
|
case data is
|
||||||
|
when "00100000" => data <= "01001110";
|
||||||
|
when "01001110" => data <= "01101001";
|
||||||
|
when "01101001" => data <= "01111000";
|
||||||
|
when "01111000" => data <= "01001111";
|
||||||
|
when "01001111" => data <= "01010011";
|
||||||
|
when others => data <= "00100000";
|
||||||
|
end case;
|
||||||
|
done <= not or_reduce(data xor "01010011");
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
DATA_OUT <= data;
|
||||||
|
DONE_OUT <= done;
|
||||||
|
|
||||||
|
end beh;
|
23
pkgs/development/compilers/ghdl/test-simple.nix
Normal file
23
pkgs/development/compilers/ghdl/test-simple.nix
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{ stdenv, ghdl-llvm, ghdl-mcode, backend }:
|
||||||
|
|
||||||
|
let
|
||||||
|
ghdl = if backend == "llvm" then ghdl-llvm else ghdl-mcode;
|
||||||
|
in
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "ghdl-test-simple";
|
||||||
|
meta.timeout = 300;
|
||||||
|
nativeBuildInputs = [ ghdl ];
|
||||||
|
buildCommand = ''
|
||||||
|
cp ${./simple.vhd} simple.vhd
|
||||||
|
cp ${./simple-tb.vhd} simple-tb.vhd
|
||||||
|
mkdir -p ghdlwork
|
||||||
|
ghdl -a --workdir=ghdlwork --ieee=synopsys simple.vhd simple-tb.vhd
|
||||||
|
ghdl -e --workdir=ghdlwork --ieee=synopsys -o sim-simple tb
|
||||||
|
'' + (if backend == "llvm" then ''
|
||||||
|
./sim-simple --assert-level=warning > output.txt
|
||||||
|
'' else ''
|
||||||
|
ghdl -r --workdir=ghdlwork --ieee=synopsys tb > output.txt
|
||||||
|
'') + ''
|
||||||
|
diff output.txt ${./expected-output.txt} && touch $out
|
||||||
|
'';
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user