AHB-SRAMC项目中,应用的总线正是AMBA总线中的AHB总线。
1.AMBA总线的简要概述(关于AMBA总线的详细内容参见《AMBA总线》pdf):
AMBA总线中,有三种总线:AHB(高速)、ASB和APB(低速),高低速总线之间,通过bridge进行连接。
在总线上,挂有主设备master和其他子设备slave。在总线上传输的每一次动作(读数据写数据均是),都是由主设备master发起的,slave进行响应。因为总线上挂有多个master和slave,因此需要arbiter(仲裁器)来决定当前总线应该由哪一个master来控制使用权。decoder(解码器)用来选择传输slave的读出数据。
AMBA总线的具体应用步骤:
1)master向arbiter发送一个请求信号,arbiter决定是否让该master使用AMBA总线,若允许,则该master控制AMBA总线的使用权。
2)master开始在AMBA总线上传输地址和控制信号。具体信号包括:方向、传输宽度和传输类型,后传输数据信号。
3)slave接受以上信号并作出读、写操作,并在AMBA总线上发送数据信号和ready信号。
PS:AHB总线传输分为两步,地址周期和数据周期。首先是地址周期,总线传输addr、contral信号;数据周期总线传输wdata、rdata、ready信号。
下表详细介绍了AMAB总线中的AHB总线上各个信号的定义以及信号的产生与传输方向。
依照上述信号描述,基础的传输波形图为
传输过程分为address phase和data phase两个阶段,第一个阶段master发送地址和控制信号,第二个阶段master或slave发送data信号和ready信号。
2.AHB设备接口
master接口
slave接口
arbiter接口
decoder接口
3.AHB-SRAMC项目(AHB总线)
1)RAM内部构架(slave,也是该验证项目的DUT):
2)AHB-SRAMC验证构架
根据参考代码,我自己绘出的AHB-SRAMC验证构架图实际是
代码编写思路:
1.由AHB-Slave接口信号编写ahb-slave-interface代码
`ifndef AHB_SLV_IF_SV //预编译
`define AHB_SLV_IF_SV
interface ahb_slv_if(input hclk);
logic hresetn; //接口信号列表,和下面drv_cb与mon_cb接口列表所包含的信号相同
logic hsel;
logic hwrite;
logic hready;
logic [1:0] htrans;
logic [2:0] hsize;
logic [2:0] hburst;
logic [31:0] haddr;
logic [31:0] hwdata;
logic hready_resp;
logic [1:0] hresp;
logic [31:0] hrdata;
clocking drv_cb@(posedge hclk);
output hsel; //drive按照DUT,区分其中的output和input接口信号
output hready;
output haddr;
output htrans;
output hsize;
output hwrite;
output hwdata;
input hrdata;
endclocking
clocking mon_cb@(posedge hclk);
input hsel; //monitor接收接口上的所有信号,均为input,后续通过mailbox传递给scoreboard进行check
input hready;
input haddr;
input htrans;
input hsize;
input hwrite;
input hwdata;
input hrdata;
endclocking
modport driver(clocking drv_cb);
modport monitor(clocking mon_cb);
endinterface
`endif
2.利用接口信号进行数据建模,数据包transaction代码
`ifndef TRANSACTION_SV
`define TRANSACTION_SV
class transaction;
rand bit [31