一.准备工作
参考I2C虚拟项目笔记(一)-virtual sequence_路科虚拟项目-CSDN博客
二.uvm_sequence部分
1.rkv_i2c_master_directed_write_packet_virt_seq
1️⃣测试目的:配置apb寄存器,将数据通过apb总线发送到DW_apb_i2c的TX_FIFO中,再通过这个fifo将数据传到I2c的slave里面。
2️⃣apb_config_sequence中:
默认这些寄存器为-1,如果配置>=0则更新到rgm里面。
3️⃣virtual_sequence中:
配置con'fig_seq里面的寄存器:
1.SPEED:IC_CON.SPEED,控制寄存器IC_CON的SPEED位,用来控制I2C的工作模式
2.IC_TAR:I2C目标地址寄存器,`LVC_I2C_SLAVE0_ADDRESS=10'b1100110011表示I2C的slave的地址。I2C目标地址寄存器的地址与IC2的slave模式的地址一直,保证可以寻址到这个slave。
3.IC_FS_SCL_HCNT
IC_FS_SCL_LCNT
最高与最低时钟周期计数寄存器,tb里面clk周期为100MHZ,一个周期为10ns,让其为200个周期则为2us,2us + 2us -> 1000/4 = 250Kb/s。范围在speed为快速模式下。
4.IC_ENABLE,启用DW_APB_I2C,应该在配置寄存器后面。
5.IC_DATA_CMD
6.rkv_apb_write_packet_seq
在rkv_i2c_master_directed_write_packet_virt_seq里面使用了rkv_apb_write_packet_seq,并且赋值了两个packet。
下图为rkv_apb_write_packet_seq的body:先镜像status的值,IC_STATUS.TFNF指TX_FIFO的状态,为0则满。此处判断不满就退出循环。 然后将packet的值给IC_DATA_CMD_DAT,把RGM_WRITE赋值给IC_DATA_CMD_CMD,即为0,表示写。
7.i2c_slv_write_resp_seq,调用i2c_slave的VIP去做write_resp这个操作。如果此语句想放到前面,则需要放在fork..jion_none里面,因为不知道I2C的VIP是否耗时。
各个参数都配置为0,给ack就行。控制i2c_slave的行为。
body如下:
8.apb_wait_empty_seq,当i2c为idle,以及TX_FIFO为空的时候退出循环,指TX_FIFO的数据全部写到了i2c,操作结束。
下表的TFE和TFNF指的TX_FIFO
4️⃣仿真结果:👇
以上分别为配置寄存器对应地址和值。