Skip to content

Commit 99fe60d

Browse files
committed
uart vc: implement parity on uart_master
1 parent 1197afd commit 99fe60d

2 files changed

Lines changed: 85 additions & 8 deletions

File tree

vunit/vhdl/verification_components/src/uart_master.vhd

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,22 @@ use work.uart_pkg.all;
1717

1818
entity uart_master is
1919
generic (
20-
uart : uart_master_t);
20+
uart : uart_master_t
21+
);
2122
port (
22-
tx : out std_logic := uart.p_idle_state);
23-
end entity;
23+
tx : out std_logic := uart.p_idle_state
24+
);
25+
end entity uart_master;
2426

2527
architecture a of uart_master is
2628
begin
2729

2830
main : process
2931
procedure uart_send(data : std_logic_vector;
3032
signal tx : out std_logic;
31-
baud_rate : integer) is
33+
baud_rate : integer;
34+
parity : natural
35+
) is
3236
constant time_per_bit : time := (10**9 / baud_rate) * 1 ns;
3337

3438
procedure send_bit(value : std_logic) is
@@ -43,11 +47,19 @@ begin
4347
for i in 0 to data'length-1 loop
4448
send_bit(data(i));
4549
end loop;
50+
51+
if parity = 1 then
52+
send_bit(odd_parity(data));
53+
elsif parity = 2 then
54+
send_bit(even_parity(data));
55+
end if;
56+
4657
send_bit(uart.p_idle_state);
4758
end procedure;
4859

4960
variable msg : msg_t;
5061
variable baud_rate : natural := uart.p_baud_rate;
62+
variable parity : natural := uart.p_parity;
5163
variable msg_type : msg_type_t;
5264
begin
5365
receive(net, uart.p_actor, msg);
@@ -56,9 +68,11 @@ begin
5668
handle_sync_message(net, msg_type, msg);
5769

5870
if msg_type = stream_push_msg then
59-
uart_send(pop_std_ulogic_vector(msg), tx, baud_rate);
71+
uart_send(pop_std_ulogic_vector(msg), tx, baud_rate, parity);
6072
elsif msg_type = uart_set_baud_rate_msg then
6173
baud_rate := pop(msg);
74+
elsif msg_type = uart_set_parity_msg then
75+
parity := pop(msg);
6276
else
6377
unexpected_msg_type(msg_type);
6478
end if;

vunit/vhdl/verification_components/src/uart_pkg.vhd

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ package uart_pkg is
1818
type uart_master_t is record
1919
p_actor : actor_t;
2020
p_baud_rate : natural;
21+
p_parity : natural;
2122
p_idle_state : std_logic;
22-
end record;
23+
end record uart_master_t;
2324

2425
type uart_slave_t is record
2526
p_actor : actor_t;
2627
p_baud_rate : natural;
28+
p_parity : natural;
2729
p_idle_state : std_logic;
2830
p_data_length : positive;
2931
end record;
@@ -37,12 +39,25 @@ package uart_pkg is
3739
uart_slave : uart_slave_t;
3840
baud_rate : natural);
3941

42+
-- 0 = no parity, 1 = odd parity, 2 = even parity
43+
procedure set_parity(signal net : inout network_t;
44+
uart_master : uart_master_t;
45+
parity : natural);
46+
47+
procedure set_parity(signal net : inout network_t;
48+
uart_slave : uart_slave_t;
49+
parity : natural);
50+
4051
constant default_baud_rate : natural := 115200;
4152
constant default_idle_state : std_logic := '1';
4253
constant default_data_length : positive := 8;
54+
constant default_parity : natural := 0;
55+
4356
impure function new_uart_master(initial_baud_rate : natural := default_baud_rate;
57+
initial_parity : natural := default_parity;
4458
idle_state : std_logic := default_idle_state) return uart_master_t;
4559
impure function new_uart_slave(initial_baud_rate : natural := default_baud_rate;
60+
initial_parity : natural := default_parity;
4661
idle_state : std_logic := default_idle_state;
4762
data_length : positive := default_data_length) return uart_slave_t;
4863

@@ -52,24 +67,37 @@ package uart_pkg is
5267
impure function as_sync(uart_slave : uart_slave_t) return sync_handle_t;
5368

5469
constant uart_set_baud_rate_msg : msg_type_t := new_msg_type("uart set baud rate");
70+
71+
constant uart_set_parity_msg : msg_type_t := new_msg_type("uart set parity rate");
72+
73+
function even_parity(data : std_logic_vector) return std_logic;
74+
function odd_parity (data : std_logic_vector) return std_logic;
75+
5576
end package;
5677

5778
package body uart_pkg is
5879

5980
impure function new_uart_master(initial_baud_rate : natural := default_baud_rate;
81+
initial_parity : natural := default_parity;
6082
idle_state : std_logic := default_idle_state) return uart_master_t is
6183
begin
6284
return (p_actor => new_actor,
6385
p_baud_rate => initial_baud_rate,
86+
p_parity => initial_parity,
6487
p_idle_state => idle_state);
6588
end;
6689

67-
impure function new_uart_slave(initial_baud_rate : natural := default_baud_rate;
90+
impure function new_uart_slave(
91+
initial_baud_rate : natural := default_baud_rate;
92+
initial_parity : natural := default_parity;
6893
idle_state : std_logic := default_idle_state;
69-
data_length : positive := default_data_length) return uart_slave_t is
94+
data_length : positive := default_data_length
95+
) return uart_slave_t is
96+
7097
begin
7198
return (p_actor => new_actor,
7299
p_baud_rate => initial_baud_rate,
100+
p_parity => initial_parity,
73101
p_idle_state => idle_state,
74102
p_data_length => data_length);
75103
end;
@@ -116,4 +144,39 @@ package body uart_pkg is
116144
begin
117145
set_baud_rate(net, uart_slave.p_actor, baud_rate);
118146
end;
147+
148+
procedure set_parity(signal net : inout network_t;
149+
actor : actor_t;
150+
parity : natural) is
151+
variable msg : msg_t := new_msg(uart_set_parity_msg);
152+
begin
153+
push(msg, parity);
154+
send(net, actor, msg);
155+
end;
156+
157+
procedure set_parity(signal net : inout network_t;
158+
uart_master : uart_master_t;
159+
parity : natural) is
160+
begin
161+
set_parity(net, uart_master.p_actor, parity);
162+
end;
163+
164+
procedure set_parity(signal net : inout network_t;
165+
uart_slave : uart_slave_t;
166+
parity : natural) is
167+
begin
168+
set_parity(net, uart_slave.p_actor, parity);
169+
end;
170+
171+
function even_parity (data : std_logic_vector) return std_logic is
172+
begin
173+
return xor data;
174+
175+
end function even_parity;
176+
177+
function odd_parity (data : std_logic_vector) return std_logic is
178+
begin
179+
180+
return xnor data;
181+
end function odd_parity;
119182
end package body;

0 commit comments

Comments
 (0)