Verilog任务不会在TB

时间:2018-01-18 05:39:53

标签: verilog

我的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

1 个答案:

答案 0 :(得分:1)

你的描述不正确;你的always块不执行每个posedge。

启动执行语句块的进程是什么?只有在该块完成执行后,它才会重复相同的语句块。

语句块@(posedge clk) c中的第一个语句,表示暂停等待更改事件的进程。在这种情况下,clk转到1将恢复该过程。之后,如果reset为false,则下一个语句#1将进程暂停1个时间单位。然后它调用run_task。任务内的任何延迟也会暂停该过程。

当某些检查失败时,该过程将暂停另外2个时间单位,然后暂停1000个时间单位。进程暂停时的clk事件不会执行任何操作,因为进程不等待它进行更改。它只在语句块完成后才返回执行语句,该语句暂停等待另一个clk事件的进程。

相关问题