串并行接口的参数化可复用抖动(Jitter)模型

抖动是指信号相对于其时间理想位置发生的短暂变化,可能会造成数据接收模块接收到错误的数据。在验证串行或并行接口数据传输时,很有必要模拟这种抖动。串行通信时,很多情况下时钟并不和数据一起发送。这样做可以减少引脚数,进而降低封装成本。当然这样的话,当数据被接收时,要从数据中恢复得到时钟信号。模拟链路上的位宽变化对于验证时钟数据恢复是非常关键的,通过这种模拟,可以暴露一些问题,比如弹性缓冲器的深度不够等。而对于并行接口,数据总线的不同数据位也会产生不同的抖动,也需要抖动模型来模拟这些抖动。

一般来讲,我们会为每个新的接口开发一个独立的抖动模型,所以很费时间,因此我们要介绍一种参数化并且可复用的方法,用于减少建模工作量,这种方法适用于任何串行或者并行接口。(但是将这种方法用于串行接口时,也尴尬地发现了2个可能会导致重新流片的安全漏洞)

抖动类型

抖动模型引入的抖动可以是确定的(如正弦、三角形),随机的(高斯),或两者的组合。

正弦抖动可以通过以下公式来建模:

sj_offset + (sj_ampl*$sin(2*3.1416*curr_sj_freq*$realtime))

其中

  • sj_offset = an initial offset of the jitter sinusoid
  • sj_ampl = amplitude of the jitter sinusoid
  • curr_sj_freq = frequency of the jitter sinusoid

随机抖动可以通过以下公式来建模:

rj_offset + $dist_normal(rj_seed, 0, rj_stdev)*10/1000

其中

  • rj_offset = an initial offset for the random jitter
  • rj_seed = initial seed for the normal distribution
  • rj_stdev = standard deviation for the density function

以往的抖动建模方法上图描述了过去为不同接口信号的抖动建模的方法。使用这种方法,每个新的接口需要开发一个独立的抖动模型。而不同接口间会有很大差异,比如串并行、数据总线端口名称、总线位宽等。另外端口符合的协议也可能完全不同,因此复用不同接口的抖动模型也挺麻烦的。此外,由于抖动是在接口上建模的,模型始终在启用,所以还需要静态分配内存。

我们推荐的抖动建模方法

上图是我们推荐的开发抖动模型的方法。使用了UVM开发抖动模型。这种方法具有参数化,可复用的特点。

抖动模型的组成

一个典型的抖动模型具有以下参数:

  • 接口的参数,比如总线名称、位宽等。
  • 测试平台参数,比如抖动类型,抖动模型使能控制信号等。

在我们提出的方法中,我们开发了一个Perl脚本,它从文件(或命令行)中提取接口信号信息,并据此自动生成接口文件。这些文件包括输入、输出、总线位宽等。读取信息和生成文件的脚本如下 此外,这个脚本自动添加了一些逻辑结构, 用于在输入输出之间插入延时,下图示例出一个接口文件代码片段。抖动模型实质上是一个UVM agent,基于TB的参数改变位宽。

UVM TESTBENCH环境

下图是此方法的UVM testbench。DUT有一个串行接口和一个并行接口。环境包含了各类agent,这些agent用于DUT通过串行或者并行接口收发数据。

 

jitter agent 的组件-配置对象

jitter agent中包含有一个组件——配置对象,配置对象包含了许多testbench参数。用户可以根据设计要求自己配置这些参数。

上文提到抖动类型有很多,如正弦、三角形、高斯、或他们的组合形式等。对于正弦抖动,要考虑其抖动幅度和频率。对于三角形的抖动,要考虑其最小、最大抖动和重复的频率。下图显示了一个配置示例。jitter agent的组件——driver

基于特定的串并行接口,扩展基础driver类可生成 jitter agent的组件——driver。对于一个串行或并行的接口,接口所呈现的延时值在driver里被赋给抖动值。这些延时会导致传入的信号在输出前被延时。下图显示了延时的计算。

Jitter agent的创建

jitter agent的组件包括配置对象、driver、squencer、monitor。jitter agent可以配置为passive状态或者active状态。当agent被配置为passive状态,只实例化monitor;当agent配置为active时,driver、squencer、monitor都会被实例化。另外,jitter agent实质上是动态的,可以在不需要的时候将其禁用。用户可以通过配置对象来配置。下图显示了配置对象动态控制jitter agent创建的过程。


复用抖动模型

为了将抖动模型复用到新的接口上,我们需要遵循以下几个步骤:

  1. 用perl脚本生成接口文件。
  2. 在TB的environment里面实例化jitter agent
  3. 在test里面设置配置对象。

接口上的波形案例分析

这里来讨论我们提出的方法,在串行和并行接口上得到的结果。

下图中,HSDP_P0和HSDM_P0指串行接口上一组差分信号对。DUT接收到的数据位没有抖动。因此,数据位宽测量值恒定且保持在2080ps。下图中,DUT在HSDP_P0和HSDM_P0处接收抖动的数据流。位宽因为抖动的引入而发生变化,在上图中被标记的两位,他们在下图中测得位宽为2044ps和2097ps。下图在一条写路径上的并行接口中引入了抖动。在写操作期间,抖动被引入到该并行数据总线和写数据选通控制线上.  BP_DQ是一个32位双向数据总线,BP_WDQS_T是没有任何抖动的写选通线。BP_delay_DQ是32位数据总线的输出。 BP_WDQS_delay_T是在BP_WDQS_T上引入抖动后得到的写选通信号。在接收端(agent/slave),根据写选通BP_WDQS_delay_T对数据总线BP_delay_DQ进行采样。

下图显示了在同一个接口上,在一条读路径上引入抖动。在读操作期间,抖动被引入到并行数据总线和读选通控制线上。BP_SLV_BQ是一个32位的读数据总线,BP_RDQS_SLV_T是没有任何抖动的读选通线,BP_DQ是32位数据总线的输出,(BP_SLV_DQ传递到BP_DQ时,会引入的抖动或者偏移)。 BP_RDQS_delay_T是在BP_RDQS_SLV_T上引入抖动后得到的读选通信号。在接收端(DUT),根据读选通BP_RDQS_delay_T对数据总线BP_DQ进行采样。

串行接口上的bug

必须指明的是,我们的方法存在一定的缺陷,下表列出的是在串行接口上使用我们的方法产生的bug。下图显示了上表所列的第一个bug,dp/dm指的是串行数据线上的一对差分信号。rx_data是串行数据在恢复得到时钟信号数据后的8位并行数据。在标记指示的位置处,数据没有被写进弹性缓冲区,反而丢失了。这导致rx_data获取的第一个字节出错了。总结

为每个新接口开发独立的抖动模型缺乏可复用性。用我们的方法,任何新的接口都可以产生抖动模型,并且可以在不需要时禁用,能够很快的集成到验证环境中,大大节省了开发新接口抖动模型的时间。

 

感谢你对路科验证的关注,也欢迎你分享和转发真正的技术价值,你的支持是我们保持前行的动力。

发表评论

邮箱地址不会被公开。 必填项已用*标注

陕ICP备18003383号-1