clocking block中的输入偏差和输出偏差
【示例】input偏差和output偏差为默认值
通过仿真结果可以看到,对于clocking block的输入sig1来说,在21行调用$display显示itf.cb.sig1的值为0,并不是19行赋给itf.sig1的8’h12,这是因为itf.cb.sig1采样itf.sig1的值时在采样事件发生前1step的pre-pone区,而19行的赋值发生在pre-pone区之后的Active-Region,所以此时itf.cb.sig1显示的值并不是19行更新的值。同理24行显示的结果为上一时间槽最后itf.sig1最终的值’h12,并不是当前时间槽更新的itf.sig1的值。27行显示出的结果分析原理同上,不再赘述。
对于clocking block的输出sig2来说,该信号通过cb引用时可以被驱动,但是不能被读,否则会报错。同时对于itf.cb.sig2的赋值会立即更新至itf.sig2,这是因为在clocking block中对于输出性质的信号指定的默认驱动偏差为0,即会立即更新至输出信号上。
示例中,clocking block的input偏差就是默认的1step,output偏差就是0,所以导致输入采样和输出驱动的表现在仿真上的结果如仿真结果所示。而实际上,除了clocking block可以使用默认的input偏差(1step)和output偏差(0)外,还可以根据需要设置特定的input偏差和output偏差,如下示例。
【示例】
示例中,clocking block中的input偏差(setup)为2,所以在9ns时虽然此时对应的sig1位’h34,但是因为input偏差为2,所以此时采样到的数据为采样事件发生前2ns时刻的数据值,而采样事件发生前2ns是sig1为’h12,所以被采样的值为’h12,此值会在采样事件发生时更新到cb.sig1.clocking block中output偏差为2.4,所以在15ns时采样到的cb.sig2的值将在采样事件发生后的2.4ns更新至sig2中。同时需要注意,示例中使用了default来设置input和output偏差,其目的是对于clocking block中所有的input、output和inout来设置input偏差和hold偏差,但是并不是说使用default后clocking block中所有的input、output和inout都必须只能使用默认值,其实尽管clocking block设置了default值,还是可以根据需要对于特定的信号指定特定的偏差,如下例。
【示例】
示例中,dat0_in和dat0_out采用的default设置的#setup偏差(1step)和#hold偏差(0),itf.dat0_in会晚于采样事件output偏差后输出,itf.cb.dat0_out采样值为采样事件发生前input偏差时itf.dat0_out的值。但是dat1_in和dat1_out的采样和驱动并没有采用clocking block中设置的默认值,itf.dat1_in会晚于采样事件#1ns偏差之后输出,itf.cb.dat1_out采样值为采样事件发生前#2偏差时itf.dat1_out的值,其他时刻点分析雷同。
除了上述示例中default偏差的方式外,还可以采用如下的方式进行设置:
default input [clocking_skew]; default output [clocking_skew];
设置默认偏差后,clocking block中所有没有指定偏差的端口将会按照default设置的偏差进行采样和驱动。这里需要注意,clocking block中的inout不能直接设置“default inout”,而是通过设置input偏差和output偏差实现的,一般情况由default设置input偏差和output偏差共同组成。这里还需要注意,在设置default默认偏差时,不能重复设置input偏差和output偏差。
除了上述示例中设置默认和具体时间偏差外,还可以在clocking block中设置posedge和negedge偏差。
【示例】