电子说
最近使用S家的I2C VIP验证芯片的外围I2C、SMBus总线,作为同样由SCL和SDA两根线支撑起的串行总线,协议相似,因此该I2C VIP也可以配置成SMBus总线使用。只需要更改其最上层的configuration即可,这一点User Guide写的很清楚,很方便。
具体到SMBus模式的使用场景,我需要在发送完一笔数据后,修改数据中的command值,即第一笔数据和第二笔数据使用的command相同,但需要修改command对应的值。该command在_agent_configuration中声明,VIP提供了reconfigure_via_task( )来更改该command。
我参考VIP中提供的示例编写了sequence,其中更改command的代码如下:
smbus_cfg.master_cfg[0].xxx_cmd = 'hxx; env.system_env.master[0].reconfigure_via_task(smbus_cfg.master_cfg[0]);
但遇到了问题,数据包发送不完,仿真会挂死在某个地方,波形上也会变成一条直线,但run.log暗示数据的确是产生了。随后,根据VIP提供的另一个示例,尝试在调用完reconfigure_via_task( )后,通过调用start( )的方式重新启动sequence,但情况没有发生改变。至此,基本定位到了问题出在调用reconfigure_via_task( )这行代码上。
重新看run.log,发现调用完该task后,VIP的master_agent[0]会被重新配置成默认标准的I2C模式上,这样问题就合理了,I2C standard模式的确发不了SMBus fast模式的数据,这也证实了run.log中现实数据产生了,但总线上没有数据的情况。
因此,解决的办法也很简单,在调用reconfigure_via_task( )之前,将SMBus相关的配置重新配置上即可。
run.log中藏着debug的信息,在出现bug时一定要仔细阅读run.log,经验+1。
这个问题也和config_db跨层传参失误有关,后面再写~
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !