blob: be53390f2579edc836cd43105769e10527aba662 [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 pwm_item extends uvm_sequence_item;
int monitor_id = 0; // for debugging purpose only
int period = 0; // clks in a beat
int duty_cycle = 0; // high vs low cnt
int active_cnt = 0; // number of clocks pwm was high
int inactive_cnt = 0; // number of clocks pwm was low
int phase = 0; // what clock cnt did the pulse start
bit invert = 0; // (1)active low (0) active high
`uvm_object_utils_begin(pwm_item)
`uvm_field_int(period, UVM_DEFAULT)
`uvm_field_int(duty_cycle, UVM_DEFAULT)
`uvm_field_int(active_cnt, UVM_DEFAULT)
`uvm_field_int(inactive_cnt, UVM_DEFAULT)
`uvm_field_int(phase, UVM_NOCOMPARE)
`uvm_field_int(invert, UVM_DEFAULT)
`uvm_field_int(monitor_id, UVM_DEFAULT)
`uvm_object_utils_end
`uvm_object_new
function string convert2string();
string txt ="";
txt = "\n------| PWM ITEM |------";
txt = { txt, $sformatf("\n Item from monitor %d", monitor_id) };
txt = { txt, $sformatf("\n Period %d clocks", period) };
txt = { txt, $sformatf("\n Duty cycle %0d pct ", get_duty_cycle()) };
txt = { txt, $sformatf("\n inverted %0b", invert) };
txt = { txt, $sformatf("\n # of active cycles %d", active_cnt) };
txt = { txt, $sformatf("\n # of inactive cycles %d", inactive_cnt) };
txt = { txt, $sformatf("\n phase cnt %d", phase) };
return txt;
endfunction // convert2string
function int get_duty_cycle();
int dc;
dc = (active_cnt/period) * 100;
if (invert) begin
duty_cycle = (100-dc);
return (100-dc);
end else begin
duty_cycle = dc;
return dc;
end
endfunction // get_duty_cycle
endclass