| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| class i2c_item extends uvm_sequence_item; |
| |
| // transaction data part |
| bit [7:0] data_q[$]; |
| bit [9:0] addr; // enough to support both 7 & 10-bit target address |
| int tran_id; |
| int num_data; // valid data |
| bus_op_e bus_op; |
| drv_type_e drv_type; |
| // transaction control part |
| bit nack; |
| bit ack; |
| bit rstart; |
| |
| // queue dropped data due to fmt_overflow |
| bit [7:0] fmt_ovf_data_q[$]; |
| |
| // random flags |
| rand bit [7:0] fbyte; |
| rand bit nakok, rcont, read, stop, start; |
| |
| // Incoming write data |
| logic [7:0] wdata; |
| logic [7:0] rdata; |
| |
| // Use for debug print |
| string pname = ""; |
| |
| constraint fbyte_c { fbyte inside {[0 : 127] }; } |
| constraint rcont_c { |
| solve read, stop before rcont; |
| // for read request, rcont and stop must be complementary set |
| if (read) { |
| rcont == ~stop; |
| } else { |
| rcont dist { 1 :/ 1, 0 :/ 2 }; |
| } |
| } |
| |
| `uvm_object_utils_begin(i2c_item) |
| `uvm_field_int(tran_id, UVM_DEFAULT) |
| `uvm_field_enum(bus_op_e, bus_op, UVM_DEFAULT) |
| `uvm_field_int(addr, UVM_DEFAULT) |
| `uvm_field_int(num_data, UVM_DEFAULT) |
| `uvm_field_int(start, UVM_DEFAULT) |
| `uvm_field_int(stop, UVM_DEFAULT) |
| `uvm_field_int(wdata, UVM_DEFAULT | UVM_NOCOMPARE) |
| `uvm_field_queue_int(data_q, UVM_DEFAULT | UVM_NOPRINT) |
| `uvm_field_queue_int(fmt_ovf_data_q, UVM_DEFAULT | UVM_NOCOMPARE) |
| `uvm_field_int(rdata, UVM_DEFAULT | UVM_NOPRINT | UVM_NOCOMPARE) |
| `uvm_field_int(rstart, UVM_DEFAULT | UVM_NOCOMPARE) |
| `uvm_field_int(fbyte, UVM_DEFAULT | UVM_NOPRINT | UVM_NOCOMPARE) |
| `uvm_field_int(ack, UVM_DEFAULT | UVM_NOPRINT | UVM_NOCOMPARE) |
| `uvm_field_int(nack, UVM_DEFAULT | UVM_NOPRINT | UVM_NOCOMPARE) |
| `uvm_field_int(read, UVM_DEFAULT | UVM_NOCOMPARE) |
| `uvm_field_int(rcont, UVM_DEFAULT | UVM_NOCOMPARE) |
| `uvm_field_int(nakok, UVM_DEFAULT | UVM_NOPRINT | UVM_NOCOMPARE) |
| `uvm_field_enum(drv_type_e, drv_type, UVM_DEFAULT | UVM_NOCOMPARE) |
| `uvm_object_utils_end |
| |
| `uvm_object_new |
| |
| function void clear_data(); |
| num_data = 0; |
| addr = 0; |
| drv_type = None; |
| data_q.delete(); |
| fmt_ovf_data_q.delete(); |
| wdata = 0; |
| rdata = 0; |
| endfunction : clear_data |
| |
| function void clear_flag(); |
| start = 1'b0; |
| stop = 1'b0; |
| read = 1'b0; |
| rcont = 1'b0; |
| nakok = 1'b0; |
| rstart = 1'b0; |
| endfunction : clear_flag |
| |
| function void clear_all(); |
| clear_data(); |
| clear_flag(); |
| endfunction : clear_all |
| |
| virtual function string convert2string(); |
| string str = ""; |
| str = {str, $sformatf("%s:tran_id = %0d\n", pname, tran_id)}; |
| str = {str, $sformatf("%s:bus_op = %s\n", pname, bus_op.name)}; |
| str = {str, $sformatf("%s:addr = 0x%2x\n", pname, addr)}; |
| str = {str, $sformatf("%s:num_data = %0d\n", pname, num_data)}; |
| str = {str, $sformatf("%s:start = %1b\n", pname, start)}; |
| str = {str, $sformatf("%s:stop = %1b\n", pname, stop)}; |
| str = {str, $sformatf("%s:read = %1b\n", pname, read)}; |
| str = {str, $sformatf("%s:rstart = %1b\n", pname, rstart)}; |
| foreach (data_q[i]) begin |
| str = {str, $sformatf("%s:data_q[%0d]=0x%2x\n", pname, i, data_q[i])}; |
| end |
| return str; |
| endfunction |
| endclass : i2c_item |