clocking block中的输入偏差和输出偏差

SystemVerilog中增加了时钟块(clocking block)机制来对指定信号进行基于特定时钟的同步处理,时钟块中的任何信号都将根据指定的时钟被同步驱动或被采样,这样可以保证测试平台在期望的采样点与信号进行交互,同时clocking block还可以对于采样和驱动指定input偏差和output偏差,从而可以进一步实现对于信号的采样和驱动时间的控制,input偏差和output偏差如下图所示:

clocking block中,实际上指定了默认的input偏差和output偏差,只不过这个偏差在宏观的时间刻度上观察不到,对输入性质的信号指定的默认采样时间是1step,对于输出性质的信号指定的默认驱动时间为0,其中1stop是一个较为特殊的时间单位,一般指输入信号在采样信号事件发生之前的输入信号的稳定值,可以认为1step实际采样时刻发生在上一时间槽的最后时刻,1step不像nsps等之类可以用来设置设计的时间精度和时间单位,它指定了当前采样值来自于当前时间槽的pre-pone区,0则表示在采样事件发生后立刻将对应的值驱动到输出端口,与1step不同的是,该时刻的采样发生在采样事件发生的当前时间槽的Observed Region

【示例】input偏差和output偏差为默认值


【仿真结果】

通过仿真结果可以看到,对于clocking block的输入sig1来说,在21行调用$display显示itf.cb.sig1的值为0,并不是19行赋给itf.sig18h12,这是因为itf.cb.sig1采样itf.sig1的值时在采样事件发生前1steppre-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 blockinput偏差就是默认的1stepoutput偏差就是0,所以导致输入采样和输出驱动的表现在仿真上的结果如仿真结果所示。而实际上,除了clocking block可以使用默认的input偏差(1step)和output偏差(0)外,还可以根据需要设置特定的input偏差和output偏差,如下示例。

【示例】

【仿真结果】

示例中,clocking block中的input偏差(setup)为2,所以在9ns时虽然此时对应的sig1h34,但是因为input偏差为2,所以此时采样到的数据为采样事件发生前2ns时刻的数据值,而采样事件发生前2nssig1h12,所以被采样的值为h12,此值会在采样事件发生时更新到cb.sig1.clocking blockoutput偏差为2.4,所以在15ns时采样到的cb.sig2的值将在采样事件发生后的2.4ns更新至sig2中。同时需要注意,示例中使用了default来设置inputoutput偏差,其目的是对于clocking block中所有的inputoutputinout来设置input偏差和hold偏差,但是并不是说使用defaultclocking block中所有的inputoutputinout都必须只能使用默认值,其实尽管clocking block设置了default值,还是可以根据需要对于特定的信号指定特定的偏差,如下例。

【示例】

【仿真结果】

示例中,dat0_indat0_out采用的default设置的#setup偏差(1step)和#hold偏差(0),itf.dat0_in会晚于采样事件output偏差后输出,itf.cb.dat0_out采样值为采样事件发生前input偏差时itf.dat0_out的值。但是dat1_indat1_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中设置posedgenegedge偏差。

【示例】

【仿真结果】 
示例中,clocking blockinput偏差设置为posedgeoutput偏差设置为negedgeitf.sig1的值在采样事件上升沿采样到对应的值后立即更新至itf.cb.sig1itf.cb.sig2的值在采样事件下降沿时更新至itf.sig2。示例中对于输入和输出分别设置了边沿偏差,从而使得相关信号采样从“@posedge clk)”变为了设置的posedgenegedge,即不再由clocking block标识符后指定的采样事件指定的方式决定。

全部评论
学习新的知识
点赞 回复 分享
发布于 2022-10-17 16:43 河南

相关推荐

程序员鼠鼠_春招版:我要12k吧我挂了,还招呢,天天被割,这点钱都不舍得出
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务