我的TB中有以下代码
always @(posedge clk or posedge reset) begin
if(reset) reset_state;
else begin
#1 run_task;
if(<some check>) begin
#2 $display ("something");
#1000 $finish;
end
end
end
所以,如果没有重置,每个posedge都会运行一个任务, run_task 。运行任务后,我会做一个简单的检查,看看任务输出是否符合我的预期。如果不是,我会在延迟1000后致电$。
因此,在执行$ finish和结束sim之前,模拟继续运行(我在其他地方打印以确认它)1000次以上。这就是我所期望的。
但是这里的疑问是,在某些检查失败后的后续构成中,模拟不执行任务(通过任务内的打印确认)。上一次执行任务就在某些检查失败之前。我希望它每次运行直到实际调用$ finish。
知道这是否是预期的?
TIA
答案 0 :(得分:1)
你的描述不正确;你的always
块不执行每个posedge。
启动执行语句块的进程是什么?只有在该块完成执行后,它才会重复相同的语句块。
语句块@(posedge clk)
c中的第一个语句,表示暂停等待更改事件的进程。在这种情况下,clk
转到1将恢复该过程。之后,如果reset
为false,则下一个语句#1将进程暂停1个时间单位。然后它调用run_task。任务内的任何延迟也会暂停该过程。
当某些检查失败时,该过程将暂停另外2个时间单位,然后暂停1000个时间单位。进程暂停时的clk事件不会执行任何操作,因为进程不等待它进行更改。它只在语句块完成后才返回执行语句,该语句暂停等待另一个clk事件的进程。