路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

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

已有 1444 次阅读| 2016-9-25 23:17 |个人分类:验证前沿资讯|系统分类:芯片设计

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

一般来讲,我们会为每个新的接口开发一个独立的抖动模型,所以很费时间,因此我们要介绍一种参数化并且可复用的方法,用于减少建模工作量,这种方法适用于任何串行或者并行接口。(但是将这种方法用于串行接口时,也尴尬地发现了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开发抖动模型。这种方法具有参数化,可复用的特点。
抖动模型的组成
一个典型的抖动模型具有以下参数:
  • 接口的参数,比如总线名称、位宽等。
  • 测试平台参数,比如抖动类型,抖动模型使能控制信号等。

在我们提出的方法中,我们开发了一个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获取的第一个字节出错了。
总结
为每个新接口开发独立的抖动模型缺乏可复用性。用我们的方法,任何新的接口都可以产生抖动模型,并且可以在不需要时禁用,能够很快的集成到验证环境中,大大节省了开发新接口抖动模型的时间。

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-26 07:10 , Processed in 0.020792 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部