|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
小弟弟刚刚在做一个关于amba接口的项目,接口是AHB和APB;在做这个模块验证的时候,写AMBA的BFM时遇到了如下问题:
我把AHB的的读写分别封装成task,如下
1.
task ahb_write;
input[31:0] ahb_addr;
input[31:0] ahb_data;
begin
wait(hreaydout)
@(posedge hclk)
hsel<=1'b1;
hwrite<=1'b1;
.
.
.
haddr<=ahb_addr;
#clk_cly hwdata<=ahb_data;
end
endtask
2.
task ahb_write;
input[31:0] ahb_addr;
input[31:0] ahb_data;
begin
wait(hreaydout)
@(posedge hclk)
hsel<=1'b1;
hwrite<=1'b1;
.
.
.
haddr<=ahb_addr;
@(posedge hclk)
hwdata<=ahb_data;
end
endtask
在第一个task中,能够正常的给时序,就是一个周期地址跳变一次,同时满足数据比地址晚一个时钟;
但是在第二个task中,要两个周期,地址才能跳变一次,不满足AHB的时序要求;
我分析的是,在第二task中,因为是用了两个@(posedge hclk),等待两个HCLK的上升沿来触发,所以是两个;
但是有个疑惑,就是在第一个task中,在第一个hclk的上升沿到来的时候,触发task中的begin..end快,开始执行,在最后给hwdata,赋值的时候,延时了一个cycle,那么第二个hclk的上升沿,是怎么能保证被@(posedge hclk)给采样到的???
同时在构建APB的task的时候,PENABLE信号时怎么赋值 |
|