I2C学习笔记——01 slv_mon_common、slv_mon、slv_agt

I2c_slave_monitor extends uvm_monitor;

        xact_observed_port:当总线上观察到完整trans写入;

        data_observed_port观察到数据立刻写入;例化slave_mon_common、agent_config;

        函数new()创建两个port;函数build_phase:get cfg、判断I2C_agent_configuration中set_I2C_if是否成功;创建common并给cfg;I2C_cfg中i2c_if给i2c_common中assign_vif连接;

        任务received_and_sent(主要):创建trans、trans_tmp;→调用mon_com中collect_transfer任务→①调用monitor_start()函数 forever块中等待一个SDA下降沿,如果此时SCL为高且start_flag=0(启动)并且start_flag置1、end_flag置0;如果SCL为高且start_flag=1,说明重新启动rs_flag = 1;

②并行执行monitor_end(trans)函数 forever中等待一个SDA上升沿,如果此时SCL为高且start_flag=1(停止),mon.data给trans.data并清空,j=0恢复初始,end_flag=1;

③并行执行data_ana(trans),等待start_flag后flag_1置1(只执行一次);进forever等待flag_1或rs_flag,如果rs_flag=1(重复启动)rs_flag=0;for循环将SDA传送的从地址数据放入mon_data[ j ] [i0:7]中(开始例化的队列);等一个SCL上升沿收集并检查总线上返回的ACK或NACK(在上升沿前一个下降沿,slv_drv判断地址后已经返回);casex中8'b0000_001x,8'b0000_010x,8'b0000_011x报错;

        8'b0000_0000:I2C_GEN_CALL ;j++;(与drv同步) 收集后8位数据放入mon_data [j+1] [i0:7]中;收集并检查总线上返回的ACK或NACK;如果没有收到end_flag结束和rs_flag重复启动,将SDA数据放入tmp_data[m] (与slvdrv区别是需要收集9位数据m=9);当m从9→0后,将前七位数据放mon_data[j], 并收集返回的ACK或NACK,m重新为9,j++,继续下一组数据传输;结束后判断如果rs_flag=1,并且j!=0(代表有数据传递),将收到的数据传给 trans.data,并清空mon_data,j=0;

        default:不是保留位的情况

        mon_data[j][0]==0写:判断是否I2C_DEVICE_ID,将trans.cmd 设为I2C_WRITE;将接收到的地址传送给trans.addr[6:0];在没有收到end_flag结束和rs_flag重复启动情况,将SDA数据放入tmp_data[m],当m从9→0后将tmp_data[9:2]数据放入mon_data[j]中,tmp_data[1]检测返回的ACK、m重新为9,j++,结束写;结束后判断如果rs_flag=1(重复启动条件、slave_start将其置为1),并且j!=0(代表有数据传递),将收到的数据传给 trans.data,并清空mon_data,j=0;

        mon_data[j][0]==1读:只把trans.cmd 设为I2C_READ 其他和写一样;

        

        collect_transfer完毕后,forever块中等待trans.data.size!=0(收集到了数据)或end_flag(结束),trans克隆给trans_tmp,通过两个port发送、打印、清空trans中data,并end_flag=0;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值