I3C CocoTB simulation models
The I3cController class located in i3c_controller module can be used to simulate an I3C Host controller.
The I3cController class requires the following signals to be connected to DUT:
scl_i- Clock input to controller (output from target(s))sda_i- Data input to controller (output from target(s))scl_o- Clock output from of (input of target(s))sda_o- Data output from of (input to target(s))
The design has to include the physical layer responsible for separating a tri-stat signal into separate ins and outs.
i3c_controller = I3cController(
sda_i=dut.sda_o,
sda_o=dut.sda_i,
scl_i=dut.scl_o,
scl_o=dut.scl_i
)The I3cTimings class can be used to configure timing parameters of the controller.
Pass an object of this class to the initailizer as timings parameter to adjust the timings.
The default values are set to reflect minimal timings on the host controller side, as described by the specification, while allowing the targets to take the maximum allowed time to respond.
Refer to section 6.2 of MIPI Alliance Specification for I3C Basic Version 1.1.1 (Errata 01) for detailed information about timings.
The speed parameter of I3cController initializer can be used to scale the timings of the device, this includes all the timings defined by timings parameter.
The default value, corresponding to 1:1 scale is 12.5e6, which corresponds to 12.5MHz clocking speed of I3C.
I3cController.i3c_write- Write data from Host to Target- (default) Use
mode=I3cXferMode.PRIVATEfor Private I3C Write) - Use
mode=I3cXferMode.LEGACY_I2Cfor Legacy I2C Write)
- (default) Use
I3cController.i3c_read- Read data from Target to Host- (default) Use
mode=I3cXferMode.PRIVATEfor Private I3C Read) - Use
mode=I3cXferMode.LEGACY_I2Cfor Legacy I2C Read)
- (default) Use
I3cController.i3c_ccc_write- I3C Write CCC- For broadcast CCCs set
broadcast_dataparameter to an iterable of bytes - For directed CCCs set
directed_datato an iterable of tuples where- First element of the tuple is the address of a device
- Second element of the tuple is an iterable of bytes - data to send to the addressed device
- To use a Defining Byte set
defining_byteargument
- For broadcast CCCs set
I3cController.i3c_ccc_read- I3C Read CCC- To use a Defining Byte set
defining_byteargument
- To use a Defining Byte set
All read/write procedures issue a STOP condition on the bus by default.
However it is possible to chain the transfers with repeated start (where applicable).
In order to do it, set the stop parameter to False on any of the read/write procedures.
Eg.
data0 = await tb.i3c_controller.i3c_read(0x50, 20, stop=False)
data1 = await tb.i3c_controller.i3c_read(0x51)