A UVVM EXAMPLE UART TRANSMITTER TESTBENCH SIMULATION on MODELSIM

In the last blog, I showed how to use Modelsim from Vivado and how to compile Xilinx libraries for Modelsim.

https://www.mehmetburakaykenar.com/an-introductory-modelsim-tutorial-for-vivado-xilinx-users/116/

This time I will compile UVVM (Universal VHDL Verification Methodology) library for Modelsim and use util and BFM packages of UVVM to simulate uart_tx.vhd module. You can download uart_tx.vhd file from my github page:

https://github.com/mbaykenar/apis_anatolia/tree/main/VHDL_ile_FPGA_PROGRAMLAMA/ders16

The code is also given below:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity uart_tx is
generic (
c_clkfreq       : integer := 100_000_000;
c_baudrate      : integer := 115_200;
c_stopbit       : integer := 2
);
port (
clk             : in std_logic;
din_i           : in std_logic_vector (7 downto 0);
tx_start_i      : in std_logic;
tx_o            : out std_logic;
tx_done_tick_o  : out std_logic
);
end uart_tx;

architecture Behavioral of uart_tx is

constant c_bittimerlim  : integer := c_clkfreq/c_baudrate;
constant c_stopbitlim   : integer := (c_clkfreq/c_baudrate)*c_stopbit;

type states is (S_IDLE, S_START, S_DATA, S_STOP);
signal state : states := S_IDLE;

signal bittimer : integer range 0 to c_stopbitlim := 0;
signal bitcntr  : integer range 0 to 7 := 0;
signal shreg    : std_logic_vector (7 downto 0) := (others => '0');

begin

P_MAIN : process (clk) begin
if (rising_edge(clk)) then

    case state is
    
        when S_IDLE =>
        
            tx_o            <= '1';
            tx_done_tick_o  <= '0';
            bitcntr         <= 0;
            
            if (tx_start_i = '1') then
                state   <= S_START;
                tx_o    <= '0';
                shreg   <= din_i;
            end if;
        
        when S_START =>
        
            if (bittimer = c_bittimerlim-1) then
                state               <= S_DATA;
                tx_o                <= shreg(0);
                shreg(7)            <= shreg(0);
                shreg(6 downto 0)   <= shreg(7 downto 1);
                bittimer            <= 0;
            else
                bittimer            <= bittimer + 1;
            end if;
            
        when S_DATA =>

            if (bitcntr = 7) then
                if (bittimer = c_bittimerlim-1) then
                    bitcntr             <= 0;
                    state               <= S_STOP;
                    tx_o                <= '1';
                    bittimer            <= 0;
                else
                    bittimer            <= bittimer + 1;                    
                end if;         
            else
                if (bittimer = c_bittimerlim-1) then
                    shreg(7)            <= shreg(0);
                    shreg(6 downto 0)   <= shreg(7 downto 1);                   
                    tx_o                <= shreg(0);
                    bitcntr             <= bitcntr + 1;
                    bittimer            <= 0;
                else
                    bittimer            <= bittimer + 1;                    
                end if;
            end if;
        
        when S_STOP =>
        
            if (bittimer = c_stopbitlim-1) then
                state               <= S_IDLE;
                tx_done_tick_o      <= '1';
                bittimer            <= 0;
            else
                bittimer            <= bittimer + 1;                
            end if;     
    
    end case;

end if;
end process;

end Behavioral;

UVVM is defined in its github page as: UVVM (Universal VHDL Verification Methodology) is a free and Open Source Methodology and Library for making very structured VHDL-based testbenches.

https://github.com/UVVM/UVVM

UVVM developers suggest first starting with UVVM-Lite library, which includes “util” and “bfm” packages:

https://github.com/UVVM/UVVM_Light

In order to compile UVVM library, I opened Modelsim and run the command below as stated in UVVM Lite github page:

cd C:/Verification/UVVM_Light-master/script

do ../script/compile.do C:/Verification/UVVM_Light-master C:/Verification/uvvm_modelsim/uvvm_compiled After do command, Modelsim console gives the output:

# 
# User specified uvvm_light and target directory
# 
# 
# 
# === Compiling UVVM Util to directory: C:/Verification/uvvm_modelsim/uvvm_compiled
# 
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/types_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/adaptations_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/string_methods_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/protected_types_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/global_signals_and_shared_variables_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/hierarchy_linked_list_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/alert_hierarchy_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/license_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/methods_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/bfm_common_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/generic_queue_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/data_queue_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/data_fifo_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/data_stack_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util C:/Verification/UVVM_Light-master/src_util/uvvm_util_context.vhd
# 
# 
# 
# === Compiling UVVM BFMs to directory: C:/Verification/uvvm_modelsim/uvvm_compiled
# 
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/avalon_mm_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/avalon_st_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/axilite_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/axistream_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/axi_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/gmii_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/gpio_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/i2c_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/rgmii_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/sbi_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/spi_bfm_pkg.vhd
# eval vcom -quiet -suppress 1346,1236,1090 -2008 -work uvvm_util  C:/Verification/UVVM_Light-master/src_bfm/uart_bfm_pkg.vhd

In the destination folder:

I added compiled UVVM library folder to modelsim.ini library path:

Then I started a new Modelsim project:

Now after opening new project we can see UVVM library is added to the library listings:

I created a testbench file, only using some functions from util library of UVVM:

library ieee;
use ieee.std_logic_1164.all;

library STD;
use std.env.all;

library uvvm_util;
context uvvm_util.uvvm_util_context;

use std.textio.all;
use std.env.finish;

entity uvvm_test_tb is
end uvvm_test_tb;

architecture sim of uvvm_test_tb is

begin

    ------------------------------------------------
    -- PROCESS: p_main
    ------------------------------------------------
    p_main: process
      constant C_SCOPE     : string  := C_TB_SCOPE_DEFAULT;

      variable v_time_stamp   : time := 0 ns;

    begin

      -- Print the configuration to the log
      report_global_ctrl(VOID);
      report_msg_id_panel(VOID);

      enable_log_msg(ALL_MESSAGES);
      --disable_log_msg(ALL_MESSAGES);
      --enable_log_msg(ID_LOG_HDR);

      log(ID_LOG_HDR, "Start Simulation of TB for IRQC", C_SCOPE);

      --==================================================================================================
      -- Ending the simulation
      --------------------------------------------------------------------------------------
      wait for 1000 ns;             -- to allow some time for completion
      report_alert_counters(FINAL); -- Report final counters and print conclusion for simulation (Success/Fail)
      log(ID_LOG_HDR, "SIMULATION COMPLETED", C_SCOPE);

      -- Finish the simulation
      std.env.stop;
      wait;  -- to stop completely

    end process p_main;

end architecture;

Then I added this file to the Modelsim project:

I compiled the file and run the simulation. The output of the simulation is:

vsim -gui work.uvvm_test_tb
# vsim -gui work.uvvm_test_tb 
# Start time: 23:35:03 on Nov 25,2021
# Loading std.standard
# Loading std.textio(body)
# Loading ieee.std_logic_1164(body)
# Loading std.env(body)
# Loading ieee.numeric_std(body)
# Loading uvvm_util.types_pkg(body)
# Loading uvvm_util.adaptations_pkg(body)
# Loading ieee.math_real(body)
# Loading uvvm_util.string_methods_pkg(body)
# Loading uvvm_util.protected_types_pkg(body)
# Loading uvvm_util.global_signals_and_shared_variables_pkg
# Loading uvvm_util.hierarchy_linked_list_pkg(body)
# Loading uvvm_util.license_pkg(body)
# Loading uvvm_util.alert_hierarchy_pkg(body)
# Loading uvvm_util.methods_pkg(body)
# ** Note: 
# 
# 
# *****************************************************************************************************
#  This is a *** LICENSED PRODUCT *** as given in the LICENSE.TXT in the root directory.
# *****************************************************************************************************
# 
# 
#    Time: 0 ps  Iteration: 0  Region: /methods_pkg File: C:/Verification/UVVM_Light-master/src_util/methods_pkg.vhd
# ** Note: 
# 
# =====================================================================================================
# =====================================================================================================
# This info section may be turned off via C_SHOW_UVVM_UTILITY_LIBRARY_INFO in adaptations_pkg.vhd
# 
# Important Simulator setup: 
# - Set simulator to break on severity 'FAILURE' 
# - Set simulator transcript to a monospace font (e.g. Courier new)
# 
# UVVM Utility Library setup:
# - It is recommended to go through the two powerpoint presentations provided with the download
# - There is a Quick-Reference in the doc-directory
# - In order to change layout or behaviour - please check the src*/adaptations_pkg.vhd
#   This is intended for personal or company customization
# 
# License conditions are given in LICENSE.TXT
# =====================================================================================================
# =====================================================================================================
# 
# 
#    Time: 0 ps  Iteration: 0  Region: /methods_pkg File: C:/Verification/UVVM_Light-master/src_util/methods_pkg.vhd
# Loading uvvm_util.bfm_common_pkg(body)
# Loading work.uvvm_test_tb(sim)
# ** Warning: Design size of 12927 statements exceeds ModelSim-Intel FPGA Starter Edition recommended capacity.
# Expect performance to be adversely affected.

Then I run the simulation:

run -all
# UVVM:      
# UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
# UVVM:      ***  REPORT OF GLOBAL CTRL ***
# UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
# UVVM:                                IGNORE    STOP_LIMIT
# UVVM:                NOTE         :  REGARD         0
# UVVM:                TB_NOTE      :  REGARD         0
# UVVM:                WARNING      :  REGARD         0
# UVVM:                TB_WARNING   :  REGARD         0
# UVVM:                MANUAL_CHECK :  REGARD         0
# UVVM:                ERROR        :  REGARD         1
# UVVM:                TB_ERROR     :  REGARD         1
# UVVM:                FAILURE      :  REGARD         1
# UVVM:                TB_FAILURE   :  REGARD         1
# UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
# UVVM:      
# UVVM:      
# UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
# UVVM:      ***  REPORT OF MSG ID PANEL ***
# UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
# UVVM:                ID                             Status
# UVVM:                ------------------------       ------
# UVVM:                ID_UTIL_BURIED               : DISABLED
# UVVM:                ID_BITVIS_DEBUG              : DISABLED
# UVVM:                ID_UTIL_SETUP                : ENABLED
# UVVM:                ID_LOG_MSG_CTRL              : ENABLED
# UVVM:                ID_ALERT_CTRL                : ENABLED
# UVVM:                ID_FINISH_OR_STOP            : ENABLED
# UVVM:                ID_CLOCK_GEN                 : ENABLED
# UVVM:                ID_GEN_PULSE                 : ENABLED
# UVVM:                ID_BLOCKING                  : ENABLED
# UVVM:                ID_WATCHDOG                  : ENABLED
# UVVM:                ID_POS_ACK                   : ENABLED
# UVVM:                ID_LOG_HDR                   : ENABLED
# UVVM:                ID_LOG_HDR_LARGE             : ENABLED
# UVVM:                ID_LOG_HDR_XL                : ENABLED
# UVVM:                ID_SEQUENCER                 : ENABLED
# UVVM:                ID_SEQUENCER_SUB             : ENABLED
# UVVM:                ID_BFM                       : ENABLED
# UVVM:                ID_BFM_WAIT                  : ENABLED
# UVVM:                ID_BFM_POLL                  : ENABLED
# UVVM:                ID_BFM_POLL_SUMMARY          : ENABLED
# UVVM:                ID_CHANNEL_BFM               : ENABLED
# UVVM:                ID_TERMINATE_CMD             : ENABLED
# UVVM:                ID_SEGMENT_INITIATE          : ENABLED
# UVVM:                ID_SEGMENT_COMPLETE          : ENABLED
# UVVM:                ID_SEGMENT_HDR               : ENABLED
# UVVM:                ID_SEGMENT_DATA              : ENABLED
# UVVM:                ID_PACKET_INITIATE           : ENABLED
# UVVM:                ID_PACKET_PREAMBLE           : ENABLED
# UVVM:                ID_PACKET_COMPLETE           : ENABLED
# UVVM:                ID_PACKET_HDR                : ENABLED
# UVVM:                ID_PACKET_DATA               : ENABLED
# UVVM:                ID_PACKET_CHECKSUM           : ENABLED
# UVVM:                ID_PACKET_GAP                : ENABLED
# UVVM:                ID_FRAME_INITIATE            : ENABLED
# UVVM:                ID_FRAME_COMPLETE            : ENABLED
# UVVM:                ID_FRAME_HDR                 : ENABLED
# UVVM:                ID_FRAME_DATA                : ENABLED
# UVVM:                ID_COVERAGE_MAKEBIN          : DISABLED
# UVVM:                ID_COVERAGE_ADDBIN           : DISABLED
# UVVM:                ID_COVERAGE_ICOVER           : DISABLED
# UVVM:                ID_COVERAGE_CONFIG           : ENABLED
# UVVM:                ID_COVERAGE_SUMMARY          : ENABLED
# UVVM:                ID_COVERAGE_HOLES            : ENABLED
# UVVM:                ID_UVVM_SEND_CMD             : ENABLED
# UVVM:                ID_UVVM_CMD_ACK              : ENABLED
# UVVM:                ID_UVVM_CMD_RESULT           : ENABLED
# UVVM:                ID_CMD_INTERPRETER           : ENABLED
# UVVM:                ID_CMD_INTERPRETER_WAIT      : ENABLED
# UVVM:                ID_IMMEDIATE_CMD             : ENABLED
# UVVM:                ID_IMMEDIATE_CMD_WAIT        : ENABLED
# UVVM:                ID_CMD_EXECUTOR              : ENABLED
# UVVM:                ID_CMD_EXECUTOR_WAIT         : ENABLED
# UVVM:                ID_CHANNEL_EXECUTOR          : ENABLED
# UVVM:                ID_CHANNEL_EXECUTOR_WAIT     : ENABLED
# UVVM:                ID_NEW_HVVC_CMD_SEQ          : ENABLED
# UVVM:                ID_INSERTED_DELAY            : ENABLED
# UVVM:                ID_OLD_AWAIT_COMPLETION      : ENABLED
# UVVM:                ID_AWAIT_COMPLETION          : ENABLED
# UVVM:                ID_AWAIT_COMPLETION_LIST     : ENABLED
# UVVM:                ID_AWAIT_COMPLETION_WAIT     : ENABLED
# UVVM:                ID_AWAIT_COMPLETION_END      : ENABLED
# UVVM:                ID_UVVM_DATA_QUEUE           : ENABLED
# UVVM:                ID_CONSTRUCTOR               : ENABLED
# UVVM:                ID_CONSTRUCTOR_SUB           : ENABLED
# UVVM:                ID_VVC_ACTIVITY              : ENABLED
# UVVM:                ID_MONITOR                   : ENABLED
# UVVM:                ID_MONITOR_ERROR             : ENABLED
# UVVM:                ID_DATA                      : ENABLED
# UVVM:                ID_CTRL                      : ENABLED
# UVVM:                ID_FILE_OPEN_CLOSE           : ENABLED
# UVVM:                ID_FILE_PARSER               : ENABLED
# UVVM:                ID_SPEC_COV                  : ENABLED
# UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
# UVVM:      
# UVVM: ID_LOG_MSG_CTRL                    0.0 ns  TB seq.                        enable_log_msg(ALL_MESSAGES). 
# UVVM: 
# UVVM: 
# UVVM: ID_LOG_HDR                         0.0 ns  TB seq.                        Start Simulation of TB for IRQC
# UVVM: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# UVVM:      
# UVVM:      ====================================================================================================================================================================
# UVVM:      *** FINAL SUMMARY OF ALL ALERTS ***
# UVVM:      ====================================================================================================================================================================
# UVVM:                                REGARDED   EXPECTED  IGNORED      Comment?
# UVVM:                NOTE         :      0         0         0         ok
# UVVM:                TB_NOTE      :      0         0         0         ok
# UVVM:                WARNING      :      0         0         0         ok
# UVVM:                TB_WARNING   :      0         0         0         ok
# UVVM:                MANUAL_CHECK :      0         0         0         ok
# UVVM:                ERROR        :      0         0         0         ok
# UVVM:                TB_ERROR     :      0         0         0         ok
# UVVM:                FAILURE      :      0         0         0         ok
# UVVM:                TB_FAILURE   :      0         0         0         ok
# UVVM:      ====================================================================================================================================================================
# UVVM:      >> Simulation SUCCESS: No mismatch between counted and expected serious alerts
# UVVM:      ====================================================================================================================================================================
# UVVM:      
# UVVM:      
# UVVM: 
# UVVM: 
# UVVM: ID_LOG_HDR                      1000.0 ns  TB seq.                        SIMULATION COMPLETED
# UVVM: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# Break in Process p_main at C:/Verification/SimWorkspace/uvvm_test/work/uvvm_test.vhd line 48

Therefore, it is understood that we compiled UVVM util library successfully.

Now it is time to test our uart_tx module. I created a new project in Modelsim named uart_tx:

Then I added uart_tx.vhd file to the project as an existing file and did not copy file:

Then I created a VHDL file and added to the project named tb_uart_tx.vhd, which will create stimulus for uart_tx module and check if the module is working properly.

At the start of testbench file library definitions and usages are included:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

library STD;
use std.env.all;

library uvvm_util;
context uvvm_util.uvvm_util_context;

use uvvm_util.uart_bfm_pkg.all;

use std.textio.all;
use std.env.finish;

The constants and signals are defined:

entity tb_uart_tx is
end tb_uart_tx;

architecture sim of tb_uart_tx is

-- CONSTANTS
constant c_clkperiod                : time := 10 ns;
constant c_clkfreq                  : integer := 100_000_000;
constant c_clock_high_percentage    : integer := 50;

signal clk                  : std_logic := '0';
signal din_i                : std_logic_vector (7 downto 0) := (others => '0');
signal tx_start_i           : std_logic := '0';
signal tx_o                 : std_logic;
signal tx_done_tick_o       : std_logic;

signal uart_bfm_config      : t_uart_bfm_config := C_UART_BFM_CONFIG_DEFAULT;
signal terminate_loop       : std_logic := '0';

I instantiated the DUT (design under test) module:

begin

DUT : entity work.uart_tx 
generic map(
c_clkfreq       => c_clkfreq,
c_baudrate      => 115_200,
c_stopbit       => 1
)
port map (
clk             => clk          ,
din_i           => din_i        ,
tx_start_i      => tx_start_i   ,
tx_o            => tx_o         ,
tx_done_tick_o  => tx_done_tick_o
);

Then I used clock_generator function, which is defined in methods_pkg package:

-----------------------------------------------------------------------------
-- Clock Generator
-----------------------------------------------------------------------------
clock_generator(clk, c_clkperiod, c_clock_high_percentage);

In the main stimulus process block, constant and variable definitions:

------------------------------------------------
-- PROCESS: p_main
------------------------------------------------
p_main: process
    constant C_SCOPE        : string  := C_TB_SCOPE_DEFAULT;
    variable v_time_stamp   : time := 0 ns;
    variable recv_byte      : std_logic_vector (7 downto 0) := (others => '0');
begin

Then I initialized uart configurations:

-- uart initializations
    uart_bfm_config.bit_time            <= 8.68055 us;
    uart_bfm_config.num_data_bits       <= 8;
    uart_bfm_config.idle_state          <= '1';
    uart_bfm_config.num_stop_bits       <= STOP_BITS_ONE;
    uart_bfm_config.parity              <= PARITY_NONE;
    uart_bfm_config.timeout             <= 0 ns;
    uart_bfm_config.timeout_severity    <= error;
    wait for 1 ps;

These lines are just copied from demo testbench of UVVM:

    -- Print the configuration to the log
    report_global_ctrl(VOID);
    report_msg_id_panel(VOID);

    enable_log_msg(ALL_MESSAGES);
    --disable_log_msg(ALL_MESSAGES);
    --enable_log_msg(ID_LOG_HDR);

    log(ID_LOG_HDR, "Start Simulation of TB for UART_TX", C_SCOPE);

Then I added a for loop to transmit 256 bytes of data and receive this uart data using uart_receive function, which is defined in uart_bfm_pkg package of UVVM. I also used check_value function to compare transmitted and received data. This function is defined in methods_pkg package of UVVM:

    for i in 0 to 255 loop
        din_i       <= CONV_STD_LOGIC_VECTOR(i,8);
        tx_start_i  <= '1';
        uart_receive(
            recv_byte,              -- data_value                          
            "data received",        -- msg                            
            tx_o,                   -- rx
            terminate_loop,         -- terminate_loop
            uart_bfm_config,        -- config
            C_SCOPE,                -- scope
            shared_msg_id_panel,    -- msg_id_panel
            ""                      -- ext_proc_call
        );
        wait for c_clkperiod;
        tx_start_i  <= '0';
        wait until rising_edge(tx_done_tick_o);
        check_value(CONV_STD_LOGIC_VECTOR(i,8), recv_byte, ERROR, "Transmit byte = " & to_string(din_i,HEX) & " Received byte = " & to_string(recv_byte,HEX));
        wait for 1 ps;
    end loop;

These lines are also copied from demo testbench file of UVVM:

    --==================================================================================================
    -- Ending the simulation
    --------------------------------------------------------------------------------------
    wait for 1000 ns;             -- to allow some time for completion
    report_alert_counters(FINAL); -- Report final counters and print conclusion for simulation (Success/Fail)
    log(ID_LOG_HDR, "SIMULATION COMPLETED", C_SCOPE);

    -- Finish the simulation
    std.env.stop;
    wait;  -- to stop completely

end process p_main;

end architecture;

I compiled and run the simulation with this testbench file. UVVM creates 2 files named _Alert.txt and _Log.txt. All the text written at the console of the Modelsim is saved in _Log.txt file. Alert related text is saved in _Alert.txt file. The content of the _Alert.txt file can be found in _Log.txt file also. Here is the content of the _Log.txt file:

UVVM:      
UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
UVVM:      ***  REPORT OF GLOBAL CTRL ***
UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
UVVM:                                IGNORE    STOP_LIMIT
UVVM:                NOTE         :  REGARD         0
UVVM:                TB_NOTE      :  REGARD         0
UVVM:                WARNING      :  REGARD         0
UVVM:                TB_WARNING   :  REGARD         0
UVVM:                MANUAL_CHECK :  REGARD         0
UVVM:                ERROR        :  REGARD         1
UVVM:                TB_ERROR     :  REGARD         1
UVVM:                FAILURE      :  REGARD         1
UVVM:                TB_FAILURE   :  REGARD         1
UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
UVVM:      
UVVM:      
UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
UVVM:      ***  REPORT OF MSG ID PANEL ***
UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
UVVM:                ID                             Status
UVVM:                ------------------------       ------
UVVM:                ID_UTIL_BURIED               : DISABLED
UVVM:                ID_BITVIS_DEBUG              : DISABLED
UVVM:                ID_UTIL_SETUP                : ENABLED
UVVM:                ID_LOG_MSG_CTRL              : ENABLED
UVVM:                ID_ALERT_CTRL                : ENABLED
UVVM:                ID_FINISH_OR_STOP            : ENABLED
UVVM:                ID_CLOCK_GEN                 : ENABLED
UVVM:                ID_GEN_PULSE                 : ENABLED
UVVM:                ID_BLOCKING                  : ENABLED
UVVM:                ID_WATCHDOG                  : ENABLED
UVVM:                ID_POS_ACK                   : ENABLED
UVVM:                ID_LOG_HDR                   : ENABLED
UVVM:                ID_LOG_HDR_LARGE             : ENABLED
UVVM:                ID_LOG_HDR_XL                : ENABLED
UVVM:                ID_SEQUENCER                 : ENABLED
UVVM:                ID_SEQUENCER_SUB             : ENABLED
UVVM:                ID_BFM                       : ENABLED
UVVM:                ID_BFM_WAIT                  : ENABLED
UVVM:                ID_BFM_POLL                  : ENABLED
UVVM:                ID_BFM_POLL_SUMMARY          : ENABLED
UVVM:                ID_CHANNEL_BFM               : ENABLED
UVVM:                ID_TERMINATE_CMD             : ENABLED
UVVM:                ID_SEGMENT_INITIATE          : ENABLED
UVVM:                ID_SEGMENT_COMPLETE          : ENABLED
UVVM:                ID_SEGMENT_HDR               : ENABLED
UVVM:                ID_SEGMENT_DATA              : ENABLED
UVVM:                ID_PACKET_INITIATE           : ENABLED
UVVM:                ID_PACKET_PREAMBLE           : ENABLED
UVVM:                ID_PACKET_COMPLETE           : ENABLED
UVVM:                ID_PACKET_HDR                : ENABLED
UVVM:                ID_PACKET_DATA               : ENABLED
UVVM:                ID_PACKET_CHECKSUM           : ENABLED
UVVM:                ID_PACKET_GAP                : ENABLED
UVVM:                ID_FRAME_INITIATE            : ENABLED
UVVM:                ID_FRAME_COMPLETE            : ENABLED
UVVM:                ID_FRAME_HDR                 : ENABLED
UVVM:                ID_FRAME_DATA                : ENABLED
UVVM:                ID_COVERAGE_MAKEBIN          : DISABLED
UVVM:                ID_COVERAGE_ADDBIN           : DISABLED
UVVM:                ID_COVERAGE_ICOVER           : DISABLED
UVVM:                ID_COVERAGE_CONFIG           : ENABLED
UVVM:                ID_COVERAGE_SUMMARY          : ENABLED
UVVM:                ID_COVERAGE_HOLES            : ENABLED
UVVM:                ID_UVVM_SEND_CMD             : ENABLED
UVVM:                ID_UVVM_CMD_ACK              : ENABLED
UVVM:                ID_UVVM_CMD_RESULT           : ENABLED
UVVM:                ID_CMD_INTERPRETER           : ENABLED
UVVM:                ID_CMD_INTERPRETER_WAIT      : ENABLED
UVVM:                ID_IMMEDIATE_CMD             : ENABLED
UVVM:                ID_IMMEDIATE_CMD_WAIT        : ENABLED
UVVM:                ID_CMD_EXECUTOR              : ENABLED
UVVM:                ID_CMD_EXECUTOR_WAIT         : ENABLED
UVVM:                ID_CHANNEL_EXECUTOR          : ENABLED
UVVM:                ID_CHANNEL_EXECUTOR_WAIT     : ENABLED
UVVM:                ID_NEW_HVVC_CMD_SEQ          : ENABLED
UVVM:                ID_INSERTED_DELAY            : ENABLED
UVVM:                ID_OLD_AWAIT_COMPLETION      : ENABLED
UVVM:                ID_AWAIT_COMPLETION          : ENABLED
UVVM:                ID_AWAIT_COMPLETION_LIST     : ENABLED
UVVM:                ID_AWAIT_COMPLETION_WAIT     : ENABLED
UVVM:                ID_AWAIT_COMPLETION_END      : ENABLED
UVVM:                ID_UVVM_DATA_QUEUE           : ENABLED
UVVM:                ID_CONSTRUCTOR               : ENABLED
UVVM:                ID_CONSTRUCTOR_SUB           : ENABLED
UVVM:                ID_VVC_ACTIVITY              : ENABLED
UVVM:                ID_MONITOR                   : ENABLED
UVVM:                ID_MONITOR_ERROR             : ENABLED
UVVM:                ID_DATA                      : ENABLED
UVVM:                ID_CTRL                      : ENABLED
UVVM:                ID_FILE_OPEN_CLOSE           : ENABLED
UVVM:                ID_FILE_PARSER               : ENABLED
UVVM:                ID_SPEC_COV                  : ENABLED
UVVM:      --------------------------------------------------------------------------------------------------------------------------------------------------------------------
UVVM:      
UVVM: 
UVVM: ***  TB_WARNING #1  ***
UVVM:         0.001 ns   (Util buried)
UVVM:                    Time stamp has been truncated to 1 decimal(s) in the next log message - settable in adaptations_pkg. (Actual time stamp has more decimals than
UVVM:                    displayed) 
UVVM:                    This alert is shown once only.
UVVM: 
UVVM: ID_LOG_MSG_CTRL                    0.0 ns  TB seq.                        enable_log_msg(ALL_MESSAGES). 
UVVM: 
UVVM: 
UVVM: ID_LOG_HDR                         0.0 ns  TB seq.                        Start Simulation of TB for UART_TX
UVVM: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
UVVM: ID_BFM                         82475.2 ns  TB seq.                        uart_receive()=> x"00". 'data received'
UVVM: ID_POS_ACK                     86810.0 ns  TB seq.                        check_value() => OK, for slv x"00"'. 'Transmit byte = 00 Received byte = 00'
UVVM: ID_BFM                        169285.2 ns  TB seq.                        uart_receive()=> x"1". 'data received'
UVVM: ID_POS_ACK                    173620.0 ns  TB seq.                        check_value() => OK, for slv x"01"'. 'Transmit byte = 01 Received byte = 01'
UVVM: ID_BFM                        256095.2 ns  TB seq.                        uart_receive()=> x"2". 'data received'
UVVM: ID_POS_ACK                    260430.0 ns  TB seq.                        check_value() => OK, for slv x"02"'. 'Transmit byte = 02 Received byte = 02'
UVVM: ID_BFM                        342905.2 ns  TB seq.                        uart_receive()=> x"3". 'data received'
UVVM: ID_POS_ACK                    347240.0 ns  TB seq.                        check_value() => OK, for slv x"03"'. 'Transmit byte = 03 Received byte = 03'
UVVM: ID_BFM                        429715.2 ns  TB seq.                        uart_receive()=> x"4". 'data received'
UVVM: ID_POS_ACK                    434050.0 ns  TB seq.                        check_value() => OK, for slv x"04"'. 'Transmit byte = 04 Received byte = 04'
UVVM: ID_BFM                        516525.2 ns  TB seq.                        uart_receive()=> x"5". 'data received'
UVVM: ID_POS_ACK                    520860.0 ns  TB seq.                        check_value() => OK, for slv x"05"'. 'Transmit byte = 05 Received byte = 05'
UVVM: ID_BFM                        603335.2 ns  TB seq.                        uart_receive()=> x"6". 'data received'
UVVM: ID_POS_ACK                    607670.0 ns  TB seq.                        check_value() => OK, for slv x"06"'. 'Transmit byte = 06 Received byte = 06'
UVVM: ID_BFM                        690145.2 ns  TB seq.                        uart_receive()=> x"7". 'data received'
UVVM: ID_POS_ACK                    694480.0 ns  TB seq.                        check_value() => OK, for slv x"07"'. 'Transmit byte = 07 Received byte = 07'
UVVM: ID_BFM                        776955.2 ns  TB seq.                        uart_receive()=> x"8". 'data received'
UVVM: ID_POS_ACK                    781290.0 ns  TB seq.                        check_value() => OK, for slv x"08"'. 'Transmit byte = 08 Received byte = 08'
UVVM: ID_BFM                        863765.2 ns  TB seq.                        uart_receive()=> x"9". 'data received'
UVVM: ID_POS_ACK                    868100.0 ns  TB seq.                        check_value() => OK, for slv x"09"'. 'Transmit byte = 09 Received byte = 09'
UVVM: ID_BFM                        950575.2 ns  TB seq.                        uart_receive()=> x"A". 'data received'
UVVM: ID_POS_ACK                    954910.0 ns  TB seq.                        check_value() => OK, for slv x"0A"'. 'Transmit byte = 0A Received byte = 0A'
UVVM: ID_BFM                       1037385.2 ns  TB seq.                        uart_receive()=> x"B". 'data received'
UVVM: ID_POS_ACK                   1041720.0 ns  TB seq.                        check_value() => OK, for slv x"0B"'. 'Transmit byte = 0B Received byte = 0B'
UVVM: ID_BFM                       1124195.2 ns  TB seq.                        uart_receive()=> x"C". 'data received'
UVVM: ID_POS_ACK                   1128530.0 ns  TB seq.                        check_value() => OK, for slv x"0C"'. 'Transmit byte = 0C Received byte = 0C'
UVVM: ID_BFM                       1211005.2 ns  TB seq.                        uart_receive()=> x"D". 'data received'
UVVM: ID_POS_ACK                   1215340.0 ns  TB seq.                        check_value() => OK, for slv x"0D"'. 'Transmit byte = 0D Received byte = 0D'
UVVM: ID_BFM                       1297815.2 ns  TB seq.                        uart_receive()=> x"E". 'data received'
UVVM: ID_POS_ACK                   1302150.0 ns  TB seq.                        check_value() => OK, for slv x"0E"'. 'Transmit byte = 0E Received byte = 0E'
UVVM: ID_BFM                       1384625.2 ns  TB seq.                        uart_receive()=> x"F". 'data received'
UVVM: ID_POS_ACK                   1388960.0 ns  TB seq.                        check_value() => OK, for slv x"0F"'. 'Transmit byte = 0F Received byte = 0F'
UVVM: ID_BFM                       1471435.2 ns  TB seq.                        uart_receive()=> x"10". 'data received'
UVVM: ID_POS_ACK                   1475770.0 ns  TB seq.                        check_value() => OK, for slv x"10"'. 'Transmit byte = 10 Received byte = 10'
UVVM: ID_BFM                       1558245.2 ns  TB seq.                        uart_receive()=> x"11". 'data received'
UVVM: ID_POS_ACK                   1562580.0 ns  TB seq.                        check_value() => OK, for slv x"11"'. 'Transmit byte = 11 Received byte = 11'
UVVM: ID_BFM                       1645055.2 ns  TB seq.                        uart_receive()=> x"12". 'data received'
UVVM: ID_POS_ACK                   1649390.0 ns  TB seq.                        check_value() => OK, for slv x"12"'. 'Transmit byte = 12 Received byte = 12'
UVVM: ID_BFM                       1731865.2 ns  TB seq.                        uart_receive()=> x"13". 'data received'
UVVM: ID_POS_ACK                   1736200.0 ns  TB seq.                        check_value() => OK, for slv x"13"'. 'Transmit byte = 13 Received byte = 13'
UVVM: ID_BFM                       1818675.2 ns  TB seq.                        uart_receive()=> x"14". 'data received'
UVVM: ID_POS_ACK                   1823010.0 ns  TB seq.                        check_value() => OK, for slv x"14"'. 'Transmit byte = 14 Received byte = 14'
UVVM: ID_BFM                       1905485.2 ns  TB seq.                        uart_receive()=> x"15". 'data received'
UVVM: ID_POS_ACK                   1909820.0 ns  TB seq.                        check_value() => OK, for slv x"15"'. 'Transmit byte = 15 Received byte = 15'
UVVM: ID_BFM                       1992295.2 ns  TB seq.                        uart_receive()=> x"16". 'data received'
UVVM: ID_POS_ACK                   1996630.0 ns  TB seq.                        check_value() => OK, for slv x"16"'. 'Transmit byte = 16 Received byte = 16'
UVVM: ID_BFM                       2079105.2 ns  TB seq.                        uart_receive()=> x"17". 'data received'
UVVM: ID_POS_ACK                   2083440.0 ns  TB seq.                        check_value() => OK, for slv x"17"'. 'Transmit byte = 17 Received byte = 17'
UVVM: ID_BFM                       2165915.2 ns  TB seq.                        uart_receive()=> x"18". 'data received'
UVVM: ID_POS_ACK                   2170250.0 ns  TB seq.                        check_value() => OK, for slv x"18"'. 'Transmit byte = 18 Received byte = 18'
UVVM: ID_BFM                       2252725.2 ns  TB seq.                        uart_receive()=> x"19". 'data received'
UVVM: ID_POS_ACK                   2257060.0 ns  TB seq.                        check_value() => OK, for slv x"19"'. 'Transmit byte = 19 Received byte = 19'
UVVM: ID_BFM                       2339535.2 ns  TB seq.                        uart_receive()=> x"1A". 'data received'
UVVM: ID_POS_ACK                   2343870.0 ns  TB seq.                        check_value() => OK, for slv x"1A"'. 'Transmit byte = 1A Received byte = 1A'
UVVM: ID_BFM                       2426345.2 ns  TB seq.                        uart_receive()=> x"1B". 'data received'
UVVM: ID_POS_ACK                   2430680.0 ns  TB seq.                        check_value() => OK, for slv x"1B"'. 'Transmit byte = 1B Received byte = 1B'
UVVM: ID_BFM                       2513155.2 ns  TB seq.                        uart_receive()=> x"1C". 'data received'
UVVM: ID_POS_ACK                   2517490.0 ns  TB seq.                        check_value() => OK, for slv x"1C"'. 'Transmit byte = 1C Received byte = 1C'
UVVM: ID_BFM                       2599965.2 ns  TB seq.                        uart_receive()=> x"1D". 'data received'
UVVM: ID_POS_ACK                   2604300.0 ns  TB seq.                        check_value() => OK, for slv x"1D"'. 'Transmit byte = 1D Received byte = 1D'
UVVM: ID_BFM                       2686775.2 ns  TB seq.                        uart_receive()=> x"1E". 'data received'
UVVM: ID_POS_ACK                   2691110.0 ns  TB seq.                        check_value() => OK, for slv x"1E"'. 'Transmit byte = 1E Received byte = 1E'
UVVM: ID_BFM                       2773585.2 ns  TB seq.                        uart_receive()=> x"1F". 'data received'
UVVM: ID_POS_ACK                   2777920.0 ns  TB seq.                        check_value() => OK, for slv x"1F"'. 'Transmit byte = 1F Received byte = 1F'
UVVM: ID_BFM                       2860395.2 ns  TB seq.                        uart_receive()=> x"20". 'data received'
UVVM: ID_POS_ACK                   2864730.0 ns  TB seq.                        check_value() => OK, for slv x"20"'. 'Transmit byte = 20 Received byte = 20'
UVVM: ID_BFM                       2947205.2 ns  TB seq.                        uart_receive()=> x"21". 'data received'
UVVM: ID_POS_ACK                   2951540.0 ns  TB seq.                        check_value() => OK, for slv x"21"'. 'Transmit byte = 21 Received byte = 21'
UVVM: ID_BFM                       3034015.2 ns  TB seq.                        uart_receive()=> x"22". 'data received'
UVVM: ID_POS_ACK                   3038350.0 ns  TB seq.                        check_value() => OK, for slv x"22"'. 'Transmit byte = 22 Received byte = 22'
UVVM: ID_BFM                       3120825.2 ns  TB seq.                        uart_receive()=> x"23". 'data received'
UVVM: ID_POS_ACK                   3125160.0 ns  TB seq.                        check_value() => OK, for slv x"23"'. 'Transmit byte = 23 Received byte = 23'
UVVM: ID_BFM                       3207635.2 ns  TB seq.                        uart_receive()=> x"24". 'data received'
UVVM: ID_POS_ACK                   3211970.0 ns  TB seq.                        check_value() => OK, for slv x"24"'. 'Transmit byte = 24 Received byte = 24'
UVVM: ID_BFM                       3294445.2 ns  TB seq.                        uart_receive()=> x"25". 'data received'
UVVM: ID_POS_ACK                   3298780.0 ns  TB seq.                        check_value() => OK, for slv x"25"'. 'Transmit byte = 25 Received byte = 25'
UVVM: ID_BFM                       3381255.2 ns  TB seq.                        uart_receive()=> x"26". 'data received'
UVVM: ID_POS_ACK                   3385590.0 ns  TB seq.                        check_value() => OK, for slv x"26"'. 'Transmit byte = 26 Received byte = 26'
UVVM: ID_BFM                       3468065.2 ns  TB seq.                        uart_receive()=> x"27". 'data received'
UVVM: ID_POS_ACK                   3472400.0 ns  TB seq.                        check_value() => OK, for slv x"27"'. 'Transmit byte = 27 Received byte = 27'
UVVM: ID_BFM                       3554875.2 ns  TB seq.                        uart_receive()=> x"28". 'data received'
UVVM: ID_POS_ACK                   3559210.0 ns  TB seq.                        check_value() => OK, for slv x"28"'. 'Transmit byte = 28 Received byte = 28'
UVVM: ID_BFM                       3641685.2 ns  TB seq.                        uart_receive()=> x"29". 'data received'
UVVM: ID_POS_ACK                   3646020.0 ns  TB seq.                        check_value() => OK, for slv x"29"'. 'Transmit byte = 29 Received byte = 29'
UVVM: ID_BFM                       3728495.2 ns  TB seq.                        uart_receive()=> x"2A". 'data received'
UVVM: ID_POS_ACK                   3732830.0 ns  TB seq.                        check_value() => OK, for slv x"2A"'. 'Transmit byte = 2A Received byte = 2A'
UVVM: ID_BFM                       3815305.2 ns  TB seq.                        uart_receive()=> x"2B". 'data received'
UVVM: ID_POS_ACK                   3819640.0 ns  TB seq.                        check_value() => OK, for slv x"2B"'. 'Transmit byte = 2B Received byte = 2B'
UVVM: ID_BFM                       3902115.2 ns  TB seq.                        uart_receive()=> x"2C". 'data received'
UVVM: ID_POS_ACK                   3906450.0 ns  TB seq.                        check_value() => OK, for slv x"2C"'. 'Transmit byte = 2C Received byte = 2C'
UVVM: ID_BFM                       3988925.2 ns  TB seq.                        uart_receive()=> x"2D". 'data received'
UVVM: ID_POS_ACK                   3993260.0 ns  TB seq.                        check_value() => OK, for slv x"2D"'. 'Transmit byte = 2D Received byte = 2D'
UVVM: ID_BFM                       4075735.2 ns  TB seq.                        uart_receive()=> x"2E". 'data received'
UVVM: ID_POS_ACK                   4080070.0 ns  TB seq.                        check_value() => OK, for slv x"2E"'. 'Transmit byte = 2E Received byte = 2E'
UVVM: ID_BFM                       4162545.2 ns  TB seq.                        uart_receive()=> x"2F". 'data received'
UVVM: ID_POS_ACK                   4166880.0 ns  TB seq.                        check_value() => OK, for slv x"2F"'. 'Transmit byte = 2F Received byte = 2F'
UVVM: ID_BFM                       4249355.2 ns  TB seq.                        uart_receive()=> x"30". 'data received'
UVVM: ID_POS_ACK                   4253690.0 ns  TB seq.                        check_value() => OK, for slv x"30"'. 'Transmit byte = 30 Received byte = 30'
UVVM: ID_BFM                       4336165.2 ns  TB seq.                        uart_receive()=> x"31". 'data received'
UVVM: ID_POS_ACK                   4340500.0 ns  TB seq.                        check_value() => OK, for slv x"31"'. 'Transmit byte = 31 Received byte = 31'
UVVM: ID_BFM                       4422975.2 ns  TB seq.                        uart_receive()=> x"32". 'data received'
UVVM: ID_POS_ACK                   4427310.0 ns  TB seq.                        check_value() => OK, for slv x"32"'. 'Transmit byte = 32 Received byte = 32'
UVVM: ID_BFM                       4509785.2 ns  TB seq.                        uart_receive()=> x"33". 'data received'
UVVM: ID_POS_ACK                   4514120.0 ns  TB seq.                        check_value() => OK, for slv x"33"'. 'Transmit byte = 33 Received byte = 33'
UVVM: ID_BFM                       4596595.2 ns  TB seq.                        uart_receive()=> x"34". 'data received'
UVVM: ID_POS_ACK                   4600930.0 ns  TB seq.                        check_value() => OK, for slv x"34"'. 'Transmit byte = 34 Received byte = 34'
UVVM: ID_BFM                       4683405.2 ns  TB seq.                        uart_receive()=> x"35". 'data received'
UVVM: ID_POS_ACK                   4687740.0 ns  TB seq.                        check_value() => OK, for slv x"35"'. 'Transmit byte = 35 Received byte = 35'
UVVM: ID_BFM                       4770215.2 ns  TB seq.                        uart_receive()=> x"36". 'data received'
UVVM: ID_POS_ACK                   4774550.0 ns  TB seq.                        check_value() => OK, for slv x"36"'. 'Transmit byte = 36 Received byte = 36'
UVVM: ID_BFM                       4857025.2 ns  TB seq.                        uart_receive()=> x"37". 'data received'
UVVM: ID_POS_ACK                   4861360.0 ns  TB seq.                        check_value() => OK, for slv x"37"'. 'Transmit byte = 37 Received byte = 37'
UVVM: ID_BFM                       4943835.2 ns  TB seq.                        uart_receive()=> x"38". 'data received'
UVVM: ID_POS_ACK                   4948170.0 ns  TB seq.                        check_value() => OK, for slv x"38"'. 'Transmit byte = 38 Received byte = 38'
UVVM: ID_BFM                       5030645.2 ns  TB seq.                        uart_receive()=> x"39". 'data received'
UVVM: ID_POS_ACK                   5034980.0 ns  TB seq.                        check_value() => OK, for slv x"39"'. 'Transmit byte = 39 Received byte = 39'
UVVM: ID_BFM                       5117455.2 ns  TB seq.                        uart_receive()=> x"3A". 'data received'
UVVM: ID_POS_ACK                   5121790.0 ns  TB seq.                        check_value() => OK, for slv x"3A"'. 'Transmit byte = 3A Received byte = 3A'
UVVM: ID_BFM                       5204265.2 ns  TB seq.                        uart_receive()=> x"3B". 'data received'
UVVM: ID_POS_ACK                   5208600.0 ns  TB seq.                        check_value() => OK, for slv x"3B"'. 'Transmit byte = 3B Received byte = 3B'
UVVM: ID_BFM                       5291075.2 ns  TB seq.                        uart_receive()=> x"3C". 'data received'
UVVM: ID_POS_ACK                   5295410.0 ns  TB seq.                        check_value() => OK, for slv x"3C"'. 'Transmit byte = 3C Received byte = 3C'
UVVM: ID_BFM                       5377885.2 ns  TB seq.                        uart_receive()=> x"3D". 'data received'
UVVM: ID_POS_ACK                   5382220.0 ns  TB seq.                        check_value() => OK, for slv x"3D"'. 'Transmit byte = 3D Received byte = 3D'
UVVM: ID_BFM                       5464695.2 ns  TB seq.                        uart_receive()=> x"3E". 'data received'
UVVM: ID_POS_ACK                   5469030.0 ns  TB seq.                        check_value() => OK, for slv x"3E"'. 'Transmit byte = 3E Received byte = 3E'
UVVM: ID_BFM                       5551505.2 ns  TB seq.                        uart_receive()=> x"3F". 'data received'
UVVM: ID_POS_ACK                   5555840.0 ns  TB seq.                        check_value() => OK, for slv x"3F"'. 'Transmit byte = 3F Received byte = 3F'
UVVM: ID_BFM                       5638315.2 ns  TB seq.                        uart_receive()=> x"40". 'data received'
UVVM: ID_POS_ACK                   5642650.0 ns  TB seq.                        check_value() => OK, for slv x"40"'. 'Transmit byte = 40 Received byte = 40'
UVVM: ID_BFM                       5725125.2 ns  TB seq.                        uart_receive()=> x"41". 'data received'
UVVM: ID_POS_ACK                   5729460.0 ns  TB seq.                        check_value() => OK, for slv x"41"'. 'Transmit byte = 41 Received byte = 41'
UVVM: ID_BFM                       5811935.2 ns  TB seq.                        uart_receive()=> x"42". 'data received'
UVVM: ID_POS_ACK                   5816270.0 ns  TB seq.                        check_value() => OK, for slv x"42"'. 'Transmit byte = 42 Received byte = 42'
UVVM: ID_BFM                       5898745.2 ns  TB seq.                        uart_receive()=> x"43". 'data received'
UVVM: ID_POS_ACK                   5903080.0 ns  TB seq.                        check_value() => OK, for slv x"43"'. 'Transmit byte = 43 Received byte = 43'
UVVM: ID_BFM                       5985555.2 ns  TB seq.                        uart_receive()=> x"44". 'data received'
UVVM: ID_POS_ACK                   5989890.0 ns  TB seq.                        check_value() => OK, for slv x"44"'. 'Transmit byte = 44 Received byte = 44'
UVVM: ID_BFM                       6072365.2 ns  TB seq.                        uart_receive()=> x"45". 'data received'
UVVM: ID_POS_ACK                   6076700.0 ns  TB seq.                        check_value() => OK, for slv x"45"'. 'Transmit byte = 45 Received byte = 45'
UVVM: ID_BFM                       6159175.2 ns  TB seq.                        uart_receive()=> x"46". 'data received'
UVVM: ID_POS_ACK                   6163510.0 ns  TB seq.                        check_value() => OK, for slv x"46"'. 'Transmit byte = 46 Received byte = 46'
UVVM: ID_BFM                       6245985.2 ns  TB seq.                        uart_receive()=> x"47". 'data received'
UVVM: ID_POS_ACK                   6250320.0 ns  TB seq.                        check_value() => OK, for slv x"47"'. 'Transmit byte = 47 Received byte = 47'
UVVM: ID_BFM                       6332795.2 ns  TB seq.                        uart_receive()=> x"48". 'data received'
UVVM: ID_POS_ACK                   6337130.0 ns  TB seq.                        check_value() => OK, for slv x"48"'. 'Transmit byte = 48 Received byte = 48'
UVVM: ID_BFM                       6419605.2 ns  TB seq.                        uart_receive()=> x"49". 'data received'
UVVM: ID_POS_ACK                   6423940.0 ns  TB seq.                        check_value() => OK, for slv x"49"'. 'Transmit byte = 49 Received byte = 49'
UVVM: ID_BFM                       6506415.2 ns  TB seq.                        uart_receive()=> x"4A". 'data received'
UVVM: ID_POS_ACK                   6510750.0 ns  TB seq.                        check_value() => OK, for slv x"4A"'. 'Transmit byte = 4A Received byte = 4A'
UVVM: ID_BFM                       6593225.2 ns  TB seq.                        uart_receive()=> x"4B". 'data received'
UVVM: ID_POS_ACK                   6597560.0 ns  TB seq.                        check_value() => OK, for slv x"4B"'. 'Transmit byte = 4B Received byte = 4B'
UVVM: ID_BFM                       6680035.2 ns  TB seq.                        uart_receive()=> x"4C". 'data received'
UVVM: ID_POS_ACK                   6684370.0 ns  TB seq.                        check_value() => OK, for slv x"4C"'. 'Transmit byte = 4C Received byte = 4C'
UVVM: ID_BFM                       6766845.2 ns  TB seq.                        uart_receive()=> x"4D". 'data received'
UVVM: ID_POS_ACK                   6771180.0 ns  TB seq.                        check_value() => OK, for slv x"4D"'. 'Transmit byte = 4D Received byte = 4D'
UVVM: ID_BFM                       6853655.2 ns  TB seq.                        uart_receive()=> x"4E". 'data received'
UVVM: ID_POS_ACK                   6857990.0 ns  TB seq.                        check_value() => OK, for slv x"4E"'. 'Transmit byte = 4E Received byte = 4E'
UVVM: ID_BFM                       6940465.2 ns  TB seq.                        uart_receive()=> x"4F". 'data received'
UVVM: ID_POS_ACK                   6944800.0 ns  TB seq.                        check_value() => OK, for slv x"4F"'. 'Transmit byte = 4F Received byte = 4F'
UVVM: ID_BFM                       7027275.2 ns  TB seq.                        uart_receive()=> x"50". 'data received'
UVVM: ID_POS_ACK                   7031610.0 ns  TB seq.                        check_value() => OK, for slv x"50"'. 'Transmit byte = 50 Received byte = 50'
UVVM: ID_BFM                       7114085.2 ns  TB seq.                        uart_receive()=> x"51". 'data received'
UVVM: ID_POS_ACK                   7118420.0 ns  TB seq.                        check_value() => OK, for slv x"51"'. 'Transmit byte = 51 Received byte = 51'
UVVM: ID_BFM                       7200895.2 ns  TB seq.                        uart_receive()=> x"52". 'data received'
UVVM: ID_POS_ACK                   7205230.0 ns  TB seq.                        check_value() => OK, for slv x"52"'. 'Transmit byte = 52 Received byte = 52'
UVVM: ID_BFM                       7287705.2 ns  TB seq.                        uart_receive()=> x"53". 'data received'
UVVM: ID_POS_ACK                   7292040.0 ns  TB seq.                        check_value() => OK, for slv x"53"'. 'Transmit byte = 53 Received byte = 53'
UVVM: ID_BFM                       7374515.2 ns  TB seq.                        uart_receive()=> x"54". 'data received'
UVVM: ID_POS_ACK                   7378850.0 ns  TB seq.                        check_value() => OK, for slv x"54"'. 'Transmit byte = 54 Received byte = 54'
UVVM: ID_BFM                       7461325.2 ns  TB seq.                        uart_receive()=> x"55". 'data received'
UVVM: ID_POS_ACK                   7465660.0 ns  TB seq.                        check_value() => OK, for slv x"55"'. 'Transmit byte = 55 Received byte = 55'
UVVM: ID_BFM                       7548135.2 ns  TB seq.                        uart_receive()=> x"56". 'data received'
UVVM: ID_POS_ACK                   7552470.0 ns  TB seq.                        check_value() => OK, for slv x"56"'. 'Transmit byte = 56 Received byte = 56'
UVVM: ID_BFM                       7634945.2 ns  TB seq.                        uart_receive()=> x"57". 'data received'
UVVM: ID_POS_ACK                   7639280.0 ns  TB seq.                        check_value() => OK, for slv x"57"'. 'Transmit byte = 57 Received byte = 57'
UVVM: ID_BFM                       7721755.2 ns  TB seq.                        uart_receive()=> x"58". 'data received'
UVVM: ID_POS_ACK                   7726090.0 ns  TB seq.                        check_value() => OK, for slv x"58"'. 'Transmit byte = 58 Received byte = 58'
UVVM: ID_BFM                       7808565.2 ns  TB seq.                        uart_receive()=> x"59". 'data received'
UVVM: ID_POS_ACK                   7812900.0 ns  TB seq.                        check_value() => OK, for slv x"59"'. 'Transmit byte = 59 Received byte = 59'
UVVM: ID_BFM                       7895375.2 ns  TB seq.                        uart_receive()=> x"5A". 'data received'
UVVM: ID_POS_ACK                   7899710.0 ns  TB seq.                        check_value() => OK, for slv x"5A"'. 'Transmit byte = 5A Received byte = 5A'
UVVM: ID_BFM                       7982185.2 ns  TB seq.                        uart_receive()=> x"5B". 'data received'
UVVM: ID_POS_ACK                   7986520.0 ns  TB seq.                        check_value() => OK, for slv x"5B"'. 'Transmit byte = 5B Received byte = 5B'
UVVM: ID_BFM                       8068995.2 ns  TB seq.                        uart_receive()=> x"5C". 'data received'
UVVM: ID_POS_ACK                   8073330.0 ns  TB seq.                        check_value() => OK, for slv x"5C"'. 'Transmit byte = 5C Received byte = 5C'
UVVM: ID_BFM                       8155805.2 ns  TB seq.                        uart_receive()=> x"5D". 'data received'
UVVM: ID_POS_ACK                   8160140.0 ns  TB seq.                        check_value() => OK, for slv x"5D"'. 'Transmit byte = 5D Received byte = 5D'
UVVM: ID_BFM                       8242615.2 ns  TB seq.                        uart_receive()=> x"5E". 'data received'
UVVM: ID_POS_ACK                   8246950.0 ns  TB seq.                        check_value() => OK, for slv x"5E"'. 'Transmit byte = 5E Received byte = 5E'
UVVM: ID_BFM                       8329425.2 ns  TB seq.                        uart_receive()=> x"5F". 'data received'
UVVM: ID_POS_ACK                   8333760.0 ns  TB seq.                        check_value() => OK, for slv x"5F"'. 'Transmit byte = 5F Received byte = 5F'
UVVM: ID_BFM                       8416235.2 ns  TB seq.                        uart_receive()=> x"60". 'data received'
UVVM: ID_POS_ACK                   8420570.0 ns  TB seq.                        check_value() => OK, for slv x"60"'. 'Transmit byte = 60 Received byte = 60'
UVVM: ID_BFM                       8503045.2 ns  TB seq.                        uart_receive()=> x"61". 'data received'
UVVM: ID_POS_ACK                   8507380.0 ns  TB seq.                        check_value() => OK, for slv x"61"'. 'Transmit byte = 61 Received byte = 61'
UVVM: ID_BFM                       8589855.2 ns  TB seq.                        uart_receive()=> x"62". 'data received'
UVVM: ID_POS_ACK                   8594190.0 ns  TB seq.                        check_value() => OK, for slv x"62"'. 'Transmit byte = 62 Received byte = 62'
UVVM: ID_BFM                       8676665.2 ns  TB seq.                        uart_receive()=> x"63". 'data received'
UVVM: ID_POS_ACK                   8681000.0 ns  TB seq.                        check_value() => OK, for slv x"63"'. 'Transmit byte = 63 Received byte = 63'
UVVM: ID_BFM                       8763475.2 ns  TB seq.                        uart_receive()=> x"64". 'data received'
UVVM: ID_POS_ACK                   8767810.0 ns  TB seq.                        check_value() => OK, for slv x"64"'. 'Transmit byte = 64 Received byte = 64'
UVVM: ID_BFM                       8850285.2 ns  TB seq.                        uart_receive()=> x"65". 'data received'
UVVM: ID_POS_ACK                   8854620.0 ns  TB seq.                        check_value() => OK, for slv x"65"'. 'Transmit byte = 65 Received byte = 65'
UVVM: ID_BFM                       8937095.2 ns  TB seq.                        uart_receive()=> x"66". 'data received'
UVVM: ID_POS_ACK                   8941430.0 ns  TB seq.                        check_value() => OK, for slv x"66"'. 'Transmit byte = 66 Received byte = 66'
UVVM: ID_BFM                       9023905.2 ns  TB seq.                        uart_receive()=> x"67". 'data received'
UVVM: ID_POS_ACK                   9028240.0 ns  TB seq.                        check_value() => OK, for slv x"67"'. 'Transmit byte = 67 Received byte = 67'
UVVM: ID_BFM                       9110715.2 ns  TB seq.                        uart_receive()=> x"68". 'data received'
UVVM: ID_POS_ACK                   9115050.0 ns  TB seq.                        check_value() => OK, for slv x"68"'. 'Transmit byte = 68 Received byte = 68'
UVVM: ID_BFM                       9197525.2 ns  TB seq.                        uart_receive()=> x"69". 'data received'
UVVM: ID_POS_ACK                   9201860.0 ns  TB seq.                        check_value() => OK, for slv x"69"'. 'Transmit byte = 69 Received byte = 69'
UVVM: ID_BFM                       9284335.2 ns  TB seq.                        uart_receive()=> x"6A". 'data received'
UVVM: ID_POS_ACK                   9288670.0 ns  TB seq.                        check_value() => OK, for slv x"6A"'. 'Transmit byte = 6A Received byte = 6A'
UVVM: ID_BFM                       9371145.2 ns  TB seq.                        uart_receive()=> x"6B". 'data received'
UVVM: ID_POS_ACK                   9375480.0 ns  TB seq.                        check_value() => OK, for slv x"6B"'. 'Transmit byte = 6B Received byte = 6B'
UVVM: ID_BFM                       9457955.2 ns  TB seq.                        uart_receive()=> x"6C". 'data received'
UVVM: ID_POS_ACK                   9462290.0 ns  TB seq.                        check_value() => OK, for slv x"6C"'. 'Transmit byte = 6C Received byte = 6C'
UVVM: ID_BFM                       9544765.2 ns  TB seq.                        uart_receive()=> x"6D". 'data received'
UVVM: ID_POS_ACK                   9549100.0 ns  TB seq.                        check_value() => OK, for slv x"6D"'. 'Transmit byte = 6D Received byte = 6D'
UVVM: ID_BFM                       9631575.2 ns  TB seq.                        uart_receive()=> x"6E". 'data received'
UVVM: ID_POS_ACK                   9635910.0 ns  TB seq.                        check_value() => OK, for slv x"6E"'. 'Transmit byte = 6E Received byte = 6E'
UVVM: ID_BFM                       9718385.2 ns  TB seq.                        uart_receive()=> x"6F". 'data received'
UVVM: ID_POS_ACK                   9722720.0 ns  TB seq.                        check_value() => OK, for slv x"6F"'. 'Transmit byte = 6F Received byte = 6F'
UVVM: ID_BFM                       9805195.2 ns  TB seq.                        uart_receive()=> x"70". 'data received'
UVVM: ID_POS_ACK                   9809530.0 ns  TB seq.                        check_value() => OK, for slv x"70"'. 'Transmit byte = 70 Received byte = 70'
UVVM: ID_BFM                       9892005.2 ns  TB seq.                        uart_receive()=> x"71". 'data received'
UVVM: ID_POS_ACK                   9896340.0 ns  TB seq.                        check_value() => OK, for slv x"71"'. 'Transmit byte = 71 Received byte = 71'
UVVM: ID_BFM                       9978815.2 ns  TB seq.                        uart_receive()=> x"72". 'data received'
UVVM: ID_POS_ACK                   9983150.0 ns  TB seq.                        check_value() => OK, for slv x"72"'. 'Transmit byte = 72 Received byte = 72'
UVVM: ID_BFM                      10065625.2 ns  TB seq.                        uart_receive()=> x"73". 'data received'
UVVM: ID_POS_ACK                  10069960.0 ns  TB seq.                        check_value() => OK, for slv x"73"'. 'Transmit byte = 73 Received byte = 73'
UVVM: ID_BFM                      10152435.2 ns  TB seq.                        uart_receive()=> x"74". 'data received'
UVVM: ID_POS_ACK                  10156770.0 ns  TB seq.                        check_value() => OK, for slv x"74"'. 'Transmit byte = 74 Received byte = 74'
UVVM: ID_BFM                      10239245.2 ns  TB seq.                        uart_receive()=> x"75". 'data received'
UVVM: ID_POS_ACK                  10243580.0 ns  TB seq.                        check_value() => OK, for slv x"75"'. 'Transmit byte = 75 Received byte = 75'
UVVM: ID_BFM                      10326055.2 ns  TB seq.                        uart_receive()=> x"76". 'data received'
UVVM: ID_POS_ACK                  10330390.0 ns  TB seq.                        check_value() => OK, for slv x"76"'. 'Transmit byte = 76 Received byte = 76'
UVVM: ID_BFM                      10412865.2 ns  TB seq.                        uart_receive()=> x"77". 'data received'
UVVM: ID_POS_ACK                  10417200.0 ns  TB seq.                        check_value() => OK, for slv x"77"'. 'Transmit byte = 77 Received byte = 77'
UVVM: ID_BFM                      10499675.2 ns  TB seq.                        uart_receive()=> x"78". 'data received'
UVVM: ID_POS_ACK                  10504010.0 ns  TB seq.                        check_value() => OK, for slv x"78"'. 'Transmit byte = 78 Received byte = 78'
UVVM: ID_BFM                      10586485.2 ns  TB seq.                        uart_receive()=> x"79". 'data received'
UVVM: ID_POS_ACK                  10590820.0 ns  TB seq.                        check_value() => OK, for slv x"79"'. 'Transmit byte = 79 Received byte = 79'
UVVM: ID_BFM                      10673295.2 ns  TB seq.                        uart_receive()=> x"7A". 'data received'
UVVM: ID_POS_ACK                  10677630.0 ns  TB seq.                        check_value() => OK, for slv x"7A"'. 'Transmit byte = 7A Received byte = 7A'
UVVM: ID_BFM                      10760105.2 ns  TB seq.                        uart_receive()=> x"7B". 'data received'
UVVM: ID_POS_ACK                  10764440.0 ns  TB seq.                        check_value() => OK, for slv x"7B"'. 'Transmit byte = 7B Received byte = 7B'
UVVM: ID_BFM                      10846915.2 ns  TB seq.                        uart_receive()=> x"7C". 'data received'
UVVM: ID_POS_ACK                  10851250.0 ns  TB seq.                        check_value() => OK, for slv x"7C"'. 'Transmit byte = 7C Received byte = 7C'
UVVM: ID_BFM                      10933725.2 ns  TB seq.                        uart_receive()=> x"7D". 'data received'
UVVM: ID_POS_ACK                  10938060.0 ns  TB seq.                        check_value() => OK, for slv x"7D"'. 'Transmit byte = 7D Received byte = 7D'
UVVM: ID_BFM                      11020535.2 ns  TB seq.                        uart_receive()=> x"7E". 'data received'
UVVM: ID_POS_ACK                  11024870.0 ns  TB seq.                        check_value() => OK, for slv x"7E"'. 'Transmit byte = 7E Received byte = 7E'
UVVM: ID_BFM                      11107345.2 ns  TB seq.                        uart_receive()=> x"7F". 'data received'
UVVM: ID_POS_ACK                  11111680.0 ns  TB seq.                        check_value() => OK, for slv x"7F"'. 'Transmit byte = 7F Received byte = 7F'
UVVM: ID_BFM                      11194155.2 ns  TB seq.                        uart_receive()=> x"80". 'data received'
UVVM: ID_POS_ACK                  11198490.0 ns  TB seq.                        check_value() => OK, for slv x"80"'. 'Transmit byte = 80 Received byte = 80'
UVVM: ID_BFM                      11280965.2 ns  TB seq.                        uart_receive()=> x"81". 'data received'
UVVM: ID_POS_ACK                  11285300.0 ns  TB seq.                        check_value() => OK, for slv x"81"'. 'Transmit byte = 81 Received byte = 81'
UVVM: ID_BFM                      11367775.2 ns  TB seq.                        uart_receive()=> x"82". 'data received'
UVVM: ID_POS_ACK                  11372110.0 ns  TB seq.                        check_value() => OK, for slv x"82"'. 'Transmit byte = 82 Received byte = 82'
UVVM: ID_BFM                      11454585.2 ns  TB seq.                        uart_receive()=> x"83". 'data received'
UVVM: ID_POS_ACK                  11458920.0 ns  TB seq.                        check_value() => OK, for slv x"83"'. 'Transmit byte = 83 Received byte = 83'
UVVM: ID_BFM                      11541395.2 ns  TB seq.                        uart_receive()=> x"84". 'data received'
UVVM: ID_POS_ACK                  11545730.0 ns  TB seq.                        check_value() => OK, for slv x"84"'. 'Transmit byte = 84 Received byte = 84'
UVVM: ID_BFM                      11628205.2 ns  TB seq.                        uart_receive()=> x"85". 'data received'
UVVM: ID_POS_ACK                  11632540.0 ns  TB seq.                        check_value() => OK, for slv x"85"'. 'Transmit byte = 85 Received byte = 85'
UVVM: ID_BFM                      11715015.2 ns  TB seq.                        uart_receive()=> x"86". 'data received'
UVVM: ID_POS_ACK                  11719350.0 ns  TB seq.                        check_value() => OK, for slv x"86"'. 'Transmit byte = 86 Received byte = 86'
UVVM: ID_BFM                      11801825.2 ns  TB seq.                        uart_receive()=> x"87". 'data received'
UVVM: ID_POS_ACK                  11806160.0 ns  TB seq.                        check_value() => OK, for slv x"87"'. 'Transmit byte = 87 Received byte = 87'
UVVM: ID_BFM                      11888635.2 ns  TB seq.                        uart_receive()=> x"88". 'data received'
UVVM: ID_POS_ACK                  11892970.0 ns  TB seq.                        check_value() => OK, for slv x"88"'. 'Transmit byte = 88 Received byte = 88'
UVVM: ID_BFM                      11975445.2 ns  TB seq.                        uart_receive()=> x"89". 'data received'
UVVM: ID_POS_ACK                  11979780.0 ns  TB seq.                        check_value() => OK, for slv x"89"'. 'Transmit byte = 89 Received byte = 89'
UVVM: ID_BFM                      12062255.2 ns  TB seq.                        uart_receive()=> x"8A". 'data received'
UVVM: ID_POS_ACK                  12066590.0 ns  TB seq.                        check_value() => OK, for slv x"8A"'. 'Transmit byte = 8A Received byte = 8A'
UVVM: ID_BFM                      12149065.2 ns  TB seq.                        uart_receive()=> x"8B". 'data received'
UVVM: ID_POS_ACK                  12153400.0 ns  TB seq.                        check_value() => OK, for slv x"8B"'. 'Transmit byte = 8B Received byte = 8B'
UVVM: ID_BFM                      12235875.2 ns  TB seq.                        uart_receive()=> x"8C". 'data received'
UVVM: ID_POS_ACK                  12240210.0 ns  TB seq.                        check_value() => OK, for slv x"8C"'. 'Transmit byte = 8C Received byte = 8C'
UVVM: ID_BFM                      12322685.2 ns  TB seq.                        uart_receive()=> x"8D". 'data received'
UVVM: ID_POS_ACK                  12327020.0 ns  TB seq.                        check_value() => OK, for slv x"8D"'. 'Transmit byte = 8D Received byte = 8D'
UVVM: ID_BFM                      12409495.2 ns  TB seq.                        uart_receive()=> x"8E". 'data received'
UVVM: ID_POS_ACK                  12413830.0 ns  TB seq.                        check_value() => OK, for slv x"8E"'. 'Transmit byte = 8E Received byte = 8E'
UVVM: ID_BFM                      12496305.2 ns  TB seq.                        uart_receive()=> x"8F". 'data received'
UVVM: ID_POS_ACK                  12500640.0 ns  TB seq.                        check_value() => OK, for slv x"8F"'. 'Transmit byte = 8F Received byte = 8F'
UVVM: ID_BFM                      12583115.2 ns  TB seq.                        uart_receive()=> x"90". 'data received'
UVVM: ID_POS_ACK                  12587450.0 ns  TB seq.                        check_value() => OK, for slv x"90"'. 'Transmit byte = 90 Received byte = 90'
UVVM: ID_BFM                      12669925.2 ns  TB seq.                        uart_receive()=> x"91". 'data received'
UVVM: ID_POS_ACK                  12674260.0 ns  TB seq.                        check_value() => OK, for slv x"91"'. 'Transmit byte = 91 Received byte = 91'
UVVM: ID_BFM                      12756735.2 ns  TB seq.                        uart_receive()=> x"92". 'data received'
UVVM: ID_POS_ACK                  12761070.0 ns  TB seq.                        check_value() => OK, for slv x"92"'. 'Transmit byte = 92 Received byte = 92'
UVVM: ID_BFM                      12843545.2 ns  TB seq.                        uart_receive()=> x"93". 'data received'
UVVM: ID_POS_ACK                  12847880.0 ns  TB seq.                        check_value() => OK, for slv x"93"'. 'Transmit byte = 93 Received byte = 93'
UVVM: ID_BFM                      12930355.2 ns  TB seq.                        uart_receive()=> x"94". 'data received'
UVVM: ID_POS_ACK                  12934690.0 ns  TB seq.                        check_value() => OK, for slv x"94"'. 'Transmit byte = 94 Received byte = 94'
UVVM: ID_BFM                      13017165.2 ns  TB seq.                        uart_receive()=> x"95". 'data received'
UVVM: ID_POS_ACK                  13021500.0 ns  TB seq.                        check_value() => OK, for slv x"95"'. 'Transmit byte = 95 Received byte = 95'
UVVM: ID_BFM                      13103975.2 ns  TB seq.                        uart_receive()=> x"96". 'data received'
UVVM: ID_POS_ACK                  13108310.0 ns  TB seq.                        check_value() => OK, for slv x"96"'. 'Transmit byte = 96 Received byte = 96'
UVVM: ID_BFM                      13190785.2 ns  TB seq.                        uart_receive()=> x"97". 'data received'
UVVM: ID_POS_ACK                  13195120.0 ns  TB seq.                        check_value() => OK, for slv x"97"'. 'Transmit byte = 97 Received byte = 97'
UVVM: ID_BFM                      13277595.2 ns  TB seq.                        uart_receive()=> x"98". 'data received'
UVVM: ID_POS_ACK                  13281930.0 ns  TB seq.                        check_value() => OK, for slv x"98"'. 'Transmit byte = 98 Received byte = 98'
UVVM: ID_BFM                      13364405.2 ns  TB seq.                        uart_receive()=> x"99". 'data received'
UVVM: ID_POS_ACK                  13368740.0 ns  TB seq.                        check_value() => OK, for slv x"99"'. 'Transmit byte = 99 Received byte = 99'
UVVM: ID_BFM                      13451215.2 ns  TB seq.                        uart_receive()=> x"9A". 'data received'
UVVM: ID_POS_ACK                  13455550.0 ns  TB seq.                        check_value() => OK, for slv x"9A"'. 'Transmit byte = 9A Received byte = 9A'
UVVM: ID_BFM                      13538025.2 ns  TB seq.                        uart_receive()=> x"9B". 'data received'
UVVM: ID_POS_ACK                  13542360.0 ns  TB seq.                        check_value() => OK, for slv x"9B"'. 'Transmit byte = 9B Received byte = 9B'
UVVM: ID_BFM                      13624835.2 ns  TB seq.                        uart_receive()=> x"9C". 'data received'
UVVM: ID_POS_ACK                  13629170.0 ns  TB seq.                        check_value() => OK, for slv x"9C"'. 'Transmit byte = 9C Received byte = 9C'
UVVM: ID_BFM                      13711645.2 ns  TB seq.                        uart_receive()=> x"9D". 'data received'
UVVM: ID_POS_ACK                  13715980.0 ns  TB seq.                        check_value() => OK, for slv x"9D"'. 'Transmit byte = 9D Received byte = 9D'
UVVM: ID_BFM                      13798455.2 ns  TB seq.                        uart_receive()=> x"9E". 'data received'
UVVM: ID_POS_ACK                  13802790.0 ns  TB seq.                        check_value() => OK, for slv x"9E"'. 'Transmit byte = 9E Received byte = 9E'
UVVM: ID_BFM                      13885265.2 ns  TB seq.                        uart_receive()=> x"9F". 'data received'
UVVM: ID_POS_ACK                  13889600.0 ns  TB seq.                        check_value() => OK, for slv x"9F"'. 'Transmit byte = 9F Received byte = 9F'
UVVM: ID_BFM                      13972075.2 ns  TB seq.                        uart_receive()=> x"A0". 'data received'
UVVM: ID_POS_ACK                  13976410.0 ns  TB seq.                        check_value() => OK, for slv x"A0"'. 'Transmit byte = A0 Received byte = A0'
UVVM: ID_BFM                      14058885.2 ns  TB seq.                        uart_receive()=> x"A1". 'data received'
UVVM: ID_POS_ACK                  14063220.0 ns  TB seq.                        check_value() => OK, for slv x"A1"'. 'Transmit byte = A1 Received byte = A1'
UVVM: ID_BFM                      14145695.2 ns  TB seq.                        uart_receive()=> x"A2". 'data received'
UVVM: ID_POS_ACK                  14150030.0 ns  TB seq.                        check_value() => OK, for slv x"A2"'. 'Transmit byte = A2 Received byte = A2'
UVVM: ID_BFM                      14232505.2 ns  TB seq.                        uart_receive()=> x"A3". 'data received'
UVVM: ID_POS_ACK                  14236840.0 ns  TB seq.                        check_value() => OK, for slv x"A3"'. 'Transmit byte = A3 Received byte = A3'
UVVM: ID_BFM                      14319315.2 ns  TB seq.                        uart_receive()=> x"A4". 'data received'
UVVM: ID_POS_ACK                  14323650.0 ns  TB seq.                        check_value() => OK, for slv x"A4"'. 'Transmit byte = A4 Received byte = A4'
UVVM: ID_BFM                      14406125.2 ns  TB seq.                        uart_receive()=> x"A5". 'data received'
UVVM: ID_POS_ACK                  14410460.0 ns  TB seq.                        check_value() => OK, for slv x"A5"'. 'Transmit byte = A5 Received byte = A5'
UVVM: ID_BFM                      14492935.2 ns  TB seq.                        uart_receive()=> x"A6". 'data received'
UVVM: ID_POS_ACK                  14497270.0 ns  TB seq.                        check_value() => OK, for slv x"A6"'. 'Transmit byte = A6 Received byte = A6'
UVVM: ID_BFM                      14579745.2 ns  TB seq.                        uart_receive()=> x"A7". 'data received'
UVVM: ID_POS_ACK                  14584080.0 ns  TB seq.                        check_value() => OK, for slv x"A7"'. 'Transmit byte = A7 Received byte = A7'
UVVM: ID_BFM                      14666555.2 ns  TB seq.                        uart_receive()=> x"A8". 'data received'
UVVM: ID_POS_ACK                  14670890.0 ns  TB seq.                        check_value() => OK, for slv x"A8"'. 'Transmit byte = A8 Received byte = A8'
UVVM: ID_BFM                      14753365.2 ns  TB seq.                        uart_receive()=> x"A9". 'data received'
UVVM: ID_POS_ACK                  14757700.0 ns  TB seq.                        check_value() => OK, for slv x"A9"'. 'Transmit byte = A9 Received byte = A9'
UVVM: ID_BFM                      14840175.2 ns  TB seq.                        uart_receive()=> x"AA". 'data received'
UVVM: ID_POS_ACK                  14844510.0 ns  TB seq.                        check_value() => OK, for slv x"AA"'. 'Transmit byte = AA Received byte = AA'
UVVM: ID_BFM                      14926985.2 ns  TB seq.                        uart_receive()=> x"AB". 'data received'
UVVM: ID_POS_ACK                  14931320.0 ns  TB seq.                        check_value() => OK, for slv x"AB"'. 'Transmit byte = AB Received byte = AB'
UVVM: ID_BFM                      15013795.2 ns  TB seq.                        uart_receive()=> x"AC". 'data received'
UVVM: ID_POS_ACK                  15018130.0 ns  TB seq.                        check_value() => OK, for slv x"AC"'. 'Transmit byte = AC Received byte = AC'
UVVM: ID_BFM                      15100605.2 ns  TB seq.                        uart_receive()=> x"AD". 'data received'
UVVM: ID_POS_ACK                  15104940.0 ns  TB seq.                        check_value() => OK, for slv x"AD"'. 'Transmit byte = AD Received byte = AD'
UVVM: ID_BFM                      15187415.2 ns  TB seq.                        uart_receive()=> x"AE". 'data received'
UVVM: ID_POS_ACK                  15191750.0 ns  TB seq.                        check_value() => OK, for slv x"AE"'. 'Transmit byte = AE Received byte = AE'
UVVM: ID_BFM                      15274225.2 ns  TB seq.                        uart_receive()=> x"AF". 'data received'
UVVM: ID_POS_ACK                  15278560.0 ns  TB seq.                        check_value() => OK, for slv x"AF"'. 'Transmit byte = AF Received byte = AF'
UVVM: ID_BFM                      15361035.2 ns  TB seq.                        uart_receive()=> x"B0". 'data received'
UVVM: ID_POS_ACK                  15365370.0 ns  TB seq.                        check_value() => OK, for slv x"B0"'. 'Transmit byte = B0 Received byte = B0'
UVVM: ID_BFM                      15447845.2 ns  TB seq.                        uart_receive()=> x"B1". 'data received'
UVVM: ID_POS_ACK                  15452180.0 ns  TB seq.                        check_value() => OK, for slv x"B1"'. 'Transmit byte = B1 Received byte = B1'
UVVM: ID_BFM                      15534655.2 ns  TB seq.                        uart_receive()=> x"B2". 'data received'
UVVM: ID_POS_ACK                  15538990.0 ns  TB seq.                        check_value() => OK, for slv x"B2"'. 'Transmit byte = B2 Received byte = B2'
UVVM: ID_BFM                      15621465.2 ns  TB seq.                        uart_receive()=> x"B3". 'data received'
UVVM: ID_POS_ACK                  15625800.0 ns  TB seq.                        check_value() => OK, for slv x"B3"'. 'Transmit byte = B3 Received byte = B3'
UVVM: ID_BFM                      15708275.2 ns  TB seq.                        uart_receive()=> x"B4". 'data received'
UVVM: ID_POS_ACK                  15712610.0 ns  TB seq.                        check_value() => OK, for slv x"B4"'. 'Transmit byte = B4 Received byte = B4'
UVVM: ID_BFM                      15795085.2 ns  TB seq.                        uart_receive()=> x"B5". 'data received'
UVVM: ID_POS_ACK                  15799420.0 ns  TB seq.                        check_value() => OK, for slv x"B5"'. 'Transmit byte = B5 Received byte = B5'
UVVM: ID_BFM                      15881895.2 ns  TB seq.                        uart_receive()=> x"B6". 'data received'
UVVM: ID_POS_ACK                  15886230.0 ns  TB seq.                        check_value() => OK, for slv x"B6"'. 'Transmit byte = B6 Received byte = B6'
UVVM: ID_BFM                      15968705.2 ns  TB seq.                        uart_receive()=> x"B7". 'data received'
UVVM: ID_POS_ACK                  15973040.0 ns  TB seq.                        check_value() => OK, for slv x"B7"'. 'Transmit byte = B7 Received byte = B7'
UVVM: ID_BFM                      16055515.2 ns  TB seq.                        uart_receive()=> x"B8". 'data received'
UVVM: ID_POS_ACK                  16059850.0 ns  TB seq.                        check_value() => OK, for slv x"B8"'. 'Transmit byte = B8 Received byte = B8'
UVVM: ID_BFM                      16142325.2 ns  TB seq.                        uart_receive()=> x"B9". 'data received'
UVVM: ID_POS_ACK                  16146660.0 ns  TB seq.                        check_value() => OK, for slv x"B9"'. 'Transmit byte = B9 Received byte = B9'
UVVM: ID_BFM                      16229135.2 ns  TB seq.                        uart_receive()=> x"BA". 'data received'
UVVM: ID_POS_ACK                  16233470.0 ns  TB seq.                        check_value() => OK, for slv x"BA"'. 'Transmit byte = BA Received byte = BA'
UVVM: ID_BFM                      16315945.2 ns  TB seq.                        uart_receive()=> x"BB". 'data received'
UVVM: ID_POS_ACK                  16320280.0 ns  TB seq.                        check_value() => OK, for slv x"BB"'. 'Transmit byte = BB Received byte = BB'
UVVM: ID_BFM                      16402755.2 ns  TB seq.                        uart_receive()=> x"BC". 'data received'
UVVM: ID_POS_ACK                  16407090.0 ns  TB seq.                        check_value() => OK, for slv x"BC"'. 'Transmit byte = BC Received byte = BC'
UVVM: ID_BFM                      16489565.2 ns  TB seq.                        uart_receive()=> x"BD". 'data received'
UVVM: ID_POS_ACK                  16493900.0 ns  TB seq.                        check_value() => OK, for slv x"BD"'. 'Transmit byte = BD Received byte = BD'
UVVM: ID_BFM                      16576375.2 ns  TB seq.                        uart_receive()=> x"BE". 'data received'
UVVM: ID_POS_ACK                  16580710.0 ns  TB seq.                        check_value() => OK, for slv x"BE"'. 'Transmit byte = BE Received byte = BE'
UVVM: ID_BFM                      16663185.2 ns  TB seq.                        uart_receive()=> x"BF". 'data received'
UVVM: ID_POS_ACK                  16667520.0 ns  TB seq.                        check_value() => OK, for slv x"BF"'. 'Transmit byte = BF Received byte = BF'
UVVM: ID_BFM                      16749995.2 ns  TB seq.                        uart_receive()=> x"C0". 'data received'
UVVM: ID_POS_ACK                  16754330.0 ns  TB seq.                        check_value() => OK, for slv x"C0"'. 'Transmit byte = C0 Received byte = C0'
UVVM: ID_BFM                      16836805.2 ns  TB seq.                        uart_receive()=> x"C1". 'data received'
UVVM: ID_POS_ACK                  16841140.0 ns  TB seq.                        check_value() => OK, for slv x"C1"'. 'Transmit byte = C1 Received byte = C1'
UVVM: ID_BFM                      16923615.2 ns  TB seq.                        uart_receive()=> x"C2". 'data received'
UVVM: ID_POS_ACK                  16927950.0 ns  TB seq.                        check_value() => OK, for slv x"C2"'. 'Transmit byte = C2 Received byte = C2'
UVVM: ID_BFM                      17010425.2 ns  TB seq.                        uart_receive()=> x"C3". 'data received'
UVVM: ID_POS_ACK                  17014760.0 ns  TB seq.                        check_value() => OK, for slv x"C3"'. 'Transmit byte = C3 Received byte = C3'
UVVM: ID_BFM                      17097235.2 ns  TB seq.                        uart_receive()=> x"C4". 'data received'
UVVM: ID_POS_ACK                  17101570.0 ns  TB seq.                        check_value() => OK, for slv x"C4"'. 'Transmit byte = C4 Received byte = C4'
UVVM: ID_BFM                      17184045.2 ns  TB seq.                        uart_receive()=> x"C5". 'data received'
UVVM: ID_POS_ACK                  17188380.0 ns  TB seq.                        check_value() => OK, for slv x"C5"'. 'Transmit byte = C5 Received byte = C5'
UVVM: ID_BFM                      17270855.2 ns  TB seq.                        uart_receive()=> x"C6". 'data received'
UVVM: ID_POS_ACK                  17275190.0 ns  TB seq.                        check_value() => OK, for slv x"C6"'. 'Transmit byte = C6 Received byte = C6'
UVVM: ID_BFM                      17357665.2 ns  TB seq.                        uart_receive()=> x"C7". 'data received'
UVVM: ID_POS_ACK                  17362000.0 ns  TB seq.                        check_value() => OK, for slv x"C7"'. 'Transmit byte = C7 Received byte = C7'
UVVM: ID_BFM                      17444475.2 ns  TB seq.                        uart_receive()=> x"C8". 'data received'
UVVM: ID_POS_ACK                  17448810.0 ns  TB seq.                        check_value() => OK, for slv x"C8"'. 'Transmit byte = C8 Received byte = C8'
UVVM: ID_BFM                      17531285.2 ns  TB seq.                        uart_receive()=> x"C9". 'data received'
UVVM: ID_POS_ACK                  17535620.0 ns  TB seq.                        check_value() => OK, for slv x"C9"'. 'Transmit byte = C9 Received byte = C9'
UVVM: ID_BFM                      17618095.2 ns  TB seq.                        uart_receive()=> x"CA". 'data received'
UVVM: ID_POS_ACK                  17622430.0 ns  TB seq.                        check_value() => OK, for slv x"CA"'. 'Transmit byte = CA Received byte = CA'
UVVM: ID_BFM                      17704905.2 ns  TB seq.                        uart_receive()=> x"CB". 'data received'
UVVM: ID_POS_ACK                  17709240.0 ns  TB seq.                        check_value() => OK, for slv x"CB"'. 'Transmit byte = CB Received byte = CB'
UVVM: ID_BFM                      17791715.2 ns  TB seq.                        uart_receive()=> x"CC". 'data received'
UVVM: ID_POS_ACK                  17796050.0 ns  TB seq.                        check_value() => OK, for slv x"CC"'. 'Transmit byte = CC Received byte = CC'
UVVM: ID_BFM                      17878525.2 ns  TB seq.                        uart_receive()=> x"CD". 'data received'
UVVM: ID_POS_ACK                  17882860.0 ns  TB seq.                        check_value() => OK, for slv x"CD"'. 'Transmit byte = CD Received byte = CD'
UVVM: ID_BFM                      17965335.2 ns  TB seq.                        uart_receive()=> x"CE". 'data received'
UVVM: ID_POS_ACK                  17969670.0 ns  TB seq.                        check_value() => OK, for slv x"CE"'. 'Transmit byte = CE Received byte = CE'
UVVM: ID_BFM                      18052145.2 ns  TB seq.                        uart_receive()=> x"CF". 'data received'
UVVM: ID_POS_ACK                  18056480.0 ns  TB seq.                        check_value() => OK, for slv x"CF"'. 'Transmit byte = CF Received byte = CF'
UVVM: ID_BFM                      18138955.2 ns  TB seq.                        uart_receive()=> x"D0". 'data received'
UVVM: ID_POS_ACK                  18143290.0 ns  TB seq.                        check_value() => OK, for slv x"D0"'. 'Transmit byte = D0 Received byte = D0'
UVVM: ID_BFM                      18225765.2 ns  TB seq.                        uart_receive()=> x"D1". 'data received'
UVVM: ID_POS_ACK                  18230100.0 ns  TB seq.                        check_value() => OK, for slv x"D1"'. 'Transmit byte = D1 Received byte = D1'
UVVM: ID_BFM                      18312575.2 ns  TB seq.                        uart_receive()=> x"D2". 'data received'
UVVM: ID_POS_ACK                  18316910.0 ns  TB seq.                        check_value() => OK, for slv x"D2"'. 'Transmit byte = D2 Received byte = D2'
UVVM: ID_BFM                      18399385.2 ns  TB seq.                        uart_receive()=> x"D3". 'data received'
UVVM: ID_POS_ACK                  18403720.0 ns  TB seq.                        check_value() => OK, for slv x"D3"'. 'Transmit byte = D3 Received byte = D3'
UVVM: ID_BFM                      18486195.2 ns  TB seq.                        uart_receive()=> x"D4". 'data received'
UVVM: ID_POS_ACK                  18490530.0 ns  TB seq.                        check_value() => OK, for slv x"D4"'. 'Transmit byte = D4 Received byte = D4'
UVVM: ID_BFM                      18573005.2 ns  TB seq.                        uart_receive()=> x"D5". 'data received'
UVVM: ID_POS_ACK                  18577340.0 ns  TB seq.                        check_value() => OK, for slv x"D5"'. 'Transmit byte = D5 Received byte = D5'
UVVM: ID_BFM                      18659815.2 ns  TB seq.                        uart_receive()=> x"D6". 'data received'
UVVM: ID_POS_ACK                  18664150.0 ns  TB seq.                        check_value() => OK, for slv x"D6"'. 'Transmit byte = D6 Received byte = D6'
UVVM: ID_BFM                      18746625.2 ns  TB seq.                        uart_receive()=> x"D7". 'data received'
UVVM: ID_POS_ACK                  18750960.0 ns  TB seq.                        check_value() => OK, for slv x"D7"'. 'Transmit byte = D7 Received byte = D7'
UVVM: ID_BFM                      18833435.2 ns  TB seq.                        uart_receive()=> x"D8". 'data received'
UVVM: ID_POS_ACK                  18837770.0 ns  TB seq.                        check_value() => OK, for slv x"D8"'. 'Transmit byte = D8 Received byte = D8'
UVVM: ID_BFM                      18920245.2 ns  TB seq.                        uart_receive()=> x"D9". 'data received'
UVVM: ID_POS_ACK                  18924580.0 ns  TB seq.                        check_value() => OK, for slv x"D9"'. 'Transmit byte = D9 Received byte = D9'
UVVM: ID_BFM                      19007055.2 ns  TB seq.                        uart_receive()=> x"DA". 'data received'
UVVM: ID_POS_ACK                  19011390.0 ns  TB seq.                        check_value() => OK, for slv x"DA"'. 'Transmit byte = DA Received byte = DA'
UVVM: ID_BFM                      19093865.2 ns  TB seq.                        uart_receive()=> x"DB". 'data received'
UVVM: ID_POS_ACK                  19098200.0 ns  TB seq.                        check_value() => OK, for slv x"DB"'. 'Transmit byte = DB Received byte = DB'
UVVM: ID_BFM                      19180675.2 ns  TB seq.                        uart_receive()=> x"DC". 'data received'
UVVM: ID_POS_ACK                  19185010.0 ns  TB seq.                        check_value() => OK, for slv x"DC"'. 'Transmit byte = DC Received byte = DC'
UVVM: ID_BFM                      19267485.2 ns  TB seq.                        uart_receive()=> x"DD". 'data received'
UVVM: ID_POS_ACK                  19271820.0 ns  TB seq.                        check_value() => OK, for slv x"DD"'. 'Transmit byte = DD Received byte = DD'
UVVM: ID_BFM                      19354295.2 ns  TB seq.                        uart_receive()=> x"DE". 'data received'
UVVM: ID_POS_ACK                  19358630.0 ns  TB seq.                        check_value() => OK, for slv x"DE"'. 'Transmit byte = DE Received byte = DE'
UVVM: ID_BFM                      19441105.2 ns  TB seq.                        uart_receive()=> x"DF". 'data received'
UVVM: ID_POS_ACK                  19445440.0 ns  TB seq.                        check_value() => OK, for slv x"DF"'. 'Transmit byte = DF Received byte = DF'
UVVM: ID_BFM                      19527915.2 ns  TB seq.                        uart_receive()=> x"E0". 'data received'
UVVM: ID_POS_ACK                  19532250.0 ns  TB seq.                        check_value() => OK, for slv x"E0"'. 'Transmit byte = E0 Received byte = E0'
UVVM: ID_BFM                      19614725.2 ns  TB seq.                        uart_receive()=> x"E1". 'data received'
UVVM: ID_POS_ACK                  19619060.0 ns  TB seq.                        check_value() => OK, for slv x"E1"'. 'Transmit byte = E1 Received byte = E1'
UVVM: ID_BFM                      19701535.2 ns  TB seq.                        uart_receive()=> x"E2". 'data received'
UVVM: ID_POS_ACK                  19705870.0 ns  TB seq.                        check_value() => OK, for slv x"E2"'. 'Transmit byte = E2 Received byte = E2'
UVVM: ID_BFM                      19788345.2 ns  TB seq.                        uart_receive()=> x"E3". 'data received'
UVVM: ID_POS_ACK                  19792680.0 ns  TB seq.                        check_value() => OK, for slv x"E3"'. 'Transmit byte = E3 Received byte = E3'
UVVM: ID_BFM                      19875155.2 ns  TB seq.                        uart_receive()=> x"E4". 'data received'
UVVM: ID_POS_ACK                  19879490.0 ns  TB seq.                        check_value() => OK, for slv x"E4"'. 'Transmit byte = E4 Received byte = E4'
UVVM: ID_BFM                      19961965.2 ns  TB seq.                        uart_receive()=> x"E5". 'data received'
UVVM: ID_POS_ACK                  19966300.0 ns  TB seq.                        check_value() => OK, for slv x"E5"'. 'Transmit byte = E5 Received byte = E5'
UVVM: ID_BFM                      20048775.2 ns  TB seq.                        uart_receive()=> x"E6". 'data received'
UVVM: ID_POS_ACK                  20053110.0 ns  TB seq.                        check_value() => OK, for slv x"E6"'. 'Transmit byte = E6 Received byte = E6'
UVVM: ID_BFM                      20135585.2 ns  TB seq.                        uart_receive()=> x"E7". 'data received'
UVVM: ID_POS_ACK                  20139920.0 ns  TB seq.                        check_value() => OK, for slv x"E7"'. 'Transmit byte = E7 Received byte = E7'
UVVM: ID_BFM                      20222395.2 ns  TB seq.                        uart_receive()=> x"E8". 'data received'
UVVM: ID_POS_ACK                  20226730.0 ns  TB seq.                        check_value() => OK, for slv x"E8"'. 'Transmit byte = E8 Received byte = E8'
UVVM: ID_BFM                      20309205.2 ns  TB seq.                        uart_receive()=> x"E9". 'data received'
UVVM: ID_POS_ACK                  20313540.0 ns  TB seq.                        check_value() => OK, for slv x"E9"'. 'Transmit byte = E9 Received byte = E9'
UVVM: ID_BFM                      20396015.2 ns  TB seq.                        uart_receive()=> x"EA". 'data received'
UVVM: ID_POS_ACK                  20400350.0 ns  TB seq.                        check_value() => OK, for slv x"EA"'. 'Transmit byte = EA Received byte = EA'
UVVM: ID_BFM                      20482825.2 ns  TB seq.                        uart_receive()=> x"EB". 'data received'
UVVM: ID_POS_ACK                  20487160.0 ns  TB seq.                        check_value() => OK, for slv x"EB"'. 'Transmit byte = EB Received byte = EB'
UVVM: ID_BFM                      20569635.2 ns  TB seq.                        uart_receive()=> x"EC". 'data received'
UVVM: ID_POS_ACK                  20573970.0 ns  TB seq.                        check_value() => OK, for slv x"EC"'. 'Transmit byte = EC Received byte = EC'
UVVM: ID_BFM                      20656445.2 ns  TB seq.                        uart_receive()=> x"ED". 'data received'
UVVM: ID_POS_ACK                  20660780.0 ns  TB seq.                        check_value() => OK, for slv x"ED"'. 'Transmit byte = ED Received byte = ED'
UVVM: ID_BFM                      20743255.2 ns  TB seq.                        uart_receive()=> x"EE". 'data received'
UVVM: ID_POS_ACK                  20747590.0 ns  TB seq.                        check_value() => OK, for slv x"EE"'. 'Transmit byte = EE Received byte = EE'
UVVM: ID_BFM                      20830065.2 ns  TB seq.                        uart_receive()=> x"EF". 'data received'
UVVM: ID_POS_ACK                  20834400.0 ns  TB seq.                        check_value() => OK, for slv x"EF"'. 'Transmit byte = EF Received byte = EF'
UVVM: ID_BFM                      20916875.2 ns  TB seq.                        uart_receive()=> x"F0". 'data received'
UVVM: ID_POS_ACK                  20921210.0 ns  TB seq.                        check_value() => OK, for slv x"F0"'. 'Transmit byte = F0 Received byte = F0'
UVVM: ID_BFM                      21003685.2 ns  TB seq.                        uart_receive()=> x"F1". 'data received'
UVVM: ID_POS_ACK                  21008020.0 ns  TB seq.                        check_value() => OK, for slv x"F1"'. 'Transmit byte = F1 Received byte = F1'
UVVM: ID_BFM                      21090495.2 ns  TB seq.                        uart_receive()=> x"F2". 'data received'
UVVM: ID_POS_ACK                  21094830.0 ns  TB seq.                        check_value() => OK, for slv x"F2"'. 'Transmit byte = F2 Received byte = F2'
UVVM: ID_BFM                      21177305.2 ns  TB seq.                        uart_receive()=> x"F3". 'data received'
UVVM: ID_POS_ACK                  21181640.0 ns  TB seq.                        check_value() => OK, for slv x"F3"'. 'Transmit byte = F3 Received byte = F3'
UVVM: ID_BFM                      21264115.2 ns  TB seq.                        uart_receive()=> x"F4". 'data received'
UVVM: ID_POS_ACK                  21268450.0 ns  TB seq.                        check_value() => OK, for slv x"F4"'. 'Transmit byte = F4 Received byte = F4'
UVVM: ID_BFM                      21350925.2 ns  TB seq.                        uart_receive()=> x"F5". 'data received'
UVVM: ID_POS_ACK                  21355260.0 ns  TB seq.                        check_value() => OK, for slv x"F5"'. 'Transmit byte = F5 Received byte = F5'
UVVM: ID_BFM                      21437735.2 ns  TB seq.                        uart_receive()=> x"F6". 'data received'
UVVM: ID_POS_ACK                  21442070.0 ns  TB seq.                        check_value() => OK, for slv x"F6"'. 'Transmit byte = F6 Received byte = F6'
UVVM: ID_BFM                      21524545.2 ns  TB seq.                        uart_receive()=> x"F7". 'data received'
UVVM: ID_POS_ACK                  21528880.0 ns  TB seq.                        check_value() => OK, for slv x"F7"'. 'Transmit byte = F7 Received byte = F7'
UVVM: ID_BFM                      21611355.2 ns  TB seq.                        uart_receive()=> x"F8". 'data received'
UVVM: ID_POS_ACK                  21615690.0 ns  TB seq.                        check_value() => OK, for slv x"F8"'. 'Transmit byte = F8 Received byte = F8'
UVVM: ID_BFM                      21698165.2 ns  TB seq.                        uart_receive()=> x"F9". 'data received'
UVVM: ID_POS_ACK                  21702500.0 ns  TB seq.                        check_value() => OK, for slv x"F9"'. 'Transmit byte = F9 Received byte = F9'
UVVM: ID_BFM                      21784975.2 ns  TB seq.                        uart_receive()=> x"FA". 'data received'
UVVM: ID_POS_ACK                  21789310.0 ns  TB seq.                        check_value() => OK, for slv x"FA"'. 'Transmit byte = FA Received byte = FA'
UVVM: ID_BFM                      21871785.2 ns  TB seq.                        uart_receive()=> x"FB". 'data received'
UVVM: ID_POS_ACK                  21876120.0 ns  TB seq.                        check_value() => OK, for slv x"FB"'. 'Transmit byte = FB Received byte = FB'
UVVM: ID_BFM                      21958595.2 ns  TB seq.                        uart_receive()=> x"FC". 'data received'
UVVM: ID_POS_ACK                  21962930.0 ns  TB seq.                        check_value() => OK, for slv x"FC"'. 'Transmit byte = FC Received byte = FC'
UVVM: ID_BFM                      22045405.2 ns  TB seq.                        uart_receive()=> x"FD". 'data received'
UVVM: ID_POS_ACK                  22049740.0 ns  TB seq.                        check_value() => OK, for slv x"FD"'. 'Transmit byte = FD Received byte = FD'
UVVM: ID_BFM                      22132215.2 ns  TB seq.                        uart_receive()=> x"FE". 'data received'
UVVM: ID_POS_ACK                  22136550.0 ns  TB seq.                        check_value() => OK, for slv x"FE"'. 'Transmit byte = FE Received byte = FE'
UVVM: ID_BFM                      22219025.2 ns  TB seq.                        uart_receive()=> x"FF". 'data received'
UVVM: ID_POS_ACK                  22223360.0 ns  TB seq.                        check_value() => OK, for slv x"FF"'. 'Transmit byte = FF Received byte = FF'
UVVM:      
UVVM:      ====================================================================================================================================================================
UVVM:      *** FINAL SUMMARY OF ALL ALERTS ***
UVVM:      ====================================================================================================================================================================
UVVM:                                REGARDED   EXPECTED  IGNORED      Comment?
UVVM:                NOTE         :      0         0         0         ok
UVVM:                TB_NOTE      :      0         0         0         ok
UVVM:                WARNING      :      0         0         0         ok
UVVM:                TB_WARNING   :      1         0         0         *** TB_WARNING ***
UVVM:                MANUAL_CHECK :      0         0         0         ok
UVVM:                ERROR        :      0         0         0         ok
UVVM:                TB_ERROR     :      0         0         0         ok
UVVM:                FAILURE      :      0         0         0         ok
UVVM:                TB_FAILURE   :      0         0         0         ok
UVVM:      ====================================================================================================================================================================
UVVM:      >> Simulation SUCCESS: No mismatch between counted and expected serious alerts
UVVM:      ====================================================================================================================================================================
UVVM:      
UVVM:      
UVVM: 
UVVM: 
UVVM: ID_LOG_HDR                  22224360.0 ns  TB seq.                        SIMULATION COMPLETED
UVVM: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Therefore, it seems the uart_tx module works correctly. I wanted to add a error injection. So I add a wrong desired output check by adding the following lines to the testbench code:

    wait for 10*c_clkperiod;

    din_i       <= CONV_STD_LOGIC_VECTOR(55,8);
    tx_start_i  <= '1';
    uart_receive(
        recv_byte,              -- data_value                          
        "data received",        -- msg                            
        tx_o,                   -- rx
        terminate_loop,         -- terminate_loop
        uart_bfm_config,        -- config
        C_SCOPE,                -- scope
        shared_msg_id_panel,    -- msg_id_panel
        ""                      -- ext_proc_call
    );
    wait for c_clkperiod;
    tx_start_i  <= '0';
    wait until rising_edge(tx_done_tick_o);
    check_value(CONV_STD_LOGIC_VECTOR(54,8), recv_byte, ERROR, "Transmit byte = " & to_string(din_i,HEX) & " Received byte = " & to_string(recv_byte,HEX));
    wait for 1 ps;

I transmit 55 but check for the value of 54. This time Modelsim stopped and gave the output:

# UVVM: ID_BFM                      22305935.2 ns  TB seq.                        uart_receive()=> x"37". 'data received'
# UVVM: 
# UVVM: =========================================================================================================================================================================
# UVVM: ***  ERROR #1  ***
# UVVM:      22310270 ns   TB seq.
# UVVM:                    check_value() => Failed. slv  Was x"36". Expected x"37".
# UVVM:                    Transmit byte = 37 Received byte = 37
# UVVM: 
# UVVM: Simulator has been paused as requested after 1 ERROR
# UVVM: *** To find the root cause of this alert, step out the HDL calling stack in your simulator. ***
# UVVM: *** For example, step out until you reach the call from the test sequencer. ***
# UVVM: =========================================================================================================================================================================
# UVVM: 
# UVVM: 
# ** Note: stop
#    Time: 22310270 ns  Iteration: 2  Instance: /tb_uart_tx

And here is the data from _Alert.txt

UVVM: 
UVVM: ***  TB_WARNING #1  ***
UVVM:         0.001 ns   (Util buried)
UVVM:                    Time stamp has been truncated to 1 decimal(s) in the next log message - settable in adaptations_pkg. (Actual time stamp has more decimals than
UVVM:                    displayed) 
UVVM:                    This alert is shown once only.
UVVM: 
UVVM: 
UVVM: =========================================================================================================================================================================
UVVM: ***  ERROR #1  ***
UVVM:      22310270 ns   TB seq.
UVVM:                    check_value() => Failed. slv  Was x"36". Expected x"37".
UVVM:                    Transmit byte = 37 Received byte = 37
UVVM: 
UVVM: Simulator has been paused as requested after 1 ERROR
UVVM: *** To find the root cause of this alert, step out the HDL calling stack in your simulator. ***
UVVM: *** For example, step out until you reach the call from the test sequencer. ***
UVVM: =========================================================================================================================================================================

In this post, I showed how to compile UVVM for Modelsim. I created a simple testbench file for uart_tx module. The testbench transmits 256 bytes of uart data. I utilized uart_receive and check_value functions to verify if the received bytes are correct. This was the first example I coverd using UVVM library. If you are using first time UVVM, it will take some time to learn the functions and types defined in the library. I hope learning curve will be speedy for me as I understanding the VHDL code is easier for me in UVVM. Also the code is open-source, you can learn easily by just reading the function implementations and try to using them in testbench files.

I plan to show more examples using UVVM in the near future.

Regards,

Mehmet Burak AYKENAR

You can connect me via LinledIn: Just sent me an invitation

https://tr.linkedin.com/in/mehmet-burak-aykenar-73326419a