AHB to APB Bridge验证项目_ahb转apb 协议一致性验证-CSDN博客
一、项目介绍:
根据spec功能描述与协议来制定验证计划,进行测试点分解。采用了常规的UVM验证框架,(ahb2apb桥接器两端为ahb的slv与apb的mst)在DUT两侧放了两个agent:ahb_mst_agt和apb_slv_agt, 分别包括了sqr, drv和mon。在agt,DUT的同一层次添加了scb,没有做ref mdl,把比较的方法放在了scb里,之后做了顶层env,tb,以及interface,将if通过多次config_db的set,get方式从tb传到agt,再到drv,这过程包括了将TB硬接口到UVM环境vif的传递。通过UVM的phase机制进行仿真,通过port端口drv向sqr发出item的请求(他们之间pot无需声明但要connect),seq中的body的task产生相应的随机item,通过sqr发送给drv,驱动到总线上送入DUT,然后两个agt中的mon都采样到scb。后面在TB中对apb active,ahb的rsp与ready等加入了断言并成功。
说明:
1、在apb_slv_agt里添加了is_active的标记,在后期作集成时能够对sqr和drv进行限制,来实现vip/uvc的可重用性。首先用简单case进行环境调试,在各个testcase的run phase里将seq挂载到sqr用start方式开始运行。(验证中先用简单case调试环境,再用随机case覆盖大部分点,最后用定向case击中corner部分)
2、Bridge是一个AHB slave,它在APB总线一侧是唯一的master,而在AHB一侧,它只是其中一个slave。
二、实际 UVM 验证平台示意图
AHB为mater,APB为slave。
三、项目问题准备(1)
3.1、2个单比特的ahb传输,不采用burst时,时序是怎么样的,apb呢?
当不采用burst时,每个传输周期只能传输一个数据,因此时序比较简单。AHB到APB桥项目中单比特AHB传输时,时序如下:1.AHB输入地址和控制信号。2.AHB传输数据。3.AHB传输完成后,APB输入地址和控制信号。4.APB传输数据。5.APB传输完成。
3.2、如何查看你的时钟分频验证是否成功?
在AHBtoAPB bridge项目中,可以通过以下步骤来查看时钟分频验证是否成功:1.打开时钟分频的代码文件,查看是否正确设置了时钟分频的参数。2.在仿真工具中设置时钟频率和时钟分频参数,并运行仿真。3.在仿真结果中,观察APB总线上的时钟频率是否正确。4.可以通过读取APB总线上的寄存器值来验证时钟分频是否成功。例如,可以读取一个APB从设备的寄存器值,观察读取结果是否正确。5.如果时钟分频验证失败,可以检查代码和仿真设置是否正确,并进行适当的修正。
3.3、项目中遇到的问题,如何解决?
1.连续读写的问题:背靠背传输(写传输之后跟着读传输,之后是写传输再之后是读传输)。
按照原本ahb_mst_driver的写法,发送一个single的写操作后,接着再发送一个single的读操作会有以下问题:在ahb_mst_driver 拿到第二个req,即开始第一个transcation的data 传输时,hwrite会同时拉低,无法保证apb传输时pwrite稳定。修改driver,与上一个transaction的读写比较,不同的话 ,当等待hready拉高,开始传输。
修改:在连续两个不同PWRITE信号的transaction 之间加入IDLE
2.AHB在连续传输时,存在地址周期和数据周期交叠的情况。如果使用transaction按一个burst的形式发,可以通过声明两个transaction类的句柄(addr_pkg 和data_pkg)来轮转,解决data_phase和addr_phase 交叠的问题。
-
首先,在时钟上升沿先判断data_pkg是不是空包,如果是null,再判断addr_pkg是不是null,如果是,那就通过try_next_item( ) 获取一个新的burst transaction。
-
当获取到这个addr_pkg时,就把这个data_phase发到总线上(只发送一个address),并且将addr_pkg句柄赋值给data_pkg,也就是addr_pkg 和data_pkg指向同一个transaction对象。此时这一拍时钟沿结束,等待下一拍。
-
当下一拍时钟沿到来时,首先判断data_pkg就不为null了,会将data_pkg中的data数据发送到总线上(只发送一个data)。然后
如果此时data_pkg 和addr_pkg 句柄指向的transaction内还有没发完的data和address,就会继续再往总线上发一个address ,然后又会等到下一拍,将address对应的data发到总线上。 -
由此不断地先发address 再发data循环,直到将transaction中保存address 和data的队列或数组发空为止,结束这个burst,把data_pkg 和addr_pkg 句柄指向null 。再获取一个新的transaction。
3.4、ahb的ready信号怎么验?
通过断言定义了对AHB接口中hready
信号的验证规则。在hclk
的上升沿,当hresp
信号(来自从机的传输响应)变为高电平时,期望在下一个hclk
上升沿时hready
信号也为高,并且这个高电平是新出现的,即在上一个时钟周期hready
不是高电平。这种验证确保了在响应信号表示事务完成之后,就绪信号能够正确地进行切换,从而保证AHB接口的事务能够顺利进行。
说明:断言用于检查设计中的特定属性是否被满足。如果属性未被满足,断言将失败,并可能产生错误或警告,以便于设计者识别和修复问题。
3.5、ahb和apb的monitor抓取的数据一样吗,为什么?
3.6、目的测试点有多少?
3.7、怎么让uvm区分不同的case?
可以在仿真的命令行中使用+UVM_TEST_NAME
参数来指定要运行的测试用例名称。例如,使用<sim command> +UVM_TEST_NAME=my_case0
来启动my_case0
测试用例,或者使用+UVM_TEST_NAME=my_ case1
来启动my_case1
测试用例。
3.8、burst传输和single传输的区别?
AHB支持burst和single传输。
single传输分地址阶段和数据阶段。地址阶段需要一个周期。数据阶段需要一个周期。
burst传输,在突发传输开始,第一个周期里,主机传入地址和控制信号,传输的类型是NONSEQ;第二个周期传送第二个地址以及第一个地址对应的数据,并由HBURST信号决定需要几个有效周期。在此之间可以由HREADY发出请求延长一个周期。
不考虑burst传输的时候,ahb一次数据传输至少需要两个clk周期
3.9、apb的PSTRB信号怎么验?
PSTRB信号,即写选通信号,允许在一次32位的传输中指定哪些字节是有效的。具体来说,PSTRB是一个4位宽的信号,每一位对应PWDATA中的一个字节,当PSTRB的某一位被置为高时,表示相应的字节是有效的。在读传输期间,PSTRB信号应该保持低电平。
1、通过AHB总线发起一个写事务,设置HADDR为选定的APB从设备地址。2、设置HWRITE为1,表示写操作。3、设置PWDATA为一个32位的测试数据模式,例如32'hAAAAAAAA
。4、配置PSTRB,使得只有特定的字节有效,例如PSTRB[0]和PSTRB[2]置为1,其余置为0,表示只有PWDATA的第1和第3个字节(从0开始计数)有效。5、发送写事务请求,并等待APB从设备响应。6、在APB从设备端监控PRDATA信号,验证只有PSTRB指示的有效字节被写入。
期望结APB从设备的PRDATA信号应只包含PWDATA中由PSTRB指定的有效字节,即如果PWDATA为32'hAAAAAAAA
,PSTRB为4'b0101
,则期望PRDATA为32'h0A0A0000
。
验证点:1、PSTRB信号能否正确指示PWDATA中有效的字节。2、写事务是否只更新了由PSTRB指定的有效字节。3、测试数据模式是否符合预期,未被选中的字节位是否保持不变。
3.10、AHB的边界地址怎么确定
AHB总线的边界地址确定与传输类型(HBURST)和传输大小(HSIZE)有关。对于回环突发传输(WRAP),地址会在达到特定边界时回环到起始地址。这个边界是根据burst传输的次数和每次传输的数据大小来计算的。例如,对于WRAP4类型的burst,如果HSIZE为4字节(32位),则地址会在每16字节(即4拍,每拍4字节)后回环。这意味着,如果起始地址是0x34,那么地址会在0x34、0x38、0x3C后回环到0x30,因为0x40是16字节的边界 190。
对于增量突发传输(INCR),地址会根据每拍数据的大小递增,可以传输任意次数,但唯一的限制是地址不能超过1KB边界。这意味着,如果按照字(4字节)进行增量传输,那么地址会在每拍后增加4字节,直到达到1024字节(1KB)的边界 190。
AHB协议要求所有操作的地址都必须是对齐的。对齐地址是由每拍传输的数据宽度决定的。例如,如果传输数据的宽度是4字节(32位),那么对齐地址必须是4的倍数,如0x00、0x04、0x08等 190。
在设计AHB总线系统时,必须确保地址对齐和在回环突发传输中正确处理地址边界,以保证数据传输的正确性和效率。
四、问题准备(二)
4.1、AHB的burst操作有哪些类型,区别在哪里。
AHB的burst操作主要有Single、INCR、WRAP等类型,它们的区别主要在于数据传输的模式和地址增量方式:
-
Single: 单次传输,不构成burst,每次传输都是独立的。
-
Incrementing bursts (INCR): 增量突发,每次传输的地址是前一次地址的增量。这种类型的burst可以是未定义长度的(由master决定何时结束burst,这种类型的burst可以通过BUSY传输来提前终止),也可以是固定长度的(如INCR4、INCR8、INCR16 它们有预定的传输次数,并且必须以SEQ传输结束,不能使用BUSY传输来提前终止 ),地址会在每次传输后递增,不会在边界处回绕 。
-
Wrapping bursts (WRAP): 回环突发,当突发传输达到特定的地址边界时,地址会回绕到该边界的开始处。例如,WRAP4表示4拍突发,地址在每4次传输后回绕到边界的起始地址 (它们有预定的传输次数,并且必须以SEQ传输结束,不能使用BUSY传输来提前终止 )。
4.2、AHB的HTRANS信号的用途。
HTRANS
信号的用途是表示当前传输的状态,允许从设备了解主设备当前的传输意图,并据此做出响应。例如,如果HTRANS
为IDLE,从设备知道可以忽略当前的传输,因为主设备并不需要进行数据交换;如果HTRANS
为BUSY,从设备可能需要保持当前状态,等待主设备准备进行下一个传输。NONSEQ表示非顺序传输,即当前传输与上一个传输无关,是单一传输或者是一次突发传输的第一个。SEQ表示顺序传输,当前传输是连续突发传输的一部分,与上一个传输相关。
4.3、AHB to APB bridge中,如果出现burst操作,APB侧只能实现single传输,如何对数据进行匹配。
通过握手机制确保即使在AHB和APB之间存在性能差异的情况下,数据传输也能以受控和同步的方式进行。通过HREADY
和PREADY
信号的协调,AHB to APB桥接器能够有效地管理数据流,并确保数据的完整性和正确性。
AHB协议中的HREADY
信号由从设备(slave)驱动,用来指示从设备是否准备好进行下一次数据交换。在burst传输中,如果APB侧需要更多时间来处理数据,它可以将HREADY
信号拉低,表示需要AHB主设备(master)等待。当AHB桥接器观察到HREADY
为0时,它会暂停数据传输,直到HREADY
变回1,表示APB侧已经准备好接收下一个字节的数据。一旦APB侧准备好,它会通过PREADY
信号告知AHB桥接器。随后,AHB桥接器会在下一个AHB时钟周期继续发送数据。AHB主设备在每个时钟周期检查HREADY
信号,确保在继续发送数据之前APB从设备已经准备好。当burst传输的所有数据都被APB从设备接收后,握手协议完成,AHB主设备可以开始新的传输或者终止当前传输。
4.4、APB的driver中,具体将数据发送出去的部分是怎么写的。
数据发送的具体部分主要在drive_wr_pkt
和drive_rd_pkt
这两个任务中实现:
drive_wr_pkt
任务:当APB总线上的事务是一个写事务时(即vif.slv_cb.pwrite
为真),此任务被调用。在该任务中,如果事务没有错误(!pkt.slverr
),则执行内存写操作。使用mem.put_data
方法将数据写入到由vif.slv_cb.paddr
指定的地址,数据来源于vif.slv_cb.pwdata
:virtual task drive_wr_pkt(apb_tran pkt); if(!pkt.slverr)begin mem.put_data(vif.slv_cb.paddr,vif.slv_cb.pwdata); end endtask
drive_rd_pkt
任务:当APB总线上的事务是一个读事务时,此任务被调用。如果事务没有错误,使用mem.get_data
方法从vif.slv_cb.paddr
指定的地址读取数据,并将结果赋值给vif.slv_cb.prdata
。如果事务有错误,则直接将pkt.data
赋值给vif.slv_cb.prdata
,模拟错误情况:virtual task drive_rd_pkt(apb_tran pkt); if(!pkt.slverr)begin vif.slv_cb.prdata <= mem.get_data(vif.slv_cb.paddr); end else begin vif.slv_cb.prdata <= pkt.data; end endtask