Professional Documents
Culture Documents
1 Tag芯片的功能验证平台的设计 黄海蓉
1 Tag芯片的功能验证平台的设计 黄海蓉
随着 IC 设计规模的增加,功能验证的复杂程度越来越高,各种新的验证方法
也层出不穷,如何根据不同的 IC 产品来选择适当的验证方法获取最大的工作效
率,仍然是一个值得研究的课题。仿真验证作为传统的验证方法,目前仍然是主
流的验证技术,也是本文采用的验证方法。本文的被验证对象是一个基于 Verilog
语言设计的符合 EPC Gen2 UHF RFID 接口协议的 Tag 芯片。
本文完成了具有自检查功能的 Tag 芯片的功能验证平台。使用 C/C++、
Verilog、PLI 作为验证平台的设计语言,采用 C 语言设计 Reader 模块、Tag 模块、
比较模块,而 DUV 和 Testbench 采用 Verilog 语言设计。设计两个 PLI 程序来实
现 C 与 Verilog 语言之间的通信。最后用 C 程序把这些模块连接起来,完成了 Tag
芯片的功能验证平台的搭建。
另外,论文讨论在软件 Modelsim 环境下 PLI 接口的配置问题,阐明验证平
台的验证过程和应用方法。Tag 芯片顺利通过验证平台的功能验证和后仿真,现
已在流片中。
With the increasement of the scale in IC design, the functional verification of the IC
design is getting more and more complex and many new verification methods have
emerged one after another. It is an important research topic to choose the appropriate
verification methods for the different IC products in order to obtain the greatest
efficiency. As the traditional verification method, Simulation is still the mainstream
technique which is used in this thesis. The DUV is a Tag chip according to EPC Gen2
UHF RFID based on Verilog. The thesis designs a verification platform to verify Tag
function based on self-test function theory and implementations. The thesis introduces
a new design method which incorporates the self-test function in the basis of
traditional functional verification method and verifies the implementation process.
The verification platform includes Reader model, Tag model, comparison model and
Testbench , of which the first three models use the C language as the design language
whereas the DUV and Testbench uses the Verilog HDL discussing the division of
function module, the connection of each model and the detailed function of each
module. Two PLI programs in PLI interface language have been designed to realize the
communication between C and Verilog language. And then a C program connects all of
these models to fulfill the establishment of the self-test verification platform.
In addition, the thesis introduces PLI application in Modelsim environment, the
verification process of the platform and the usage of it. Through the functional
verification and post-simulation, the tag chip fulfill the design requirements and now
has been taped out.
1.1 验证的意义.............................................................................................................1
1.2 验证的概念.............................................................................................................1
1.3 TAG芯片介绍...........................................................................................................3
1.4 论文主要工作及章节安排.....................................................................................5
第三章 功能验证平台设计...........................................................................................27
第四章 PLI接口程序设计............................................................................................33
第五章 验证平台的搭建...............................................................................................51
第六章 结束语...............................................................................................................63
致谢.................................................................................................................................65
参考文献.........................................................................................................................67
第一章 绪论 1
第一章 绪论
随着 IC 设计复杂度的不断提高和设计规模的不断增大,验证已成为 IC 设计
的瓶颈。由于验证的不充分,流片后的芯片中可能存在致命缺陷,从而增加了设
计的风险和设计重流片的成本,因此验证技术,特别是功能验证技术成为 IC 设计
中一个非常重要的环节。本章介绍验证的概念和意义,阐明本文研究 Tag 芯片的
功能验证,分析 Tag 芯片的逻辑模块和 Tag 验证面临的挑战,再介绍本文的主要
工作和章节安排。
1.1 验证的意义
集成电路行业逐步形成集成电路设计、芯片制造、芯片封装三大行业[1][2][3]。
其中,芯片制造和封装行业发展速度大大超过了 IC 设计行业的发展,设计拖累工
艺进步可能带来的设计规模的提高,出现设计生产鸿沟。而 IC 设计行业中的设计
和验证领域的发展也不平衡,验证的发展水平落后于设计的发展水平,出现设计
验证鸿沟。
随着设计规模和复杂性的不断增加,知识产权(Intellectual Property,简称 IP)
的重用和片上系统(System on Chip,简称 SOC)设计的发展,对功能验证提出了更
高的要求。国际半导体技术发展报告指出:验证已经成为集成电路设计流程中开
销最大的工作。在目前的工程项目中,验证工程师的数目超过了设计工程师,对
于复杂设计更是达到 2:1 或是 3:1 的比率。造成这种局面的原因有:一方面是
设计规模正如摩尔定律所指出的呈指数增长。如果用设计中的状态数目来衡量功
能复杂度,则设计的功能复杂度随着设计规模又呈指数增长。如此惊人的发展速
度,对验证技术的处理能力提出了极大的挑战;另一方面,对设计流程中的其它
环节(如逻辑综合、布局布线)的问题关注颇多,而对验证重视不够,造成验证成
为目前行业发展的瓶颈。如果没有重大突破,验证将成为未来集成电路设计流程
中的重大障碍。因此,对验证方法和技术进行研究对于现阶段集成电路发展有着
重要的意义。
1.2 验证的概念
验证是证明一个设计能正确实现其功能的过程[4]。验证不是一个测试平台,
也不是一系列测试平台(Testbench),使用汇聚模型可以从概念上清晰地描述验证
过程,如图 1.1 所示。其中变换(Transformation)可以是任何包含有输入输出的过
程,包括根据设计规范(Specification)写出寄存器传输级 RTL 代码、扫描链的插入、
2 Tag 芯片的功能验证平台的设计
把 RTL 级代码综合为门级网表、根据 变换
门级网表布局布线等。验证过程是一个
相反的过程,它从变换的结果出发回到
起点。
验证
验证只能证明存在错误,不能证明
不存在错误。即验证的错误类型可分为 图 1.1 验证过程
Ⅰ型和Ⅱ型两种,如图 1.2 所示。Ⅰ型
错误(也叫否定错误 False-negative)是比较容易验证的类型,就是在存在错误地方
发现了错误。一旦错误的解释被
证实,验证结果的答案将从否定 有错误 没错误
到肯定,那么错误就不再存在了。 差的 类型Ⅱ
设计 肯定错误
Ⅱ型错误(也叫肯定错误
False-positive)是最严重的一种, 好的 类型Ⅰ
设计 否定错误
就是把有错的设计认为是没有错
误,带有潜在的危险。所以,验 图 1.2 错误类型
证过程一定要避免Ⅱ型错误的发
生[5]。
验证并不是在设计完成后才要进行的工作,而是设计的一部分,IC 验证工作
贯穿整个设计流程[6]。在 IC 设计中,在系统规划阶段就可以定义系统验证。当创
建了系统行为模型后,就需要建立测试平台和测试向量来对模型进行验证。同样,
在开发测试平台的同时也要开发设计对应的系统程序并对行为模型进行测试。这
样就可以使得系统的实现和验证开发同步进行。只有和设计同步执行验证才能保
证不会在设计中引入新的错误,而导致系统失败。
1.2.1 验证在设计中的地位
集成电路的设计经历了从小规模(SSI)、中规模(MSI)到大规模(LSI)、超大规
模(VLSI)的发展,集成电路内晶体管的数量按照摩尔定律高速发展,现在已经进
入了 SOC 的开发阶段。
随着设计规模的扩大,设计方法和各种 EDA 工具也不断的改进。数字集成
电路的设计流程[7]如图 1.3 所示。设计从规范出发,制定出设计规范,然后进行
系统级、行为级和 RTL 级的设计,称为前端设计。RTL 设计保证正确后,利用
EDA 工具进行逻辑综合,将 RTL 代码转换成逻辑单元及互连关系的门级网表。
然后进行版图设计,将门级网表转换成电路描述的设计,并进行布局、布线。这
个过程称为后端设计,最后就是流片封装。从图 1.3 可以看出设计的每一步都有
相应的验证步骤。在进入下一设计步骤之前,必须保证之前的设计正确,否则后
第一章 绪论 3
面的设计没有任何意义。
规范制定
规范解析和检验
系统级设计
系统级功能验证
行为级设计
行为级功能验证
前端设计
RTL级设计
功能验证
RTL级功能验证
逻辑综合
时序验证
时序验证
版图设计
时序验证/物理验证 物理验证
后端设计 流片
芯片测试
封装
图 1.3 集成电路的一般流程
1.2.2 验证的分类
根据设计阶段的不同,验证也相应分为功能验证、时序验证、物理验证。功
能验证属于前端验证,时序验证和物理验证属于后端验证。
(1) 功能验证:检查设计的输入(HDL 语言)是否准确的描述了设计的规范要
求。如果描述存在缺陷或错误,无论后面的环节如何完美,也不可能正确的实现
设计。
(2) 时序验证:检查经过逻辑综合后形成的门级描述是否与综合前的描述等
价,即等价性验证。
(3) 物理验证:检查电路描述是否与门级描述等价,并且要检查布局布线后
提取的参数指标是否满足设计要求。满足后才能进入流片制造环节。
1.3 Tag芯片
整个验证平台的关键所在。
以上分析了 Tag 芯片给验证工作带来的挑战,针对这些问题,本文分析研究
Tag 芯片功能验证平台搭建。该平台已用于该芯片的功能验证之中,Tag 芯片已在
流片中。
1.4 论文主要工作及章节安排
2.1 标签选择、盘存和访问
标签选择、盘存和访问可以被视为分层网络通信系统的数据链路层的最低层。
2.1.1 标签存储器
从逻辑上将标签存储器分为四个存储体,每个存储体可以由一个或一个以上
的存储器字组成。逻辑记忆图如图 2.1 所示。这四个存储体分别是:
·保留内存:保留内存应包含灭活口令和访问口令。灭活口令应存储在 00H
至 1FH 的存储地址内。访问口令应存储在 20H 至 3FH 的存储地址内。若标签不
执行灭活或访问口令,则该标签仍然起作用,而无论标签是否已将永久锁定无法
读取/写入的口令清零,在保留内存中不需要有相应的存储位置。
·EPC 存储器:EPC 存储器包含在 00H 至 1FH 存储位置的 CRC-16、在 10H
至 1FH 存储地址的协议-控制(PC)位和在 20H 开始的 EPC。PC 被划分成 10H 至
14FH 存储位置的 EPC 长度、15H 至 17FH 存储位置的 RFU 位和在 18H 至 1FH
存储位置的编号系统识别(NSI),CRC-16、PC、EPC 应优先存储 MSB (EPC 的
MSB 应存储在 20H 的存储位置)。
·TID 存储器:TID 存储器应包含 00H 至 07H 存储位置的 8 位 ISO15963 分
配类识别(对于 EPCglobal 为 111000102)、08H 至 13H 存储位置的 12 位任务掩模
设计识别(EPCglobal 成员免费)和 14H 至 1FH 存储位置的 12 位标签型号。标签可
以在 1FH 以上的 TID 存储器中包含标签指定数据和提供商指定数据(例如,标签
序号)。
·用户存储器:用户存储器允许存储用户指定数据。该存储器组织为用户定
义。
所有存储体的逻辑寻址均从零(00H)开始。物理内存映象图为提供商指定。访
8 Tag 芯片的功能验证平台的设计
…
10h TID[15:0] 1Fh
00h TID[31:16] 0Fh
MSB LSB
EPC[15:0]
用户存储器
…
保留内存
MSB LSB
…
图 2.1 逻辑内存映象
询问机可以锁定、永久锁定、不锁定或永久不锁定存储器,以便阻止或允许
更改(视具体情况而定)。灭活口令和访问口令可以单独锁定,EPC、TID 和用户存
储器也是如此。如果灭活口令或访问口令锁定,可以不能以写入或读取的方式显
现(但仍然可为 Kill 和 Access 命令所用),而不象其它存储体一样,始终可以被读
第二章 EPC Gen2 接口协议 9
取而无论是否其处于锁定状态。
(1) 灭活口令
灭活口令为存储在保留内存 00H 至 1FH 的 32 位数值,MSB 优先。默认(未
编程)值应为零。询问机应一次性使用标签的灭活口令灭活标签,使其保持沉默。
如果标签的灭活口令为零,则标签不应执行灭活操作。不执行灭活口令的标签仍
然可以起作用,尽管其零值化的灭活口令被永久读锁定和写锁定。
(2) 访问口令
访问口令为存储在保留内存 20H 至 3FH 的 32 位数值,MSB 优先。默认(未
编程)值应为零。访问口令非零的标签应要求询问机在转为保护状态之前发出该口
令。不执行访问口令的标签仍然可以起作用,尽管其零值化的访问口令被永久读
锁定和写锁定。
(3) CRC-16
CRC-16 为询问机在保护某个特定的 R=>T 命令时所使用的和标签在保护某
个特定的反向散射 T=>R 序列时使用的循环冗余码校验。为生成 CRC-16,询问机
或标签应首先生成如表 2.1 所示的 CRC-16 先驱,然后取生成的先驱的二进制反
码形成 CRC-16。
CRC-16 保护的序列为标签在盘存操作期间反向散射的 PC 位和 EPC。由于询
问机可以发出将全部或部分 CRC-16 包括在 mask 中的 Select 命令,并可以发出
Read 命令以便使标签反向散射 CRC-16,因此 CRC-16 从逻辑上映射到 EPC 存储
器中。上电后,标签应计算 EPC 存储位置 10H 上的 CRC-16,直至 EPC 的末端(不
一定直至 EPC 存储器的末端,但必须直至 PC 中 length field 规定的 EPC 的末端),
并将所计算的 CRC-16 映射到 EPC 存储器 00H 至 1FH 中,MSB 优先。由于
{PC+EPC}存储在 EPC 存储器词界上,因此应在词界计算该 CRC-16。标签应在间
隔 Ts 或 Ths(视具体情况而定)结束时完成此 CRC-16 计算和存储映象。标签不应
再次计算 CRC-16 以便截断应答。
为便于信息检验,询问机或标签可以将 CRC-16 添加到所传输的信息上,并
重新计算 CRC-16。若该信息仍然可靠,则其余项将是 1D0FH。
表 2.1 CRC 先驱
CRC-16 先驱
CRC 型 长度 多项式 预置 余项
16 12 5
ISO/IEC 13239 16 位 X +X +X +1 FFFFh 1D0Fh
(4) 协议-控制(PC)位
PC 位包含标签在盘存操作期间以其 EPC 反向散射的物理层信息。EPC 存储
器 10H 至 1FH 存储地址存储有 16PC 位,PC 位值定义如下:
10H—14H 位:标签反向散射的(PC+EPC)的长度,所有字为:
10 Tag 芯片的功能验证平台的设计
2.1.2 通话和已盘标记
单化为 B。
(2) 关闭电源;
(3) 打开询问机#2 电源,然后;
(4) 启动一个盘存周期,使通话 S3 中的标签从 B 单化为 A;
(5) 关闭电源。
反复操作本过程直至询问机#1 将通话 S2 的所有标签均放入标签 B,然后,
将通话 S2 的标签从 B 盘存为 A。同样,反复操作本过程直至询问机#2 将通话 S3
的所有标签放入 A,然后再将通话 S3 的标签从 A 盘存为 B。通过这种多级程序,
各询问机可以独立地将所有标签盘存到它的字段中,无论其已盘标记是否处于初
始状态。
标签的已盘标记持续时间应如表 2.2 所示。标签应采用以下规定的已盘标记
打开电源:
S0:已盘标记应设置为 A。
S1:已盘标记应设置为 A 或 B,视其存储数值而定,如果以前设置的已盘标
记比其持续时间要长,则标签应将其 S1 已盘标记设置为 A 打开电源。由于 S1
已盘标记不是自动刷新,因此可以从 B 回复到 A,即使在标签上电时也可以如此。
S2:已盘标记应设置为 A 或 B,视其存储的数值而定,若标签断电时间超过
其持续时间,则可以将 S2 已盘标记设置到 A,打开标签。
S3:已盘标记应设置为 A 或 B,视其存储的数值而定,若标签断电时间超过
其持续时间,则可以将 S3 已盘标记设置到 A,打开标签。
图 2.2 通话图
无论初始标记值是多少,标签应能够在 2 毫秒或 2 毫秒以下的时间将其已盘
标记设置为 A 或 B。标签应在上电时更新其 S2 和 S3 标记,这意味着每次标签断
12 Tag 芯片的功能验证平台的设计
开电源,其 S2 和 S3 已盘标记的持续时间。当标签正参与某一盘存周期时,标签
不应让其 S1 已盘标记失去其持续性。相反,标签应维持此标记值直至下一个 Query
命令,此时,标记可以不再维持其连续性(除非该标记在盘存周期期间更新,在这
种情况下标记应采用新值,并保持新的持续性)。
2.1.3 选定标记
2.1.4 标签状态和槽计数器
命令后应立即转换成保护状态,反向散射新的询问机应在随后的命令中使用的和
标签在随后的应答中使用的 RN16(标为句柄)。处于开放状态的其访问口令非零应
在收到有效 Access 命令即转换到保护状态,保持原来从确认状态转换到开放状态
时反向散射的句柄不变。处于保护状态的标签可以执行所有访问命令。处于保护
状态的标签可以转换到除开放或确认之外的任何状态,具体情况视所收到的命令
而定(参见图 2.3)。在保护状态下,标签应答和询问机传输之间的最大延迟不受限
制。
(7) 灭活状态
标签应执行灭活状态。处于开放状态或保护状态的标签应在收到 Kill 命令后
以有效非零灭活口令和有效句柄进入灭活状态。进入灭活状态后,标签应通知询
问机灭活操作成功,此后不再对询问机作出响应。被灭活的标签应在所有情况下
都处于灭活状态,并在随后的开启电源的操作中立即进入灭活状态。灭活操作具
有不可逆性。
(8) 槽计数器
标签应执行 15 位槽计数器。收到 Query 或 QueryAdjust 命令,标签应将从该
标签的 RNG 中抽出的 0 至 2Q-1 之间的某个数值预见载入其槽计数器内。Q 为该
范围内(0,15)的一个整数。Query 命令规定 Q,QueryAdjust 命令可以从以前的 Query
命令中修改 Q。收到 QueryRep 命令后,标签应使其槽计数器减值。槽计数器应
能够连接计数,这意味着当槽计数下降到 0000H 时,应从 7FFFH 重新开始倒计
数。
2.1.5 标签随机或伪随机数据发生器
标签应执行随机或伪随机数据发生器(RNG)。RNG 应符合不依赖于通电场、
R=>T 链路速率和存储在标签内的数据(包括 PC、EPC 和 CRC-16)的随机标准。
标签应采用 RNG 生成 16 位随机或伪随机数据(RN16),并应能够从 RN16 内提取
Q-位子集预先加载到该标签的槽计数器内。打开电源时,标签应能够暂时存储至
少两个 RN16 以便在口令转换期间用作句柄和 16 位加密等。
单个 RN16 的可能性:应采用 0.8/216 < P(RN16 = j)< 1.25/216 对从 RNG 内抽
取 RN16=j 的可能性予以限制。
同时恒等序列的可能:对于数量达 10,000 个的标签群,任意两个或两个以上
标签同时生成同一 RN16 序列的可能性应小于 0.1%,无论标签是否通电。
预测 RN16 的可能性:若在同等条件下进行的前一次抽取结果已知,Tr 结束
后 10 毫秒从标签的 RNG 中抽取的 RN16 的可预测性不应大于 0.025%。
16 Tag 芯片的功能验证平台的设计
2.1.6 管理标签群
图 2.4 阅读器(Reader)/标签(Tag)操作和标签状态
2.1.7 选择标签群
2.1.8 盘存标签群
图 2.5 一个标签应答
(3) 多标签应答:询问机观察由多个 RN16 组成的反向散射的波形。该询问
机可以解决冲突并发送 ACK;不解决冲突和发送 QueryAdjust 或 QueryRep 命令
或 NAK;或迅速识别冲突并在冲突标签完成反向散射之前发送一个 QueryAdjust
或 QueryRep 命令。在后一种情况下,未在 T2 内观察到有效应答的冲突标签应返
回仲裁状态,并等待发出下一个 Query 或 QueryAdjust 命令。
2.1.9 访问各标签
确认标签后,询问机可以选择访问该标签。访问命令集由 Req_RN、Read、
Write、Kill、Lock、Acces、BlockWrite 和 BlockErase 组成。标签执行确认状态、
开放状态或保护状态的 Req_RN。标签执行开放状态或保护状态的 Read、Write、
Kill、Acces、BlockWriet 和 BlockErase。标签执行保护状态的 Lock。
20 Tag 芯片的功能验证平台的设计
询问机按以下步骤访问确认状态的标签:
第 1 步:询问机向被确认的标签发送 Req_RN。
第 2 步:标签生成和存储新的 RN16(即句柄),反向散射该句柄,如果其访问
口令非零的话,转换成开放状态,如果其访问口令为零的话,转换成保护状态。
现在询问机可以发出进一步的访问命令了。
所有发给开放状态或保护状态下的标签的访问命令将该标签的句柄纳为该命
令中的一个参数。若标签处于上述两种状态时,标签应在执行访问命令前确认该
句柄是正确的,并应忽略句柄错误的访问命令。整个访问序列持续期间的句柄值
都是固定的。
处于开放状态下的标签可以执行除 Lock 之外的所有访问命令。处于保护状
态下的标签可以执行所有访问命令。标签对某一访问命令的应答至少应包括该标
签的句柄,该应答也可以包括其它信息(例如,Read 操作的结果)。
询问机可以向处于开放或保护状态下的标签发送 ACK,使该标签反向散射其
PC、EPC 和 CRC-16。
询问机和标签可以在开放或保护状态下无限通信。询问机可以通过发送
Query、QueryAdjust、QueryRep 或 NAK 命令中止通信。标签对 QueryAdjust、
QueryRep 或 NAK 命令的应答参见 2.1.8 所述。NAK 命令使处于该盘存周期的标
签返回仲裁状态,不改变其已盘标记。
Write、Kill 和 Access 命令将 16 位字(数据或半口令)从询问机发送到标签。
这些命令采用一次活页加密隐藏被传输的字,步骤如下:
第 1 步:询问机将 Req_RN 命令发送给标签,标签反向散射一个新 RN16 作
为应答。然后询问机生成一个由 16 位字的按位 EXOP 构成的 16 位密文串,并以
上述新 RN16 传输,MSB 优先,以密文串为一个参数发出该命令。
第 2 步:标签通过执行所收到的带有原 RN16 的 16 位密文串的按位 EXOP,
破译所收到的密文串。
询问机不可用句柄加密。询问机也不可重复使用句柄加密。如果询问机重新
发送含有加密数据的命令,则应重新发送没有更改过的命令。如果询问机改变了
该数据,则应首先发送 Req_RN 命令,获得一个新 RN16,并用这个新 RN16 加
密。
标签通过反向散射其句柄对写入存储器或擦去的命令(即 Write、Kill、Lock、
BlockWrite 和 BlockErase)作出应答,表明该操作成功执行,或者通过反向散射一
个错误代码,表明该操作未成功执行。
灭活标签需要通过多个步骤才能完成,灭活口令为零的标签不执行灭活操作。
发送访问口令给标签也是一个需要多个步骤才能完成的操作。
标签存储器可以锁定也可以不锁定。锁定状态可以改变也可以永久锁定(即永
第二章 EPC Gen2 接口协议 21
久不锁定或永久锁定)。询问机可以在开放状态或保护状态下写入不锁定存储器。
询问机只可以在保护状态下写入没有被永久锁定的锁定存储器。
2.1.10 询问机命令和标签应答
由于篇幅的限制,对于各个命令对应的编码和参数,以及在不同状态下状态
的 Tag 的反应和具体的反应此处不再讨论了。由于本论文主要是针对 Tag 的功能
验证,接下来分析研究 Tag 的输入编码和输出编码方式。
2.2.1 PIE编码
图 2.6 PIE 编码
表 2.4 最佳询问机对标签 Tari 值
Tari Tari-Value
Spectrum
Value Tolerance
6.25us +/-1% DSb-ASK
12.5us +/-1% SSB-ASK
25us +/-1% or PR-ASK
2.2.2 R=>T前同步码和帧同步
2.3.1 基带FM0
选择取决于前一次传输。如图 2.10 所
0 dummy 1 0 dummy 1
时以”dummy”数据-1 结尾。
图 2.10 中止 FM0 传输
1 0 1 0 V 1
12个前导零(导频音)
…
0 0 0 0 1 0 1 0 V 1
2.3.3 Miller-调制副载波
图 2.13 副载波序列
26 Tag 芯片的功能验证平台的设计
图 2.14 中止副载波传输
2.3.4 Miller副载波前同步码
第三章 功能验证平台设计
随着集成电路的广泛应用,验证过程对功能正确性及速度、功耗、可靠性都
有严格的要求。在 IC 验证设计中,功能正确性是最基本要求。所以功能验证是整
个验证过程的重要部分,保证 RTL 级的实现满足设计规范的要求。本章介绍功能
验证的基本概念和验证功能途径,在自检查方式的基础上提出本文验证平台的整
体设计,再阐明文中的被验证对象 Tag 芯片的引脚分布。
3.1 功能验证
2.1.1 功能验证定义
B
D
E G
H
设计目标 A C 实现
F
图 3.1 设计目标图
设计目的图有三个部分:设计目标、规范和实现。三者理论上的关系应该是逐步
细化、相互一致的。从设计的过程理解三者的关系,首先从设计目标出发,这里
设计的目标是来自架构工程师把用户要求转换成实际设计的一些初步的想法,即
设计的初始目标或目标行为。此时设计目标可能还只存在于工程师的脑子里或是
用自然语言模糊的描述的,具有很高的抽象级[20][21]。然后,这些设计目标经过系
统工程师的细化过程,成为明确的功能规范。设计团队从规范又可得到一个设计
规范,再用 RTL 语言描述设计规范。
功能验证的目标就是使设计目标、规范和实现三个方面完全重合,但在实际
中,不可能完全实现。
2.1.2 功能验证过程
功能验证过程包括验证计划,搭建验证环境,执行验证和回归测试[22]四个步
骤,下面详细介绍各个部分。
28 Tag 芯片的功能验证平台的设计
(1) 功能验证计划
验证计划定义了必须要验证的内容和怎样验证。验证计划描述了验证问题的
范围,并作为验证环境的功能规范。验证计划可以有不同的划分原则,分类如下:
·根据内容可分为为:激励产生、响应检查、覆盖评估;
·根据要求层次不同可分为:结构要求和实现要求;
· 根据方式分为:必须被验证的内容(功能或设计规范)和怎样验证(验证环境)
规范。
(2) 搭建验证环境
用已经写好的验证计划作为验证环境的功能规范。验证环境的覆盖、激励和
检查三方面内容都应该预先在验证计划中规定。每部分的结构应该尽量使用可重
用结构来规定。搭建验证环境实质上就是写 Testbench 的过程。
要注意搭建可重用的验证环境。因为可重用设计 IP 的使用成为缩短上市时间
的关键,因此可重用验证 IP 也同样变得很重要。这样在搭建验证环境时有两个原
则可以遵循:首先,尽量利用已有的 Testbench 而不是重新搭建。例如对普通硬
件接口有很多的已有的验证 Testbench 可以利用。也可以提前设计验证 Testbench,
以备以后重复使用;其次,在搭建验证环境时尽量写可重用的验证程序。
(3) 执行验证
执行验证的目的是发现那些致命的错误,虽然设计者在设计 RTL 代码时都会
检查基本的功能,但是很多国外大公司设计和验证是分离的,这是验证工程师第
一次接触设计模块,为了尽快熟悉模块,首先要进行少量的仿真来验证模块的基
本功能。执行内容是设计行为的最基本功能。为了容易诊断错误,每次仿真都比
较严格。验证过程是:先进行假设,然后利用仿真证明假设为真,然后再利用证
明后的假设去做更复杂的假设。
(4) 回归测试
回归测试的目标不是整个设计,而只是感兴趣的那部分。目的是发现那些有
可能在运行过程中注入的错误。可以分为经典回归测试和自动回归测试。
经典回归测试使用由验证计划规定的目标测试集,测试验证设计的某个功能
特性。而回归测试集内测试例的选择标准是:
·验证基本的行为;
·能在较少的时间内执行大量的设计;
·过去发现过错误的测试例。
·自动回归测试由自动验证环境执行,根据一定的算法随机产生激励[23],每
次的回归测试都会提高覆盖率,直到达到覆盖目标[24]。由于使用由覆盖率驱动的
原理和能自动实现而优于经典的方法[25]。
第三章 功能验证平台设计 29
3.2 功能验证方法
功能验证是使用测试平台测试被验证对象的功能。测试平台是根据设计对象
的规则约束而建立起来的。主要是三种功能验证方法:黑盒验证、白盒验证和灰
盒验证[26]。
3.2.1 黑盒验证
在黑盒验证中,设计被当成一个黑盒子,对验证人员而言不知道内部设计细
节,根据设计规范,验证设计是否符合规范。在这种验证方法中,验证和设计相
分离,验证方案与电路的设计方案完全不挂钩,验证人员只关注规范,列出需要
验证的特性,然后组织适当的用例来验证这些特性。
黑盒验证法可以发现下面类型的错误:
·初始化和中止错误;
·接口错误;
·性能错误;
·未实现的或实现不正确的功能。
由于缺乏可观测性和可控性,黑盒验证法很难发现隐藏在设计内部的错误。
3.2.2 白盒验证法
白盒验证法也可称为结构验证法,为验证人员提供了很好的可控性和可观测
性。由于知道设计的内部细节,容易产生特殊情况的激励来检测内部设计的错误。
验证环境的建立相对明确、简单,具有较强的针对性,结果检查相对来说简单一
些。这种方法被广泛应用于设计验证中。白盒验证法的缺点是验证人员要知道设
计内部的细节。
3.2.3 灰盒验证法
灰盒验证法是介于白盒和黑盒验证之间的一种验证方法。验证人员在关心规
范需求的同时又关心电路的详细设计方案,需要依据两者制定验证方案。如同黑
盒验证法,灰盒验证法通过顶层接口控制和观察整个设计,但是又需要验证一些
重要的特定的设计细节。
本文设计 Tag 功能验证[27][28]平台时,清楚 Tag 芯片设计思路和内部细节。因
此对 Tag 进行功能仿真采用的是白盒验证方法,这样大大有利于激励的设计。
3.3 验证平台的设计
在仿真验证中,设计的有效性必须通过设计对激励响应结果得以体现,有几
30 Tag 芯片的功能验证平台的设计
种方式可以检查设计的响应是否正确。
(1) 方法一:通过人工观测 DUV 输出波形的结果是否正确是常用的一种方
法,这种方法简单、直观。在出错时,通过人工干预,可以立即停止仿真。但是,
其缺点是工作量大,易出错。
(2) 方法二:通过日志的方式,将一些结果输出到文件中。在仿真结果后,
分析日志文件的结果。这种方式的主要缺点是结果分析需要等到仿真结束。
(3) 方法三:自检查方式,它是在仿真过程中,自动将预期的结果和仿真的
输出的结果进行比较,一旦出差,仿真就自动停止。这种方式的优点是能在仿真
的过程中,并行地自动检查设计的正确性[24][25]。
理想情况下,预期的结果通过参考模型体现。图 3.2 给出参考模型、激励、
DUV 之间的关系。通常,建立一个功能非常完善的参考模型比较困难,需要大量
的时间,对于功能比较复杂的设计,纯用 Verilog 或 VHDL 语言比较难以实现的,
可以使用专用的验证语言,如 Syopsys 公司的 Vera 或 Cadence 公司的 testbuilder
等,也可以使用 C/C++等高级语言构造参考模型。
图 3.3 验证平台
第三章 功能验证平台设计 31
3.4 被验证对象
第四章 PLI接口程序设计
Verilog 语言提供了一组标准的任务,在设计时,经常会遇到一些特殊的情况,
需要通过定义自己的系统任务和函数才能实现设计目标。为了做到这一点,设计
者需要与表示设计的内部数据结构以及 Verilog 仿真器的仿真环境进行交互。编程
语言接口(PLI)提供了一组接口子程序,用于访问(读/写)内部的数据表示,并可以
提取仿真环境信息。用户自定义的系统任务和函数可以通过这组预定义的 PLI 接
口子程序来创建[29]。本章详细阐明 PLI 语言的使用和 PLI 在 Modelsim 环境下的
配置,然后详细分析研究验证平台中两个 PLI 程序的设计原理和设计过程,以及
PLI 与 C 程序之间的数据交换方式和它们之间的联系。
4.1 PLI接口语言
4.1.1 PLI的发展
4.1.2 PLI任务
Verilog编译
PLI库子程序
用户自定义
设计的内部表示
PLI库子程序
C子程序No.1
(数据结构) 用户自定义
C子程序No.2
用户自定义
C子程序No.3
进行各种操作的
仿真
PLI库子程序
仿真输出
借助于用户自定义的C程序实
现任务,使用PLI裤子程序
把PLI连接到仿真器
在Verilog程序中任何需要的
地方调用:$< 任务名>
4.1.3 PLI子程序
PLI 库子程序提供了对表示设计的内部数据结构进行存取的标准接口,而定
义用户自己的系统任务而编写的用户自定义 C 子程序是用 PLI 库子程序编写的。
在 4.1.2 中,$hello_verilog 是用户自定义系统任务,hello_verilog 是用户自定义 C
子程序,io_printf 是 PLI 库子程序。
PLI 库子程序有两大类,分别是存取子程序和实用子程序。
存取子程序提供了对内部数据结构访问的接口;它允许用户在 C 程序遍历数
据结构并提取与设计有关的信息;实用子程序主要用于在 Verilog 和编程语言的边
界之间传送数据并做一些日常管理维护工作。图 4.3 展示了 PLI 中存取子程序和
实用子程序各自所扮演的角色。
图 4.3 存取和实用子程序的作用
第四章 PLI 接口程序设计 37
(1) 存取子程序
存取子程序通常也称为 acc 子程序。存取子程序可以完成的工作有:从内部
数据结构的有关项读取特定对象的信息。把特定对象的信息写入内部数据结构的
有关项。
存取子程序可以读取设计中的对象信息。对象可以是下列类型中的任何一种:
·模块实例、模块端口、模块的端到端路径以及模块之间的路径;
·顶层模块;
·原语实例和原语端口;
·网络类型(net)、寄存器类型(registered)、参数类型(paremeterv or specparam);
·整型、时间型和实型变量;
·时序检查;
·命名事件。
存取子程序的一些特征如下:
·存取子程序总是以前缀 acc_开头;
·使用存取子程序的用户自定义 C 子程序必须调用子程序 acc_initialize(),以
初始化环境。退出时,用户自定义子程序必须调用 acc_close();
·如果一个文件中用到了存取子程序,那么必须包含头文件 acc_user.h。所有
存取子程序的数据类型和常量都预定义在文件 acc_user.h 中。
存取子程序的类型如下:
·句柄子程序:它们将句柄返回给设计中的对象,句柄子程序的名字总是以
前缀 acc_handle_开头;
·后继子程序:它们将句柄返回给设计中特定类型对象集合中的下一个对象。
后继子程序总是以前缀 acc_next_开头,而且以引用的对象作为参数;
·值变链接(VCL)子程序:这类子程序使用户的系统任务可以从监视对象值
变化的对象列表中添加和删除对象。VCL 子程序总是以前缀 acc_vcl_开头;
·取值(fetch)子程序:它们能够提取各种对象信息,比如完整的层次路径名、
相对名以及其它属性信息。取值子程序总是以前缀 acc_fetch_开头;
·修改子程序。
(2) 实用子程序
实用子程序是各种各样的 PLI 子程序,用于在 Verilog 与用户 C 子程序边界
的两个方向上传输数据。实用子程序通常也是称为“tf”子程序。
实用子程序的一些特征如下:
·实用子程序总是以前缀 tf_开头;
·如果一个文件中用到了实用子程序,那么必须包含头文件 veriuser.h。所有
实用子程序的数据类型和常量都预定义在文件 veriuser.h 中。
38 Tag 芯片的功能验证平台的设计
实验子程序可用于下列用途:
·获取 Verilog 系统调用任务的信息;
·获取参数列表信息;获取参数参考值;
·把参数新值回传给调用它的系统任务;
·监视参数值的改变;
·获取仿真时间和被调度事件的信息;
·执行日常管理维护任务,例如保存工作区,保存任务指针;
·执行 long 类型的算术运算;
·显示信息;
·挂起、终止、保存和恢复仿真[29]。
4.2 PLI接口程序设计
4.2.1 PLI(RD)模块
#pragma data_seg("shared")
unsigned char rt_string[200]={'\0'};
unsigned char rt_time[200]={0};
int rt_length=0; // PLI 与 C 交换信息的标志信息
#pragma data_seg()
#pragma comment(linker,"/section:shared")
从这段程序中可以看出,进程中开辟了 3 个内存空间,分别是 rt_string、rt_time
和 rt_length。R=>T 的数据采用串行输入,rt_string 存放数据串的值; rt_time 存
放该值对应的时间;rt_length 存放串行输入数据的长度。用这种方法可以表示任
何长度的任何数据串。
从 EPC Gen2 协议可知,R=>T 输入编码采用 PIE 编码,关于 PIE 编码方式在
2.2 节已作了详细的说明。帧头在“Query”命令之前发出,表明清点管理循环开
始。而所有其它的命令必须以帧同步信号开始,其中帧头由固定长度的开始分隔
符组成。对于 PIE 帧同步的输入,在 PLI(RD)模块中的 PLI 程序一开始就定义了,
这部分的程序如下:
// PIE 编码的帧同步
rt_string[0]='0';
rt_time[0]=125;
rt_string[1]='1';
rt_time[1]=9;
rt_string[2]='0';
rt_time[2]=35;
rt_string[3]='1';
rt_time[3]=29;
rt_string[4]='0';
rt_time[4]=35;
rt_length=5;
…
上面这段程序对应的波形是图 2.7 中 R=>T 的同步帧头对应的波形。当同步
码输入后,接下来的输入数据是命令,命令对应的代码和长度参考表 2.3。Query
命令输入时与其它命令输入有所不同,它采用图 2.7 中的 R=>T 的前同步码,比
其它命令多一个 TRCal,故在输入命令时还需要对 Query 进行单独处理。关于这
部分从 C 传送到 PLI 的部分程序主要如下:
…
if(*p & 0xf0==0x80) //判断是否是 Query 命令
40 Tag 芯片的功能验证平台的设计
{
rt_string[rt_length]='1';
rt_time[rt_length]=45;
rt_length++;
rt_string[rt_length]='0';
rt_time[rt_length]=35;
rt_length++;
}
for(i=0;i<length;i++) //输入命令
{
temp=p[i>>3]<<(i&0x07);
if(temp>127)
{
rt_string[rt_length]='1'; //数据为“1”的 PIE 码
rt_time[rt_length]=17;
rt_length++;
rt_string[rt_length]='0';
rt_time[rt_length]=35;
rt_length++;
}
else
{
rt_string[rt_length]='1'; //数据为“0”的 PIE 码
rt_time[rt_length]=9;
rt_length++;
rt_string[rt_length]='0';
rt_time[rt_length]=35;
rt_length++;
}
}
…
从上面的程序可以看出,该部分程序主要分两部分,一部分是区分输入的命
令是否是 Query 命令,如果是 Query 命令,就需要输入 TRcal。如果不是,就输
入命令。在这里,从 C 程序接收到的命令是命令代码对应的一组串行数据,PLI
程序需要将这组串行数据转换为 PIE 编码。另一部分是将数据转换成 PIE 编码。
第四章 PLI 接口程序设计 41
4.2.2 PLI(WR)模块
PLI(WR)模块中的 C 程序与
PLI将数存放
PLI 程序是通过 tr_flag 连接在一 Wait 在共享内存
tr_flag 为 1 时,就取走数据。
C的流程 PLI的流程
对于 C 程序这部分,它不但
要完成接收数据的功能,同时还 图 4.5 PLI(WR)流程图
要完成解码的功能。因为
Testbench 传送过来的数据是根据固定时间采样而得到的,Tag 输出的波形采用两
种编码方式,一种是采用 FM0 编码,另一种是采用 Miller 编码,关于这两种编码
在 2.3.2 节和 2.3.3 节里面有详细的介绍。至于输出采用什么编码方式,根据 Query
命令里面的 Mode 的值来确定。对于这两种编码方式,其解码部分的主要程序如
下:
…
if(Mode==0)
{//FM decode
state=1;
j=0;
i=0;
if(TRext!=0)
{
i =24;
}
i=i+12;
while(i<tr_length)
{
temp=(tr_string[i/8] >> (6-i%8)) & 0x03;
temp1=temp1 << 1;
j++;
if(state==1)
{
第四章 PLI 接口程序设计 45
if(temp==0x01)
{
state=1;
}
else if(temp==0x00)
{
temp1=temp1+1;
state=0;
}
else
{
tr_length=0;
return -1;
}
}
else
{
if(temp==0x02)
{
state=0;
}
else if(temp=0x03)
{
temp1=temp1+1;
state=1;
}
else
{
tr_length=0;
return -1;
}
}
if(j%8==0)
{
p[j/8-1]=temp1;
46 Tag 芯片的功能验证平台的设计
}
i=i+2;
}
p[(j+7)/8]=temp1<<(8-j%8);
*length=j;
tr_length=0;
}
else if(Mode==1)
{//miller 1 decode
state=2;
…
从上面的程序中可以看出,FM0 的解码是根据图 2.8 的 FM0 编码的状态图来
编写的。至于 Miller 编码也是根据对应的状态图来编写。通过上面程序的解码,
就会把 PLI 采样的 MOD 转换为对应信息。
为了是使 PLI 将 Tag 的信息传送给 C 程序,在 PLI(WR)模块的 C 程序部分定
义了 5 个函数,这 5 个的函数的定义如下:
#include "tag.h"
//定义共享内存
#pragma data_seg("shared")
unsigned char tr_string[200]={'\0'};
*int session={0};
*int state={0};
*int sl_flag={0};
…
int tr_length=0;
#pragma data_seg()
#pragma comment(linker,"/section:shared")
// 定义 reader_get_string 函数用它来分析 MOD 的值
extern "C" __declspec(dllexport) int __cdecl reader_get_string(unsigned char
*p,int *length)
…
// 分别根据同 Mode 值来分析 FM0 编码和 Miller 编码
if(Mode==0)
{//FM decode
state=1;
第四章 PLI 接口程序设计 47
…
else if(Mode==1)
{//miller 1 decode
state=2;
…
}
…
extern "C" __declspec(dllexport)int __cdecl tr_flag()
{
if(tr_length>0)
return 1;
else
return 0;
}
…
// 定义 reader_get_session 函数用来取 session
extern "C" __declspec(dllexport)int __cdecl reader_get_session(unsigned int
*session);
{
*session=session_c;
}
// 定义 reader_get_state 函数用来取 state
extern "C" __declspec(dllexport)int __cdecl reader_get_state(unsigned int *state)
{
*state=state_c;
}
// 定义 reader_get_s_flag 函数用来取 SL flag
extern "C" __declspec(dllexport)int __cdecl reader_get_sl_flag(unsigned int *
sl_flag);
{
*state= sl_flag_c;
}
从这段程序结构可以看出,先定义 C 程序和 PLI 程序的公共内存。公共内存的多
少根据设计的需要。然后定义 5 个函数,C 程序通过这 5 个函数来取公共内存的
数据。
48 Tag 芯片的功能验证平台的设计
第五章 验证平台的搭建
验证平台在整体架构上包括 Testbench、参考模型、比较器、Reader、DUV、
PLI 模块,对于各个模块的作用、功能和它们之间的关系在第三章已经阐明。本
章将从每个模块的功能出发,逐一详细分析研究各个模块的设计原理和相互之间
的联系,以及它们之间内部数据的转换。最后讨论 Tag 功能验证平台的验证过程
和应用过程。
5.1 Testbench
5.1.1 CLK、Reset、CMD
…
从这段程序可以看出,Testbench 验证的 DUV 时钟是以 1000ns 为周期。复位
信号高电平有效,复位信号的主要目的是完成 DUV 的初始化,DUV 的初始化是
整个验证的开始。
命 令 的 输 入 是 由 Reader 发 送 过 来 的 , 是 通 过 $Read_RT 来 完 成 , 调 用
$Read_RT(CMD,cmd_time,,),第一个参数表示的是命令对应的值,即 1 或者 0,
第二个参数是 CMD_time 是这个值对应的时间。在程序中延迟#cmd_time 是让其
值保持 cmd_time 的时间不变。这样就可以产生命令的波形,后面缺省的参数为系
统参数,这里不做说明。
5.1.2 State
5.1.4 MOD
else begin
date_counter=date_counter+1;
if (counter==16) begin //当 MOD 重组后有 16 个数据时,输出给 PLI
$Witer_TR(,,,mod_value,,);
counter=1;
mod_value= MOD;
else begin
counter=counter+1;
mad_value={mod_value<<1, MOD };
end
…
根据编码的规则可知,由于 MOD 的值和长度都是不定,则 mod_vlalue 的长
度也是不定的,在输出 MOD 时需要计算 MOD 的长度。为了配合 PLI 对 mod_value
的解码,重组 MOD 时定义 mod_value 的长度为 16,对应的 MOD 值由多个
mod_value 反映。当 counter 为 16 时,就把 mod_value 的值送给 PLI 一次。另一
方面,用 date_value 来记录 MOD 连续出现 0 的次数,当 date_value 的值为 2 时,
表明 MOD 在连续三个时钟的内为低电平时,这就表明 MOD 输出信号已经结束
或者没有输出信号。当 MOD 输出表示已经结束时,Testbench 还将把余下的 MOD
数据传送给 PLI,通过以上过程,完成了一次 MOD 数据输出。MOD 保持低电平
表明没有输出信息,程序会继续等待下一次输出。
mod_value 的值通过调用$Witer_TR(,,,mod_value,,)传递给 C 程序,从这个函
数的调用可以看出,前 3 个参数为缺省值,在 PLI(WR)模块中规定了前三个参数
对应的值应该是 sesisin、SL_flag、state,当不需要输出这三个值时,选择缺省。
这是因为 mod_value 的值在一个命令执行完后,一次输出不能将所有信息输出,
它输出的次数是由输出的数据多少决定。而 sesisin、SL_flag、state 在一条命令执
行完后其值是固定的,一次就可以输出给 PLI。它们的下一次变换需要等到下一
条命令执行完后。所以一般选择这三个信息一起输出,而 mod_value 与它们分开
输出。在$Witer_TR 系统函数中,第 4 个参数才是 mod_value,顺序由 PLI 接口程
序决定。所以在调用系统函数时,参数的顺序要严格按照 PLI 接口的规定的顺序
来调用。
5.2 参考模型
的一部分,它的正确性直接关系到验证平台的正确与否。它的设计思路和工作原
理完全依据 EPC Gen2 协议。
参考模型主要包括两部分,一部分是解码部分,这部分的主要目的是分清接
收到的命令是什么命令和所对应的参数;另一部分是命令模块,Tag 在不同命令
下的反应是不同的,命令模块根据不同的命令来设计对应命令下的状态反应和回
复值。参考模型的设计流程如图 5.1 所示,从流程图可以看出参考模型中的解码
部分在分析命令的同时还需要区分命令的有效性。
本文的 DUV 设计包括 QueryRep、ACK、Query、QueryAdjust、Select、NAK、
Req_RN、Read、Write、Kill、Lock 等 11 个基本命令,参考模型也是根据这 11
个命令来设计。
在参考模型中,解码模块根据表 2.3 的命令代码区分这 11 个命令和各个命令
对应的长度和所对应的参数,来区分在该参数下的命令是否有效。而命令模块也
会根据 Tag 在这 11 个不同的命令下作出的不同反应来设计所对应 11 个命令模块。
命令模块的设计包括 S_Tag 分别在这 11 个命令下的状态反应、session 反应、MOD
反应、Slot flog 反应,还包括某些系统参数的反应,甚至还包括 EPC 和用户存储
器的读写。参考模型中解码模块和命令模块都比较多,为了分析研究 S_Tag 的设
计,这里仅以 Query 命令来分析研究对应的解码模块和命令模块的设计。
图 5.1 参考模型设计流程
5.2.1 解码模块
模块来区分无效的和有效的命令,而标签应忽略无效命令,总的来说,
“无效”是
指,(1)在既定的当前标签状态下不正确的命令,(2)该标签不支持的命令,(3)参数
不正确的命令,(4) CRC 错误的命令,(5)规定错误通话的命令,(6)未被标签以其
它方式确认或执行的命令。而对于有效命令,则应该按照图 2.3 执行。图 2.3 的状
态图是从整体上来反应状态之间的变化,对于某个具体的命令和对应的参数没有
详细说明。
S_Tag 的所有的命令代码参考表 2.3。Query 命令的参数如表 5.1 所述。它的
命令代码为 4 位,即 1000,接下来是参数 DR、M、Trext、Sel、Session、Target、
Q 和 CRC-5。解码模块需要定义这些对应的变量来存放其对应参数的值。当 S_Tag
接收的代码为 1000 时,命令模块就会确定该命令为 Query 命令,然后根据 Query
命令的要求来确定该命令是否有效。由于 Query 命令的长度要求为 22,当长度不
等于 22 时,说明这个命令是无效的;当长度为 22 时,就根据各个参数的长度来
确定各个参数的值。再根据对应的参数是否符合对应的参数要求,需根据不同命
令的要求而定。在 Query 命令中具有 CRC 校验,通过 CRC-5 来判断输入的命令
是否有效。
表 5.1 Query 命令参数
命令 DR M TRext Sel 通话 目标 Q CRC-5
位号 4 1 2 1 2 2 1 4 5
描述 1000 0: DR=8 00: M=1 0:无导 00:全部 00: S0 0: A 0–15
1: 01: M=2 频音 01:全部 01: S1 1: B
DR=64/3 10: M=4 1: 采 用 10: ~SL 10: S2
11: M=8 导频音 11: SL 11: S3
对于其它的命令,区分其是否有效,也按上述类似的方法来确定。各个命令
对应的要求按照 EPC Gen2 协议的规定来确定。
5.2.2 命令模块
Query 命令可以启动新通话中的或以前通话中的盘存周期。如果处于确认状
态、开放状态或保护状态的标签收
表 5.2 标签应答 Query 命令
到的 Query 命令的通话参数与前通 应答
话匹配,则应为该通话倒转其已盘 位号 16
标记(即 A→B 或 B→A)。如果处于 描述 RN16
确认状态、开放状态或保护状态的
标签收到的 Query 命令的通话参数与前通话不匹配,则应在开始新的盘存周期时
保持前通话的已盘标记不变。处于除灭活状态之外任何状态下的标签应执行
Query 命令,处于灭活状态下的标签应忽略 Query 命令。对应的 Query 应答如表
5.3 所示。设计 Query 命令模块根据表 5.3 来设计。该模块的流程根据当前的状态
来设计,即先确定当前处于什么状态,然后根据当前状态来编写当前 Tag 应该具
有的反应。这里包括比较不同的参数,这些参数符合某种条件,Tag 作出对应条
件下的应答和次状态的改变。这里需要对槽计数器作出说明,由于 DUV 中槽计
数器是通过随机数模块来产生的,所以其值是不确定的。为了使 DUV 的槽计数
表 5.3 Query 应答表
始态 条件 应答 次状态
槽=0;匹配已盘标记和 SL
反向散射新 RN16 应答
标记
就绪、仲裁、应答 槽<>0;匹配已盘标记和 SL
- 仲裁
标记
其它条件 - 就绪
反向散射新 RN16;仅当
槽=0;匹配已盘标记和 SL 新通话与前通话匹配时,
应答
标记 状态才从 A 盘存到 B 或从
B 盘存到 A
仅当新通话与前通话匹
确认、开放、保护 槽<>0;匹配已盘标记和 SL
配时,状态从 A 盘存到 B 仲裁
标记
或从 B 盘存到 A
仅当新通话与前通话匹
其它条件 配时,状态从 A 盘存到 B 就绪
或从 B 盘存到 A
灭活 全部 灭活
注:Query 命令(在除灭活命令的任何状态)开始一个新盘存周期,并可以改变该通话。Query
命令指示标签将新的随机数值载入其槽计数器内。
跟参考模型中的槽计数一致,参考模型则不产生随机数,而是直接使用 DUV 的
槽计数。为了得到这个槽计数,验证平台通过 PLI 把 DUV 的槽计数的值传递过
来, 这样使两者保持一致。
对于其它的命令模块,也是按照上述的方法设计。不同的命令对应不同的反
应,其细节上,这里不再作说明。在系统上,其的流程根据图 5.1 设计。这样就
58 Tag 芯片的功能验证平台的设计
完成了参考模型的设计。
5.3 比较器
State:Ready 否
…
Session: S0=1;S1=1;S2=0;S3=0
是
…
S_Tag:
继续/输出
State: Ack
Session: S0=1;S1=1;S2=0;S3=0 图 5.2 比较器流程图
…
从上面的显示可以可知,V_Tag 与 S_Tag 的状态不同,所以程序暂停。这样就需
第五章 验证平台的搭建 59
要去查看错误原因在于何处。当匹配时,程序会继续向下运行,同时也会输出这
六个参数的当前值。输出这些参数是为寻找下一次错误做准备。在查错时,由于
错误的原因不同,错误程度不同,有的错误仅仅靠当前的错误信息是发现不了的,
还需要靠前一次的反应结果来找出错误。有的错误比较隐形,甚至要追溯到前几
次的反应。
5.4 Reader
为了提高验证的有效性和效率,对于命令的方式顺序和参数都是有所要求。Tag
的工作状态如图 2.3 所示,假如当前 Tag 的状态为 Ready,当接收到的命令不同
时,它的下一个状态不同。即使接收到两个 Query 命令时,也可能因为参数的不
同,其状态和执行的动作都会有所不同。为了提高验证的完整性,发送命令按照
下面几种情形来分类验证:
(1) 先分命令验证。Tag 设计包括 11 个基本命令,对于这 11 个命令,需要逐
一验证,每个命令对应的参数也需要遍历一遍;
(2) 再根据不同状态来验证同一个命令。由于同一个命令在不同的状态下的
反应是不同,所以验证时先确定其状态,即要求在 Ready 状态下,将一个命令所
有相关的参数遍历一遍。验证完一个状态后,换到下一个状态,又将一个命令的
所有相关参数遍历一遍。当在所有的状态下把一个命令的所有参数都遍历一遍,
就表示验证完一个命令;
(3) 为了避免边角情形,在验证过程中,将所有命令的顺序以及参数都采用
随机方式来产生,这样就能验证不可以预料状况和非法命令。
5.5 标签存储器
5.6 验证平台的应用
通过前几节分析,讨论了整个验证平台中各个模块的功能和作用,并分析研
究了各模块的设计思想和工作原理。通过这些模块可以搭建本文的验证平台。接
着本节主要分析验证平台的验证过程和如何使用这个验证平台。
5.6.1 验证过程
验证平台搭建好后,验证过程可以通过如下步骤来完成:
(1) 初始化。初始化包括对 V_Tag 的初始化和 S_Tag 的初始化。对于 V_Tag,
它的初始化是初始化所有触发器和存储器,是由 Testbench 给出的 Reset 信号来完
成 DUV 的初始化;对于 S_Tag 的初始化是程序自身完成。两者的初始化是否一
致直接影响到程序的运行。
(2) Reader 发出命令。当 S_Tag 和 V_Tag 都初始化后,Reader 开始向 Tag 发
送命令。
(3) S_Tag 和 V_Tag 执行命令。当 S_Tag 和 V_Tag 接收到 Reader 发送的命令
后,就执行该命令。
(4) 结果比较。S_Tag 和 V_Tag 执行完的结果传送到比较器中,比较器比较
它们的结果。当结果不一致时,程序就会暂停并打印相关信息;当结果一致时,
返回(2)继续执行下一条命令。
(5) 发完命令。当所有命令都通过验证时就可以结束了。
5.6.2 验证平台的使用
5.7 验证结果
运用验证平台验证
Tag 芯片,其验证过程的
部分显示如图 5.3 所示。
其报告给出了当前验证
的命令数目和命令。同时
也给出了结果和相关参
数的值。DUV 顺利通过
了 Tag 功能验证平台的
自动化验证。验证了不同
的情况包括在不同的状
态下相同命令的反应、在
固定的状态下不同的命
令反应和命令随机发送
图 5.3 验证显示图
下的反应。Tag 通过了这
3 种情况下的验证,这表明 Tag 芯片的功能符合 EPC Gen2 协议的要求,同时这个
平台也可以用于 Tag 的后仿真。Tag 芯片顺利通过功能验证和后仿真,现已在流
片中。
第六章 结束语 63
第六章 结束语
致谢
值此论文完成之际,谨向给予过我指导、关心和帮助的人们表示最衷心的感
谢。
首先要感谢我的导师杨银堂教授几年来对我辛勤的培养和真挚的关怀。杨老
师渊博的知识、严谨的治学态度、诲人不倦的精神使我受益匪浅,并将继续激励
着我在今后的工作中积极探索。
本论文是在导师杨银堂教授的关心和悉心指导下完成的。感谢杨老师给了我
这样的机会,使我能接触到最前沿的科研工作。并由衷地感谢他对本课题的热心
指导,从他那里,我不仅学到了严谨、求实的治学作风,更学到了许多做人的道
理,这些将使我终身受益。
感谢课题组的刘毅老师、付俊兴老师给我们营造了良好的学习、科研氛围,
为我们的科研课题顺利完成提供了充足的条件,也要感谢他们在本论文完成过程
中的大力支持和帮助。对课题组的杨孝峰、孟令勇、阳颖、黄丽芳、路璐等同学
在课题的探索、研究及论文的写作过程中所给予的帮助表示真诚的谢意,和他们
在一起学习和工作的日子是我最值得回忆的。
衷心感谢父母对我的养育,感谢家人对我理解和支持。感谢他们在背后默默
的支持我,才能有今天的一点成绩。
最后,向所有关心、爱护、帮助过我的人们表示最衷心的感谢!
参考文献 65
参考文献
[1] Michael M.K. Lin, Charles V Trappey. The Development of Taiwan's integrated
circuit industry. Components Packaging and Manufacturing Technology, Part C,
IEEE Transactions on, Volume 20, Issue 4. Oct,1997. pp. 235-242.
[2] Zhenghua Jiang.The development of integrated circuit industry in China. Design
Automation Conference 2005, Proceedings of the ASP-DAC 2005, Asia and
South Pacific Volume 2.Jan,2005. pp.VI-VIII.
[3] 王琪. 半导体集成电路标准概述.信息技术与标准化. 2006 年第 6 期. pp.
25-28.
[4] Janick Bergeron. Writing Testbenches: Functional Verification of HDL Models.
Kluwer Academic Publishers. 2000. pp. 1-20.
[5] 张多利. 基于功能信息的验证工程学及若干验证技术研究. 合肥工业大学博
士论文.
[6] Andrew Piziali. Functional Verification Coverage Measurement and Analysis.
Kluwer Academic Publishers. 2004. pp. 15-30
[7] 蔡金青. 功能验证和 MCU 软核测试技术的研究. 合肥工业大学硕士学位论
文. 2004. pp. 12-24.
[8] 张殿东. 无线射频识别(RFID)技术. 电信技术. 2005,2. pp. 86-88.
[9] 雷震洲. RFID 标记技术及其应用. 信息网络. 2004,12. pp. 14-18.
[10] 陈志雄.射频识别技术 RFID 发展的前景及应用分析.金卡工程.2004. pp.
49-52.
[11] Oberli, Christian, Landau, Dan. Performance evaluation of UHF RFID
technologies for real-time passenger tracking in intelligent public transportation
systems. Wireless Communication Systems. 2008 ISWCS '08. IEEE
International Symposium . Oct 2008. pp108 -112.
[12] Zalbide I, VicarioJ, Velez, I. Power and energy optimization of the digital core of
a Gen2 long range full passive RFID sensor tag. RFID, 2008 IEEE International
Conference. April, 2008.pp.125 -133.
[13] 武岳山. EPC C1G2 进入 ISO18000-6C 的进程—更新的 ISO/IEC 18000-6 国
际标准[J],中国自动识别技术,2007 年第 1 期. pp. 38-43.
[14] 张纲,杨庆森,程君侠. ISO/IEC 18000-6(CD)研究综述[J],信息技术与标准化,
2004 年第 4 期. pp. 23-28.
[15] EPCTM Radio-Frequency Identity Protocols Class-1 Generation-2 UHF RFID
66 Tag 芯片的功能验证平台的设计