记录一下使用I2C VIP验证芯片的一个bug

电子说

1.3w人已加入

描述

最近使用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相关的配置重新配置上即可。

 


SMBus

 

run.log中藏着debug的信息,在出现bug时一定要仔细阅读run.log,经验+1。

这个问题也和config_db跨层传参失误有关,后面再写~

审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分