AHB_GPIO模块解读

目录

AHB_GPIO模块解读

gpio通俗来讲就是专门对引脚进行控制的模块,他提供了16bit的i/o的intrface,而gpio的目标是将数据发送到有限的pad引脚上,gpio可以对外部的pad和内部的信号进行管理,当然,理论上这两个可以直连,但是这会造成极大的资源浪费,因为引脚的数量再多也没有信号多。
AHB_GPIO具有如下能力:1.可通过编程生成中断功能。 2.支持bit的掩码功能。 3.采用两级触发器对输入进行采样来避免亚稳态问题。而AHB-GPIO的两大特性是:生成中断和屏蔽访问。

AHB协议

既然是ahb-gpio,首要的就是通过ahb接口实现了对gpio接口数据的传输控制。我们可以看到,整个AHB-GPIO模块暴露出来的接口有如下几个:属于AHB端的FCLK,HCLK,HADDR,HTRANS,HSIZE,HWRITE,HREADY,HWDATA,HRDATA等等,而属于GPIO的有:PORTIN,PORTOUT,PORTEN,PORTFUNC,GPIOINT,COMBINT。
在这里插入图片描述
AHBRAM是一个以AHB协议通信的RAM存储模块,其中,通信协议AHB采用了简化版:
1、只有一个master和一个slave,hgrant = 1;
2、模块预置条件:每次传输均正确且传输完成,hready = 1,hresp = okay;(对代码覆盖率有影响)
3、单时钟沿变化;
4、支持burst传输,但只考虑single传输,即hburst = single,htrans = idle / Nonseq两种状态;

AHB_GPIO验证结构图

在这里插入图片描述
tb中主要包括AHB_GPIO模块的例化、模块与验证平台接口的连接,config_db机制将lvc_ahb_if传递于env的agent里,将rkv_gpio_if传递到base_test层里面例化的config里。
在base_test中例化了enviroment, config,与寄存器模型,在顶层test中配置config组件,通过config_db机制将config组件set到底层的env组件中,config组件中的rgm句柄指向寄存器模型实例,这样底层的组件通过调用cfg.rgm就可以索引到寄存器模型,方便后期代码修改。
验证环境env中例化了ahb_mst_agent, virtual_sequencer, scorboard, coverage, adapter和predictor, ahb_mst_agent包括driver, sequencer, monitor,同時將monitor的uvm_analysis_port连接到scoreboard和coverage_model的uvm_analysis_imp中。

测试序列

(1)base_virtual_sequence:
包含了compare_data(), wait_ready_for_stim(),wait_cycles()等方法,其它的virual_sequence继承于base_virtual_sequence;
(2) portout_set_virt_seq:在seq中,我们首先向PORTIN写数据(即pin_dr),储存在GPIO的寄存器中,再从AHB端读出来(pin_rd),对这两个数据进行比较,之后,我们再从AHB接口写进去(pout_rd),从portout读出来(pout_mo),再进行比较。
(3) interrupt_set_clear_virt_seq:
生成中断,这是由三个寄存器所控制的,分别是interrupt enable, interrupt polarity, interrupt type,每个寄存器都有单独的设置和清除地址,可以用来配置i/o引脚的每一位来生成中断。在存储中断后,会导致gpioint信号的响应位被断言,并且组合中的中断信号combint也被断言,我们还可以使用中断处理程序清除中断,即将1写入intclear寄存器的相应位。需要注意的是,在中断检测期间,自由运行时钟信号FCLK必须处于活动状态,中断生成有三个周期的等待时间,其中两个周期用于输入信号的同步,一个周期用于记录中断状态。
(4)masked_access_virt_seq:
在测试中,我们只需要首先对portout写入数据,之后进行mask操作将其输出,设计一个局部变量portout_expected,将这两组数据进行对比即可。

生成中断

而在tb中,我们可以首先针对16个中断bit进行遍历,这两层foreach可以针对当前bit进行不同类型和不同极性的4种组合的扫描,每个中断位都可以设置成不同的类型(电平触发和边缘储发)以及不同的极性。在配置完成后,我们从port的每一维输入激励来触发中断,之后中断使能,并且我们在确保使能之前,两个外部的新信号位0,之后我们可以通过gpio的外部信号(gpioint 和 combint) 对是否完成中断进行判断,如果这一个bit成功的实现了四种不同情况的中断功能,我们再去检查剩余位的中断。
在这里插入图片描述
在这里插入图片描述

屏蔽访问

在这里插入图片描述
在这里插入图片描述
掩码访问允许一次传输中访问(写/读)单独的一位或是多位数据, 这避免了软件层面上线程不安全的read-modify-write操作 (比如某个线程A只想写一个八位寄存器的最低一位为0,然后它读了一次这个寄存器,发现寄存器的值为1111_1111,随后这个线程A要求向这个寄存器写入1111_1110以实现目标,但是如果另一个线程B在A读寄存器之后,写寄存器之前已经将寄存器值修改为0000_0001,A线程的写操作就覆盖掉了B的操作,就是线程不安全的)

在GPIO中,16bit 的I/O管脚分为了lower byte和high byte两部分.掩码地址空间被定义为两个数组(分别对应lower byte和higher byte),每个数组包含256个byte(2^8=256), 即每个字对应了一种掩码,或者说数组中的每个元素一一对应对应了一个8位的01序列.
换种说法就是一个数组有256个元素,那么元素的序号就对应了一种掩码访问,序号1对应只访问低一位,序号254=1111_1110对应只访问高7位,最低一位不访问.通过把1byte写入数组的元素,元素的值加上其本身的序号就可得到掩码访问数值.比如序号254元素的值为1010_1110,加起来的意思就是将数据的高七位写为1010_111,最低一位不做修改。
以標準的low byte爲例:
在这里插入图片描述

项目难点

在检查数据時候X的影响:
portout_set_virt_seq中:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一开始的compare_data():
在这里插入图片描述
portout_set_virt_seq中对portout检查:
在这里插入图片描述
結果:报错。
加入bit wildcmp:
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值