apb协议要求发送数据时,看到第一个时钟上升沿就要将pwrite、paddr、psel以及数据准备好,也就是说uvm环境中的driver要满足:
第一个周期做以下动作:
@(posedge clk)begin
vif.psel <= 1;
vif.pwrite <= 1;
vif.paddr <= tr.addr;
vif.pwdata <= tr.data;
vif.penable <= 0;
end
写数据个第一个阶段完成。在看到第二个时钟上升沿后,将penable使能信号拉高。
第二个周期做如下动作:
@(posedge clk)begin
vif.penable <= 1;
end
第三个时钟上升沿看到从机的pready拉高,表明一笔传输完成:
@(posedge clk iff vif.pready)begin
vif.penable <= 0;
end
同时下一笔数据的传输也就开始。
时序图如下:
apb读数据时,看到第一个时钟上升沿时,将paddr、pwrite、psel等信号准备好,driver要满足
第一个周期做如下动作:
@(posedge clk)begin
vif.sel <= 1;
vif.pwrite <= 0;
vif.addr <=tr.addr;
end
第二个周期将选通信号penable拉高。
@(posedge clk)begin
vif,penable <= 1;
tr.data <= vif.prdata
end
第三个时钟上升沿看到pready证明这笔读操作完成
@(posedge clk iff vif.pready)begin
vif.penable <= 0;
end
以上是driver驱动读写transaction。同样的,monitor进行采样的时候同样要满足apb时序。
@(posedge clk iff psel)begin
tr.addr = vif.paddr;
tr.direction = (vif.pwrite == 1) ? APB_WRITE:APB_READ;
if(tr.direction == APB_WRITE)begin
tr.data = vif.pwdata;
end
end
@(posedge clk)begin
if(tr.direction == APB_READ)begin
tr.data = vif.prdata;
end
end
欢迎大佬批评指正。