This pages describes the UART RX BFM file.
This file explains the assorted parts of the RX BFM.
First some pointers to the sequence driver, eVC name and signal map for I/O access.:
unit uart_rx_bfm_u {
rx_driver : uart_rx_driver_u;
name : uart_rx_env_name_t;
sig : sig_map_u;
...
At reset the BFM sets the values of the DUT inputs:
bfm_drive_init_tcm() @sig.clk_r_ev is {
sig.full_clr_p$=0;
sig.rx_in_p$=1;
};--bfm_drive_init_tcm
The rest of the BFM code requests an item, from the sequence driver, drives it on the RX input interface and finishes with an item done emission.
bfm_drive_data_tcm() @sig.clk_r_ev is {
var rx_data_in : uart_rx_byte_s;
wait true (sig.rst_p$ == 0);
message(NONE, "bfm_drive_data_tcm reset wait ended ", name);
while(TRUE) {
rx_data_in = rx_driver.get_next_item();
messagef(HIGH,
"bfm_drive_data_tcm Requesting new rx byte waits for %d",
rx_data_in.transmit_delay
);
wait [rx_data_in.transmit_delay] * cycle;
--start bit
sig.rx_in_p$=0;
for i from 0 to 2 do {
wait true (sig.ck_en_p$ == 1);
wait true (sig.ck_en_p$ == 0);
};
--data bits
var rx_bits_l : list of bit = pack(
packing.low, rx_data_in.uart_rx_data
);
message(NONE, "bfm_drive_data_tcm drive byte ") {
print rx_bits_l using hex;
};
while(!rx_bits_l.is_empty()) {
sig.rx_in_p$=rx_bits_l.pop();
for i from 0 to 2 do {
wait true (sig.ck_en_p$ == 1);
wait true (sig.ck_en_p$ == 0);
};--for
};--while
--stop bit
var stop_bit_cnt : byte;
gen stop_bit_cnt keeping{it >= 2 && it <= 5;};
sig.rx_in_p$=1;
for i from 0 to stop_bit_cnt do {
wait true (sig.ck_en_p$ == 1);
wait true (sig.ck_en_p$ == 0);
};
emit rx_driver.item_done;
}--while
};--bfm_drive_data_tcm
To go to main project: main project page
|