下图中在10ns时,没有建立(setup)时间,很容引起不确定情况发生,因此需要将write信号前移,留出足够长的setup time。
下图中,正确情况:
驱动过晚或采样过早,都会引起竞争现象。在建立之前,稳定的驱动信号,可以避免竞争现象。
clocking模块控制同步信号,要点:
clocking dram @(clk)
input #1ps address;
input #5
output #6 data;
endclocking
自动将arbif.cb.request信号同步到clock上面。
@arbif.cb; //等待接口arbif的时钟边沿
repeat (3) @arbif.cb; //经过3个arbif接口的时钟上升沿
@arbif.grant; //等待接口grant信号的任意一个边沿
@(posedge arbif.cb.grant); //等待grant信号的上升沿
@(negedge arbif.cb.grant); //等待grant信号的下降沿
wait (arbif.cb.grant==1) //等待grant信号为高电平,如果已经为高电平则没有延迟
##2 arbif.cb.requeset <= 0;//经过2个时钟周期后赋值
等效:repeat(2) @arbif.cb;
驱动信号必须用非阻塞赋值,采样信号用阻塞赋值
arbif.cb.request <=1; //驱动输出信号
value = arbif.cb.grant; //采样出入信号
如果不使用时间的推进语句如#1或者##1,仿真时间不会更新,会导致仿真悬挂
forever begin
if(request ==1)
grant <= 1;
end
上面将会是死循环,直至内存写满,应该改成如下代码解决问题
forever begin
#1 ps
if(request ==1)
grant <= 1;
end