Skip to content

Commit 03c183d

Browse files
committed
uart vc: implement parity on uart_slave
1 parent 99fe60d commit 03c183d

1 file changed

Lines changed: 32 additions & 3 deletions

File tree

vunit/vhdl/verification_components/src/uart_slave.vhd

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ end entity;
2424

2525
architecture a of uart_slave is
2626
signal baud_rate : natural := uart.p_baud_rate;
27+
signal parity : natural := uart.p_parity;
2728
signal local_event : std_logic := '0';
2829
constant data_queue : queue_t := new_queue;
2930
begin
@@ -37,7 +38,8 @@ begin
3738

3839
if msg_type = uart_set_baud_rate_msg then
3940
baud_rate <= pop(msg);
40-
41+
elsif msg_type = uart_set_parity_msg then
42+
parity <= pop(msg);
4143
elsif msg_type = stream_pop_msg then
4244
reply_msg := new_msg;
4345
if not (length(data_queue) > 0) then
@@ -56,9 +58,12 @@ begin
5658
recv : process
5759
procedure uart_recv(variable data : out std_logic_vector;
5860
signal rx : in std_logic;
59-
baud_rate : integer) is
61+
baud_rate : integer;
62+
parity : natural) is
6063
constant time_per_bit : time := (10**9 / baud_rate) * 1 ns;
6164
constant time_per_half_bit : time := (10**9 / (2*baud_rate)) * 1 ns;
65+
variable parity_bit : std_logic;
66+
variable parity_calc : std_logic;
6267
begin
6368
wait for time_per_half_bit; -- middle of start bit
6469
assert rx = not uart.p_idle_state;
@@ -69,13 +74,37 @@ begin
6974
wait for time_per_bit;
7075
end loop;
7176

77+
if parity = 1 then
78+
parity_bit := rx;
79+
parity_calc := odd_parity(data);
80+
wait for 0 ns;
81+
82+
if parity_bit /= parity_calc then
83+
report "odd parity mismatch"
84+
severity WARNING;
85+
end if;
86+
87+
wait for time_per_bit;
88+
elsif parity = 2 then
89+
parity_bit := rx;
90+
parity_calc := even_parity(data);
91+
wait for 0 ns;
92+
93+
if parity_bit /= parity_calc then
94+
report "even parity mismatch"
95+
severity WARNING;
96+
end if;
97+
98+
wait for time_per_bit;
99+
end if;
100+
72101
assert rx = uart.p_idle_state;
73102
end procedure;
74103

75104
variable data : std_logic_vector(uart.p_data_length-1 downto 0);
76105
begin
77106
wait on rx until rx = not uart.p_idle_state;
78-
uart_recv(data, rx, baud_rate);
107+
uart_recv(data, rx, baud_rate, parity);
79108
push_std_ulogic_vector(data_queue, data);
80109
local_event <= '1';
81110
wait for 0 ns;

0 commit comments

Comments
 (0)