I2C虚拟项目学习记录

DUT中中断信号的连接

image

对应的参数定义

parameter IC_INTR_NUM          = 12;
parameter IC_RX_OVER_INTR_ID   = 0;
parameter IC_RX_UNDER_INTR_ID  = 1;
parameter IC_TX_OVER_INTR_ID   = 2;
parameter IC_TX_ABRT_INTR_ID   = 3;
parameter IC_RX_DONE_INTR_ID   = 4;
parameter IC_TX_EMPTY_INTR_ID  = 5;
parameter IC_ACTIVITY_INTR_ID  = 6;
parameter IC_STOP_DET_INTR_ID  = 7;
parameter IC_START_DET_INTR_ID = 8;
parameter IC_RD_REQ_INTR_ID    = 9;
parameter IC_RX_FULL_INTR_ID   = 10;
parameter IC_GEN_CALL_INTR_ID  = 11;

IC_INTR_MASK的默认值

M_RX_UNDER == 1;
M_RX_OVER  == 1;
M_RX_FULL  == 1;
M_TX_OVER  == 1;
M_TX_EMPTY == 1;
M_RD_REQ   == 1;
M_TX_ABRT  == 1;
M_RX_DONE  == 1;
M_ACTIVITY == 0;
M_STOP_DET == 0;
M_START_DET== 0;
M_GEN_CALL == 1;
M_RESTART_DET_read_only == 0;
//1 means interrupt is unmasked
//0 means interrupt is masked

中断屏蔽寄存器

中断屏蔽就是有选择地让中断系统不理睬某些中断源的中断请求,使这些中断信号暂时不被CPU“感觉”,但信号仍保留,以便条件允许时再响应。CPU可用指令将其置1或置0。置0时封闭该设备的中断请求触发器INTR,使其不能将中断请求IR发出。

中断响应的条件

每当一个指令周期结束后,若中断源有中断请求(中断请求标记INTR=1),且CPU允许接受中断请求(处于开中断,EINT=1),CPU就可响应中断请求,进入中断周期。
在I2C中默认不能发出中断请求的中断源为:M_ACTIVITY、M_STOP_DET、M_START_DET、M_RESTART_DET_read_only

I2C的test

1.寄存器测试

采用寄存器模型的内建序列uvm_reg_hw_reset_seq、uvm_reg_bit_bash_seq、uvm_reg_access_seq进行测试。
uvm_reg_hw_reset_seq用于检查上电复位后寄存器模型与DUT中寄存器的默认值是否相同。对于寄存器模型,调用reset函数来使其内寄存器的值变为默认值(复位值)。
uvm_reg_access_seq用于检查寄存器的读写功能,要求寄存器的HDL路径已经完成映射。
uvm_reg_bit_bash_seq检查所有支持读写访问的阈。

rgm.reset();
uvm_reg_bit_bash_seq.model = rgm;
uvm_reg_bit_bahs_seq.start(m_sequencer);

2. I2C module status 测试

activity(start、stop)

IC_RAW_INTR_STAT bit[8] captures DW_apb_i2c activity and stays set until it is cleared.
四种清除activity中断的方式:disable DW_apb_i2c;读IC_CLR_ACTIVITY寄存器;读IC_CLR_INTR寄存器;系统复位。

该中断默认是被屏蔽的,在初始配置时,应该将其打开。然后正常读写,等待中断清除中断。

enable

使能DW_apb_i2c:关闭I2C,写数据;写数据,在未收到数据前,关闭I2C;读数据过程中关闭I2C;正常模式下是否能写。

3.interrupt

中断状态寄存器能否正确反映中断状态;中断清楚寄存器能否正常清除中断;识别不同的tx abort源;

4.data buffer

FIFO的空满溢出;TX FIFO/RX FIFO;

5. I2C协议(function description)

三种速度模式;两种寻址方式;组合传输;控制SDA hold time;restart条件;

6.timeout counter


test case

rkv_i2c_master_abrt_7b_addr_noack_test


rkv_i2c_master_abrt_10b_rd_norstrt_test

image

image

image

rkv_i2c_master_abrt_7b_addr_noack_test

image
image
image

rkv_i2c_master_abrt_sbyte_norstrt_test

image
IC_TAR

image

DW_apb_i2c被寻址为从机时,支持以最高速度对I2C进行采样,不需要start byte传输;但是当其为主设备时,支持在每次传输时生成start byte传输,以备从设备需要。switch from the under-sample sampling to the correct rate of the master;
image
image
image

在寄存器上的访问

点击查看代码
    `uvm_do_on_with(apb_user_cfg_seq, 
                    p_sequencer.apb_mst_sqr,
                    {SPEED == 2;
                    IC_10BITADDR_MASTER == 0;
                    IC_RESTART_EN == 0;
                    TX_EMPTY_CTRL == 1;     //0x0 IC_CON write 1_0100_1101
                    IC_TAR == `LVC_I2C_SLAVE0_ADDRESS;
                    SPECIAL == 1;
                    GC_OR_START == 1;       // 0x4 IC_TAR write 1111_0011_0011
                    IC_FS_SCL_HCNT == 200;  // 0x1c IC_FS_SCL_HCNT WRITE 'hc8
                    IC_FS_SCL_LCNT == 200;  //0x20 IC_FS_SCL_HCNT write 'hc8(200)
                    ENABLE == 1;            // 0x6c IC_ENABLE write 'h1
                  })
    fork
      `uvm_do_on_with(i2c_slv_write_resp_seq,
                      p_sequencer.i2c_slv_sqr,
                      {nack_addr == 0;
                      })                        
    join_none

    `uvm_do_on_with(apb_user_write_packet_seq, 
                    p_sequencer.apb_mst_sqr,
                   {packet.size() == 1; 
                    packet[0] == 8'b0101_0101;   //0x10 IC_DATA_CMD write 0101_0101
                   })
    
    `uvm_do_on_with(apb_intr_wait_seq,
                    p_sequencer.apb_mst_sqr,    //0x34 IC_RAW_INTR_STAT polling read until get 0101_0000
                   {intr_id == IC_TX_ABRT_INTR_ID;
                   })

    rgm.IC_TX_ABRT_SOURCE.mirror(status);      //0x80 IC_TX_ABRT_SOURCE read 'h00800200

    // check if interrupt output is same as interrupt status field
    if(vif.get_intr(IC_TX_ABRT_INTR_ID) !== 1'b1)
      `uvm_error("INTRERR", "interrupt output IC_RX_UNDER_INTR_ID is not high")
       
    `uvm_do_on_with(apb_intr_clear_seq,       //0x54 IC_CLR_TX_ABRT read 'h00000001
                    p_sequencer.apb_mst_sqr,
                    {intr_id == IC_TX_ABRT_INTR_ID;
                    })

    `uvm_do_on(apb_user_wait_empty_seq, p_sequencer.apb_mst_sqr) //0x70 IC_STATUS read 'h00000006

在最后一次检查到中断信号前,中断信号拉起,等到访问完中断清楚寄存器后,中断信号拉低

rkv_i2c_master_activity_intr_output_test

image

rkv_i2c_master_abrt_txdata_noack_test

image
image
image
image

地址阶段Nack,之后发起中断

rkv_i2c_master_address_cg_test

apb总线
image


寄存器访问的方法:

read:读寄存器,读回硬件实际值;操作完成后,寄存器模型根据读写的结果更新期望值和镜像值。做的任何读写,bus看到了就会更新镜像值。
write:写寄存器,修改硬件实际值;
peek&poke:后门访问的方式读取/修改硬件实际值,操作完成后,rgm更新镜像值和期望值。
mirror:读回硬件实际值,更新寄存器模型镜像值和期望值。
set&get:修改/获取register和field的期望值。
update:检查寄存器的期望值和镜像值是否一致,若不一致,将期望值写入DUT,并更新镜像值,使其与期望值一致。
randomize:randomize期望值,镜像值不变。

posted @ 2023-09-13 22:43  yoy116  阅读(317)  评论(0)    收藏  举报