blob: a9e9cd9b547ce8640200d237908881202c6e6e5d [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 i2c_device_driver extends i2c_driver;
`uvm_component_utils(i2c_device_driver)
`uvm_component_new
bit [I2C_DATA_WIDTH-1:0] data;
rand bit [I2C_DATA_WIDTH-1:0] rd_data;
constraint rd_data_c { rd_data inside {[0 : ((1 << I2C_DATA_WIDTH) - 1)]}; }
virtual task get_and_drive();
i2c_item rsp_item;
@(posedge cfg.vif.rst_ni);
forever begin
cfg.vif.scl_o = 1'b1;
cfg.vif.sda_o = 1'b1;
// device driver responses to dut
seq_item_port.get_next_item(rsp_item);
unique case (rsp_item.drv_type)
DevAck: begin
cfg.vif.device_send_ack(cfg.timing_cfg);
end
RdData: begin
`DV_CHECK_MEMBER_RANDOMIZE_FATAL(rd_data)
for (int i = I2C_DATA_WIDTH-1; i >= 0; i--) begin
cfg.vif.device_send_bit(cfg.timing_cfg, rd_data[i]);
end
`uvm_info(`gfn, $sformatf("driver, trans %0d, byte %0d %0b",
rsp_item.tran_id, rsp_item.num_data+1, rd_data), UVM_DEBUG)
end
default: begin
`uvm_fatal(`gfn, $sformatf("driver, received invalid request from monitor/seq"))
end
endcase
seq_item_port.item_done();
end
endtask : get_and_drive
endclass : i2c_device_driver