AHB-to-APB Bridge——08burst_test(rdy、nrdy、slverr、tight)、地址

news/2024/12/3 0:29:55/

-------------- burst_test:与single_test不同的是,需要在run_phase中使用fork join 让AHB侧和APB侧同时工作(不能等AHB都发完APB才工作);num_apb_seq为APB已传输的个数,当APB侧传输数据的个数,大于或等于AHB侧的总数据个数后,跳出循环;

class ahbl_mst_burst extends ahb2apb_base_test;ahbl_mst_burst_seq ahbl_mst_seq_i;apb_slv_nrdy_seq            apb_slv_seq_i;`uvm_component_utils(ahbl_mst_burst)function new(string name,uvm_component parent=null);super.new(name,parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);ahbl_mst_seq_i = ahbl_mst_burst_seq::type_id::create("ahbl_mst_seq_i",this);apb_slv_seq_i = apb_slv_nrdy_seq::type_id::create("apb_slv_seq_i",this);endfunctionvirtual task run_phase(uvm_phase phase);int num_apb_seq;phase.raise_objection(this);super.run_phase(phase);#100us;fork//使用fork join 让AHB侧和APB侧同时工作(不能等AHB都发完APB才工作)beginahbl_mst_seq_i.start(env_i.ahbl_mst_agt_i.sqr_i);endbeginnum_apb_seq = 0;while(1)beginapb_slv_seq_i.start(env_i.apb_slv_agt_i.sqr_i);num_apb_seq++;if(num_apb_seq >= ahbl_mst_seq_i.req.get_bst_beats())beginbreak;//APB侧传输数据的个数,大于或等于AHB侧的数据个数后,跳出循环endendendjoinphase.drop_objection(this);endtaskendclass

burst_seq中:将htrans、hsize、hburst、hwrite注释掉(全部随机)

class ahbl_mst_burst_seq extends ahbl_mst_basic_seq;function new(string name="ahbl_mst_burst_seq");super.new(name);endfunction`uvm_object_utils(ahbl_mst_burst_seq)virtual task body();`uvm_do_with(req,{hsel == 1'b1;//htrans == ahbl_mst_pkg::NSEQ;// hsize  == ahbl_mst_pkg::WORD;//hburst == ahbl_mst_pkg::SINGLE;//hwrite == 1'b1;})endtask
endclass

---------- burst_test_slverr:每次传输slv侧slverr为1,随机1:5个周期的nready:

class apb_slv_slverr_seq extends apb_slv_basic_seq;function new(string name = "apb_slv_slverr_seq");super.new(name);endfunction`uvm_object_utils(apb_slv_slverr_seq)virtual task body();`uvm_do_with(req,{slverr == 1'b1;nready_num inside {[1:5]};})endtask
endclass

 AHB侧收到SLVERR的波形为第一个周期HRESP为高,HREADYOUT为低;第二个周期都为高;

对于AHB协议中所讲,遇到ERRO可以立即停掉或者传输完毕给IDLE;

 --------------burst_tight_transfer(紧密传输两个burst):基本相同,例化两个相同的burst_seq,再run_phase中先后使用,并先后分别判断传输数量后跳出循环;

class ahbl_mst_tight_transfer extends ahb2apb_base_test;ahbl_mst_burst_seq ahbl_mst_seq_0;ahbl_mst_burst_seq ahbl_mst_seq_1;apb_slv_nrdy_seq   apb_slv_seq_i;`uvm_component_utils(ahbl_mst_tight_transfer)function new(string name,uvm_component parent=null);super.new(name,parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);ahbl_mst_seq_0 = ahbl_mst_burst_seq::type_id::create("ahbl_mst_seq_0",this);ahbl_mst_seq_1 = ahbl_mst_burst_seq::type_id::create("ahbl_mst_seq_1",this);apb_slv_seq_i = apb_slv_nrdy_seq::type_id::create("apb_slv_seq_i",this);endfunctionvirtual task run_phase(uvm_phase phase);int num_apb_seq;phase.raise_objection(this);super.run_phase(phase);#100us;forkbeginahbl_mst_seq_0.start(env_i.ahbl_mst_agt_i.sqr_i);ahbl_mst_seq_1.start(env_i.ahbl_mst_agt_i.sqr_i);endbeginnum_apb_seq = 0;while(1)beginapb_slv_seq_i.start(env_i.apb_slv_agt_i.sqr_i);num_apb_seq++;if(num_apb_seq >= ahbl_mst_seq_0.req.get_bst_beats())beginbreak;endendwhile(1)beginapb_slv_seq_i.start(env_i.apb_slv_agt_i.sqr_i);num_apb_seq++;if(num_apb_seq >= ahbl_mst_seq_1.req.get_bst_beats())beginbreak;endendendjoinphase.drop_objection(this);endtaskendclass

 第一个随机burst是WORD读操作,第二个是HALFWORD写操作;

AHB写操作第一个5666说明写入高两个字节有效为AB6C3EE5;第二个5668说明低两个字节有效为477EF246;APB端地址总是一次加4,PSTRB信号代表了地址是高有效还是低有效,C为1100说明高有效,3为0011说明低有效;(PSTRB仅用于写,说明了哪个字节数据是有效)

 

-------------------------------地址解读:32位一次传4字节,地址0、4、8、C变化;

 16位一次传2字节HalfWord,地址0、2、4、6、8、A…变化;

 如地址0X42,HWORD传输,随机出来的32位数据只有高两个字节有效;低两个字节无效;

 


http://www.ppmy.cn/news/100324.html

相关文章

【Linux】Pinctrl具体框架——Linux学习笔记

简介 Linux Pinctrl (Pin control)是一个子系统,允许开发者控制芯片引脚的复用、电气属性和其他相关设置。在Linux内核中,Pinctrl是一个重要的组件,提供了硬件抽象层,让开发者在进行驱动程序开发时可以更加…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-13

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-13 Java内存模型与线程Java内存模型原子性、可见性与有序性先行发生原则 Java内存模型与线程 Java内存模型 原子性、可见性与有序性 Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来…

多线程基础知识

( 1 ) 传统使用类Thread和接口Runnable实现 1. 在Thread子类覆盖的run方法中编写运行代码 方式一 new Thread(){ Override public void run(){ while(true){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.star…

不成方圆 - 中日互译模型

Github 占位仓库:https://github.com/One-sixth/BuChengFangYuan-ChineseJapaneseTranslation Huggingface 模型仓库:https://huggingface.co/spaces/twdac/BuChengFangYuan-ChineseJapaneseTranslation 不成方圆-中日互译 名称:不成方圆 -…

C#面向对象详细知识点

文章目录 1.面对对象的概念2. 面对对象-封装修饰符摘要表 3. 面对对象-继承4.面对对象-多态5.面对对象相关知识点补充(1)命名空间(2)关于修饰类的访问修饰符(3)万物之父中的方法(4)S…

十万个C语言冷知识

1.printf返回值&#xff1a; 成功&#xff1a;返回打印字符的个数 失败&#xff1a;返回EOF&#xff0c;EOF是文件结束的标志&#xff0c;宏定义为-1 #include <stdio.h> int main() {char str[] "123456789";printf("%d\n", printf("%d\n&quo…

vue常见面试总结

1.vue生命周期 2.组件传值 3.插槽&#xff1a;具名插槽&#xff1a;<slot name"header">slot> 作用域插槽 4.对 MVVM 的理解:MVVM 是 Model-View-ViewModel 的缩写,核心是提供对View 和 ViewModel 的双向数据绑定&#xff0c;这使得ViewModel 的状态改…

数据类型变量的命名规则转义字符(概念及详解)

数据类型&#xff1a; 序号符号类型占空间大小&#xff08;字节&#xff09;初始化1char字符数据类型1char ‘a’ ; 或 char “abc”;2short短整型2short a 0;3int整形4int a 0;4long长整型4long a 0;5long long更长的整形8long long a 0;6float单精度浮点型4float a …