APB VIP的开发(含APB 接口断言)
APB总线协议详解
APB 信号列表
由上表可以看出,APB信号主要有系统信号(PCLK、PRESETn)、地址信号(PADDR[31:0])、方向信号(PWRITE)、数据信号(WDATA[31:0]、PRDATA[31:0])和传输阶段控制信号(PSELx、PENABLE)五部分组成。
APB 状态机
@1、系统初始化为IDLE状态,此时没有传输操作,也没有选中任何模块
@2、SETUP状态:准备阶段,当有传输要进行时,PSELx=1,PENABLE=0,维持一个周期,下个clk上升沿来临时系统进入ENABLE状态。
@3、ENABLE状态:维持之前的PADDR、PSEL、PWRITE不变,将PENABLE置1。维持一个周期,非连续传输——进入IDLE;连续传输——进入SETUP
读操作(重要)
在 T1 时,有限状态机进入预设的 IDLE 状态;
在 T2 时,数据地址、读写控制信号和写入的数据会在频率正沿触发时,开始作写的数据传递准备,这个周期也就是刚才所提及SETUP状态。译码电路在此状态会根据数据地址去译码出所要写入APB Slave,此时所对应到 S 的 PSEL 信号将由 0 变 1;
在 T3 时,有限状态机会进入 ENABLE 状态,PENABLE 信号在此状态会被设成 1;
在 T4 频率正沿触发时,PENABLE 信号将由 1 变 0,而 PSEL 信号在若没有其它数据的写入动作时,也将由 1 变 0。为了减少功率的消耗,APB 的数据地址和读写控制信号在下一笔数据传递前,将不会作任何改变。
读操作(重要)
由图中可发现除了写信号是倒过来有效外,APB 读操作时序图和写操作时序图非常相似,在这里我们就不再作详细的解释。
要特别注意
的是,在 T3 后,也就是在进入 ENABLE 周期后,APB 从必须要将 M 所要读取的数据准备好,以便 M 可以在 ENABLE 周期末被 T4 正时钟沿触发时正确的将数据读取。
主要的开发阶段
阶段1——定义APB
1、功能特性提取——APB总线有哪些功能,对这些功能作拆分
-
-
单个transaction操作
-
- 单个transaction写操作
- 单个transaction读操作
- 单个transaction先写后读
-
多粒度transaction操作——关联数组、队列、动态数组等
-
- 对数组进行写操作
- 对数组进行读操作
-
2、特性覆盖率创建及映射
covergroup cg_apb_command @(posedge clk iff rstn);
pwrite: coverpoint pwrite{
type_option.weight = 0;
bins write = {
1};
bins read = {
0};
}
psel : coverpoint psel{
type_option.weight = 0;
bins sel = {
1};
bins unsel = {
0};
}
cmd : cross pwrite, psel{
bins cmd_write = binsof(psel.sel) && binsof(pwrite.write);//有效写,
bins cmd_read = binsof(psel.sel) && binsof(pwrite.read);
bins cmd_idle = binsof(psel.unsel);
}
endgroup
// APB transaction timing group
covergroup cg_apb_trans_timing_group @(posedge clk iff rstn);
psel: coverpoint psel{
bins single = (0 => 1 => 1 => 0);
bins burst_2 = (0 => 1 [*4] => 0);
bins burst_4 = (0 => 1 [*8] => 0);
bins burst_8 = (0 => 1 [*16] => 0);
bins burst_16 = (0 => 1 [*32] => 0);
bins burst_32 = (0 => 1 [*64] => 0);
}
penable: coverpoint penable {
bins single = (0 => 1 => 0 [*2:10] => 1);
bins burst = (0 => 1 => 0 => 1);
}
endgroup
// APB write & read order group
covergroup cg_apb_write_read_order_group @(posedge clk iff (rstn && penable));
write_read_order: coverpoint pwrite{
bins write_write = (1 => 1);//连续写
bins write_read = (1 => 0);//先写后读
bins read_write = (0 => 1);//先读后写
bins read_read = (0 => 0);//连续读
}
endgroup
initial begin
automatic cg_apb_command cg0 = new();
automatic cg_apb_trans_timing_group cg1 = new();
automatic cg_apb_write_read_order_group cg2 = new();
end
endinterface : apb_if
`endif // APB_IF_SV
阶段2——VIP基本搭建
1、driver,sequencer,monitor
- mst_drv
task apb_master_driver::get_and_drive();
forever begin
seq_item_port.get_next_item(req);
`uvm_inf