Skip to content

Commit 8d09640

Browse files
committed
add clk_pkg
1 parent 4bc7a43 commit 8d09640

3 files changed

Lines changed: 235 additions & 0 deletions

File tree

vunit/vhdl/run/src/clk_handler.vhd

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
library ieee;
2+
use ieee.std_logic_1164.all;
3+
4+
use work.clk_pkg.all;
5+
use work.integer_vector_ptr_pkg.all;
6+
7+
entity clk_handler is
8+
generic (
9+
p: integer_vector_ptr_t;
10+
clks: periods_t := periods_def
11+
);
12+
port (
13+
rst: in std_logic;
14+
clk: out std_logic;
15+
tg: out boolean;
16+
sel: in natural := 2
17+
);
18+
end;
19+
20+
architecture arch of clk_handler is
21+
signal s, x: std_logic := '0';
22+
begin
23+
s <= not s after (clks(sel)/2);
24+
run: process(s)
25+
variable c: clk_t := clk_min;
26+
variable t: clk_t := clk_max;
27+
begin
28+
if rising_edge(s) then
29+
t := get_clk(p);
30+
if rst='1' then
31+
c := clk_min;
32+
elsif c < t then
33+
inc(c);
34+
end if;
35+
end if;
36+
x <= c < t;
37+
clk <= s and c < t;
38+
tg <= rst='0' and c = t;
39+
end process;
40+
end;

vunit/vhdl/run/src/clk_pkg.vhd

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
library ieee;
2+
use ieee.std_logic_1164.all;
3+
4+
use work.integer_vector_ptr_pkg.all;
5+
6+
package clk_pkg is
7+
type periods_t is array (natural range 0 to 7) of time;
8+
9+
constant periods_def: periods_t := (83.3 ns, 50 ns, 20 ns, 16.7 ns, 14.3 ns, 12.5 ns, 11.1 ns, 10 ns);
10+
11+
type clk_t is array (natural range 0 to 1) of integer;
12+
13+
constant clk_min: clk_t := (others => integer'low);
14+
constant clk_max: clk_t := (others => integer'high);
15+
16+
procedure set_clk (
17+
p: integer_vector_ptr_t;
18+
t: clk_t
19+
);
20+
21+
impure function get_clk (
22+
p: integer_vector_ptr_t
23+
) return clk_t;
24+
25+
function to_std_logic (
26+
i: boolean
27+
) return std_logic;
28+
29+
function "+" (
30+
l: clk_t;
31+
i: integer
32+
) return clk_t;
33+
34+
function "<" (
35+
l, r: clk_t
36+
) return boolean;
37+
38+
function "=" (
39+
l, r: clk_t
40+
) return boolean;
41+
42+
function "<" (
43+
l, r: clk_t
44+
) return std_logic;
45+
46+
function "=" (
47+
l, r: clk_t
48+
) return std_logic;
49+
50+
impure function to_string (
51+
t: clk_t
52+
) return string;
53+
54+
procedure inc (
55+
variable t: inout clk_t
56+
);
57+
58+
procedure wait_for (
59+
signal clk: in std_logic;
60+
i: integer
61+
);
62+
63+
procedure wait_load (
64+
constant ptr: integer_vector_ptr_t;
65+
hold: time := 10 ns
66+
);
67+
68+
procedure wait_sync (
69+
constant ptr: integer_vector_ptr_t;
70+
signal condition, trigger: in boolean;
71+
hold: time := 10 ns
72+
);
73+
end package;
74+
75+
package body clk_pkg is
76+
procedure set_clk (
77+
p: integer_vector_ptr_t;
78+
t: clk_t
79+
) is begin
80+
set(p, 0, t(0));
81+
set(p, 1, t(1));
82+
end;
83+
84+
impure function get_clk (
85+
p: integer_vector_ptr_t
86+
) return clk_t is
87+
variable t: clk_t;
88+
begin
89+
t(0) := get(p, 0);
90+
t(1) := get(p, 1);
91+
return t;
92+
end;
93+
94+
function to_std_logic (
95+
i: boolean
96+
) return std_logic is begin
97+
if i then
98+
return '1';
99+
else
100+
return '0';
101+
end if;
102+
end;
103+
104+
function "+" (
105+
l: clk_t;
106+
i: integer
107+
) return clk_t is
108+
variable x: clk_t := (0 => i, 1=> l(1));
109+
begin
110+
if (l(0) > 0) and (i > integer'high-l(0)) then
111+
x(0) := x(0) + integer'low - (integer'high-l(0));
112+
assert x(1) < integer'high report "Cannot add; result out of bounds." severity error;
113+
x(1) := x(1) + 1;
114+
else
115+
x(0) := x(0) + l(0);
116+
end if;
117+
return x;
118+
end;
119+
120+
function "<" (
121+
l, r: clk_t
122+
) return boolean is begin
123+
if l(1) /= r(1) then
124+
return l(1) < r(1);
125+
else
126+
return l(0) < r(0);
127+
end if;
128+
end;
129+
130+
function "=" (
131+
l, r: clk_t
132+
) return boolean is begin
133+
return (l(0) = r(0)) and (l(1) = r(1));
134+
end;
135+
136+
function "<"(l, r: clk_t) return std_logic is begin return to_std_logic(l<r); end;
137+
function "="(l, r: clk_t) return std_logic is begin return to_std_logic(l=r); end;
138+
139+
impure function to_string (
140+
t: clk_t
141+
) return string is begin
142+
return integer'image(t(0)) & " " & integer'image(t(1));
143+
end;
144+
145+
procedure inc (
146+
variable t: inout clk_t
147+
) is begin
148+
if t(0) = integer'high then
149+
t(0) := 0;
150+
if t(1) = integer'high then
151+
t(1) := 0;
152+
else
153+
t(1) := t(1)+1;
154+
end if;
155+
else
156+
t(0) := t(0)+1;
157+
end if;
158+
end;
159+
160+
procedure wait_for (
161+
signal clk: in std_logic;
162+
i: integer
163+
) is begin
164+
for x in 0 to i-1 loop
165+
wait until rising_edge(clk);
166+
end loop;
167+
end;
168+
169+
procedure wait_load (
170+
constant ptr: integer_vector_ptr_t;
171+
hold: time := 10 ns
172+
) is begin
173+
while get(ptr, 3) /= 0 loop
174+
wait for hold;
175+
end loop;
176+
end;
177+
178+
procedure wait_sync (
179+
constant ptr: integer_vector_ptr_t;
180+
signal condition, trigger: in boolean;
181+
hold: time := 10 ns
182+
) is begin
183+
while not condition loop
184+
wait until trigger'event and trigger=true;
185+
if get(ptr, 2) /= 0 then
186+
wait for hold;
187+
set_clk(ptr, get_clk(ptr)+get(ptr, 2));
188+
else
189+
wait until trigger'event and trigger=false;
190+
end if;
191+
end loop;
192+
set(ptr, 3, 2);
193+
end;
194+
end;

vunit/vhdl/vunit_context.vhd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ context vunit_context is
2323
use vunit_lib.run_types_pkg.all;
2424
use vunit_lib.run_pkg.all;
2525
use vunit_lib.run_deprecated_pkg.all;
26+
use vunit_lib.clk_pkg.all;
2627
end context;

0 commit comments

Comments
 (0)