(UVM验证学习12) apb timer源码阅读和标准阅读

本文详细介绍了APB Timer的源码阅读和标准阅读,涵盖了寄存器操作、中断处理逻辑以及时钟使用。重点讨论了读写操作、计数器递减条件、中断生成条件以及时钟信号对寄存器操作的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

源码阅读

首先是寄存器信息,RELOAD寄存器和Current VALUE寄存器和wdog基本一致,一个各个位对应不同控制信号的CTRL控制寄存器,一个中断寄存器

// Programmer's model
// 0x00 RW    CTRL[3:0]
//              [3] Timer Interrupt Enable
//              [2] Select External input as Clock
//              [1] Select External input as Enable
//              [0] Enable
// 0x04 RW    Current Value[31:0]
// 0x08 RW    Reload Value[31:0]
// 0x0C R/Wc  Timer Interrupt
//              [0] Interrupt, write 1 to clear
// 0x3E0 - 0x3FC  ID registers

首先获取读写操作信息,如果是写,要知道写的是CTRL,CURVAL,RELOAD,INTERRUPT那个寄存器

// Read and write control signals
assign  read_enable  = PSEL & (~PWRITE); // assert for whole APB read transfer
assign  write_enable = PSEL & (~PENABLE) & PWRITE; // assert for 1st cycle of write transfer
assign  write_enable00 = write_enable & (PADDR[11:2] == 10'h000);
assign  write_enable04 = write_enable & (PADDR[11:2] == 10'h001);
assign  write_enable08 = write_enable & (PADDR[11:2] == 10'h002);
assign  write_enable0c = write_enable & (PADDR[11:2] == 10'h003);

对对应的寄存器(CTRL,RELOAD,CURVAL)进行写操作,注意cur_val寄存器除了要响应写操作,当计数器正常计数时,也需要随时钟更新值,这部分逻辑也在这里。

// Write operations
  // Control register
  always @(posedge PCLKG or negedge PRESETn)
  begin
    if (~PRESETn)
      reg_ctrl <= {4{1'b0}};
    else if (write_enable00)
      reg_ctrl <= PWDATA[3:0];
  end

  // Current Value register
  always @(posedge PCLK or negedge PRESETn)
  begin
    if (~PRESETn)
      reg_curr_val <= {32{1'b0}};
    else i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值