DW_apb_i2c验证指南

张开发
2026/5/20 7:44:59 15 分钟阅读
DW_apb_i2c验证指南
关于IP和VIP连接的问题提到I2C都知道涉及到两根线SDA和SCL,这两根线都是被上拉电阻拉着的inout类型的线。但是DW_apb_i2c与SCL和SDA有关的端口不是简简单单的两根线而是分为ic_clk_in_aic_data_in_aic_clk_oeic_data_oe。其中ic_clk_oeic_data_oe是开漏输出open_drain。而svt_i2c_vip提供的interface是SCL和SDA两根inout类型的线IP和VIP如何连接是第一个要解决的问题。这里需要非常清楚的明白开漏输出的含义和意义。学习开漏输出和inout类型的信号的关系。如何正确理解开漏输出和推挽输出_如何理解开漏-CSDN博客集电极开路输出和漏极开路输出-CSDN博客晶体管的分类和三极管的介绍 - 知乎 (zhihu.com)下面是集电极开路Open-CollectorOC门的例子漏极开路Open-DrainOD门的道理和这个类似只不过用的器件不同而已。OC门用的是双极性晶体管三极管的一种OD门用的是MOSFET场效应晶体管之前在协议和代码注释里总是看到open drain却不明白啥意思开漏输出的设计在I2C器件的端口是必须的一是为了防止多个I2C器件挂在I2C总线上时发生短路二是开漏输出可以实现多个I2C器件的“线与”wire-and模式。同时开漏输出外面的总线必须加上拉电阻以输出高电平。这点在I2C协议里有提到过。连接代码如下assign Mtop.u_DW_apb_i2c.ic_clk_in_a i2c_if.SCL; assign Mtop.u_DW_apb_i2c.ic_data_in_a i2c_if.SDA; assign i2c_if.SCL Mtop.u_DW_apb_i2c.ic_clk_oe? 1b0 : 1bz; assign i2c_if.SDA Mtop.u_DW_apb_i2c.ic_data_oe? 1b0 : 1bz;当ic_clk_oe为1时SCL为低电平。但ic_clk_oe为高时输出为高阻态而SCL又加了上拉电阻所以表现为高电平。SDA同理。通过上述连接方式将dw_apb_i2c挂到svt_i2c_vip提供的I2C总线上。验证环境通过前述内容我们解决了如下问题如何把IP连接到I2C总线上开漏输出的连接代码逻辑如何把多个VIP的master agent和slave agent挂到I2C总线上通过配置VIP的system cfg最终我们搭建的环境其实是模拟了多个master或者slave的I2C器件挂在I2C总线上进行通讯。其中蓝色的是IP黄色的是VIP。它们都是支持I2C协议的器件。而我们的验证就是模拟这些器件之间的通讯比如通过配置IP的寄存器使其作为master发送数据给某个slave VIP。 当然这种验证行为本质是没啥意义的因为IP是人家公司的产品可以认为是golden的验肯定是验不出来什么问题。但是在实际的soc系统中i2c是被集成到某个子系统比如外设子系统再向上集成经过总线fabric最终到芯片端口的是SCL和SDA的inout类型的pin我们再走一遍这样的验证就可以确认内部的I2C发送数据是否能发送出去。 验证是在没有芯片实体的代码阶段去模拟数据的发送和接受。搭建完验证环境之后我们会遇到如下的问题如何配置dw_apb_i2c使其发送或接收数据如何配置svt_i2c_vip使其发送或接收数据根据master和slave关系可以分为四种情况dw_apb_i2c为master transmit mode发送数据给VIPdw_apb_i2c为master receive mode从VIP读数据dw_apb_i2c为slave transmit mode被VIP读数据dw_apb_i2c为slave receive mode被VIP写入数据dw_apb_i2c作为mastersvt_i2c_vip作为slavemaster transmit mode待续master receive mode待续dw_apb_i2c作为mastersvt_i2c_vip作为slaveslave transmit mode待续slave receive mode

更多文章