blob: 7335207690f3095ee2783c667b797c48be5e2bc2 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
class uart_agent_cfg extends dv_base_agent_cfg;
bit en_rx_checks = 1'b1; // enable RX checks (implemented in monitor)
bit en_tx_checks = 1'b1; // enable TX checks (implemented in monitor)
bit en_rx_monitor = 1'b1; // enable RX monitor
bit en_tx_monitor = 1'b1; // enable TX monitor
// device specific cfg
baud_rate_e baud_rate;
bit en_parity;
bit odd_parity;
// Controls upto what percentage of the clock period the RX is randomly glitched every 1ns.
// RX is glitched at the start of the clock to ensure that the design is robust enough to sample
// the correct value (typically at the center of the clock). The recommended range for this value
// is 0-10%.
local uint uart_period_glitch_pct = 10;
// Logger settings.
bit en_logger = 1'b0; // enable logger on tx
bit use_rx_for_logger = 1'b0; // use rx instead of tx
string logger_id = "uart_logger";
bit write_logs_to_file = 1'b1;
// reset is controlled at upper seq-level as no reset pin on uart interface
bit under_reset;
// interface handle used by driver, monitor & the sequencer
virtual uart_if vif;
// The actual UART clock is not perfectly aligned to the baud rate. The clock btw transmitter and
// receiver can have certain difference
// driver is using perfect baud rate. Here is the max allowed clock drift for design comparing the
// ideal baud rate, This number must be less than 50
// if set 20 here, received data must be ready to sample and stable at 30%-70% of the cycle
local uint max_drift_cycle_pct = 25;
`uvm_object_utils_begin(uart_agent_cfg)
`uvm_field_int(en_rx_checks, UVM_DEFAULT)
`uvm_field_int(en_tx_checks, UVM_DEFAULT)
`uvm_field_int(en_tx_monitor, UVM_DEFAULT)
`uvm_field_int(en_rx_monitor, UVM_DEFAULT)
`uvm_field_int(en_parity, UVM_DEFAULT)
`uvm_field_int(odd_parity, UVM_DEFAULT)
`uvm_field_enum(baud_rate_e, baud_rate, UVM_DEFAULT)
`uvm_field_int(uart_period_glitch_pct, UVM_DEFAULT)
`uvm_object_utils_end
`uvm_object_new
function void set_uart_period_glitch_pct(uint pct);
`DV_CHECK_LT_FATAL(pct, 20)
uart_period_glitch_pct = pct;
endfunction
function uint get_uart_period_glitch_pct();
return uart_period_glitch_pct;
endfunction
function void set_baud_rate(baud_rate_e b);
baud_rate = b;
vif.uart_clk_period_ns = (get_baud_rate_period_ns(b) * 1ns);
endfunction
function void set_parity(bit en_parity, bit odd_parity);
this.en_parity = en_parity;
this.odd_parity = odd_parity;
endfunction
function void set_max_drift_cycle_pct(uint pct);
`DV_CHECK_LT_FATAL(pct, 50)
max_drift_cycle_pct = pct;
endfunction
function int get_max_drift_cycle_pct();
return max_drift_cycle_pct;
endfunction
virtual function void reset_asserted();
under_reset = 1;
endfunction
virtual function void reset_deasserted(bit re_enable_chk_mon = 1);
under_reset = 0;
vif.reset_uart_rx();
if (re_enable_chk_mon) begin
en_rx_checks = 1;
en_tx_checks = 1;
en_rx_monitor = 1;
en_tx_monitor = 1;
end
endfunction
endclass