admin 管理员组

文章数量: 1086019


2024年4月16日发(作者:unix和linux的共同点)

H igh—Level Synthesis用户 

验证流程中的便携式激励建模 

Mike Andrews,Mike Fingeroff 

(Mentor,A Siemens Business) 

摘要:在过去一两年中,“便携式激励”已经成为验证领域的热门话题,但是像诸多“新”概念一样,它 

也是在一些既有工具和方法基础上演变而来的。例如,凭借基于图形的激励自动化工具(如Questa 

inFact),让不同设计抽象层次之间拥有共同的激励模型在多年前就已成为现实。Hi 一Leve1 Syn— 

thes i s(HLS)可将Sys temC/C++综合到RTL,这已经存在许多年。在c级使用混合内部开发环境或定 

向c测试进行功能验证的大多数用户均可采用该技术。然而,随着HLS现在支持超大规模的分层设计, 

对新验证方法的需求越来越突出,它需要支持符合高性能和高生产价值约束的SystemC/C++随机激 

励,以便在c级实现覆盖率收敛,而后还可以精确再现激励以测试综合RTL,确保万无一失。本文介绍了 

种方法,可用于定义(和改进)激励模型以帮助达到1 O0%的c++HLS DUT代码覆盖率,然后再在使用 

综合RTL的Sy stemVeri10g或UVM测试平台中重复使用。如果拥有一个真正通用的模型,还可以在两 

个环境之间保持随机的稳定性,如此一来,在一个域中发现某些问题时,便可在另一个域中调试。 

简介 

在卜多年前,ESL(电子系统级)方法曾风靡一 

时,当时有许多语言选项承诺会提高设计和验证的 

抽象级别,其中主要有C/C++、SystemC以及Sys— 

与此同时,许多用户一直在寻求更有效的方式 

来描述激励,特别是寻找方法来扩大可通过简要描 

述来自动化的验证场景数量,并且提高生成过程中 

的效率。 

Questa inFact已经能够提供这种能力,它采用 

temVerilog。虽然C/SystemC是抽象硬件和系统建模 

中最流行的语言,但SystemVerilog已经对高级验证 

(例如,随机约束激励和功能覆盖率)所需的必要功 

能进行标准化。 

基于规则/图形的方法,既借鉴了软件测试技术,又 

针对硬件验证进行了增强。由于该基于规则的模型 

独立于目标语言(已应用于至少7种不同的HVL 

环境),因此一直被作为便携式激励解决方案。 

http://www.cicmag.com 

川 S用户经常表示,他们改用C++/SystemC进 

行设计所获得的主要好处是验证性能,这样他们能 

够运行更多的测试。然而,C环境中没有任何标准能 

实现类似SystemVerilog对随机/自动化激励建模等 

为test—data—sV的SV类,j}lI 个 鄙将定l_义·个 

规则图形模型test_‘tata—gen、 

通过两个顶层规则文件, 人实际定义仃 

的规则段文件的公共层次结构、通过将所仃埘姚则 

高级验证功能的支持。便携式激励解决方案可提供 

这种强大功能,而且还可以保留在创建激励模型方 

面的投资,在用SystemVerilog封装RTL时可以在下 

游利用基于C的仿真环境,反之亦然。 

层次结构的定义都保留在公共文件中,编泽的『皋l彤 

模型会有完全相同的表现。 

test

data

C.rules文件有一个额外的结构,是一 

个用于指定所生成代码的语 特定 求的 

这种情况下,它指定r…生成的Ca+ 定义史什涂 

常用激励模型 

正如您所预想的,基于规则的激励模型是从丰 

要顶层规则文件(通常 j默认模板相差很小)以及 

加include语/uj所需的代码 、该 . 艾仆『t川JJ r1定 

义生成的HVI 义件的其他 f。 ,flf这 

图形模型没有影响 

test

刈’J,k-. ̄i[t{ 

data

gen.rseg义件定义rI冬I彤II『以 成的 

个或多个模块化规则段文件分层创建的。顶级规 

场景的规则,在这种情况F,就足迎过 2所 的 

test

则文件声明主rule—graph,为图形模型命名,并且根 

据所选代码架构,除导人用于定义待应用激励细节 

的必要规则段文件的语句之外,可能不需要包含任 

data对象的随机内容循环、 

tesLdatLC镕 

test

data

gen 

....

test

data

C:td 

——

td 

何其他内容. 

图1中的示例显示了四个单独的文件,其中两 

个(test—data—C.rules和test—dat.d_sV.rll|es)都定义 

了一个名为test—data_gen的 形对象 这两个顶层 

规则文件对应于特定图形组件,即用于实际激励模 

型的语高‘特定封装器 、换言之,inFaet自动牛成器将 

分别创建一个名为test—data—C的C++类和一个名 

testdatac 

l 

图2 test—data gen规则图形 

5≈ 

函test_data SV ̄s 

’t ja a r_1_1 e’ 

’ r ㈦a a —i 

注:场景规则【IJ’以也 多个刈象,【!IJ 

‘ 

相同对象类 的实例或多个/f 川 ) 的 

实例.以及其他l刘形拓扑 构,{=『I=j 将 

要介绍 

r.1e

gr ̄t t—d.t|-口啊{ 

t“test

rutm

gr ̄h test

data ̄{ 

mtt r 

 ̄ta p.{ 

、。te  ̄.ctuda._‘#1.ctudadata h、”. 

t-Po t’test

data

口en rseg‘ 

tBt

n|-口忡=te 

da伯

gen— te. 

, 

J 

’ 

iap,ort testdata

一 

rseg‘. 

t t

d-t--9酮

=test data ge.

ru re; 

} 

在tuFaet规则 。 ‘『f】,It+st—dat l埘象 

璃翮 蛳 №. 一 

1‘ 

●…………●………●…

f P t 

●●……

一 

 

●● 

∞testdata.9∞州

‘ 

≈ 

t st data ge.rseg 

本身被声日』】为一个 构,它徵定l义 ·个 

I 

’ Il_t● 伸t( 

struct packedarraye{ 

单独的规则段文件IlI以支持模块化fl1 

用。该结构 有额外的J 次结构,定义J 

名为paekedArrayO f1Il t kedA,Tm I的j 

{ aeta

_

ettioa d.t_I unsAgn ̄l 9 0Il8 

rutL.tllm ̄t{ 

*ti∞jmt fact Check[or. 

, 

) 

 ̄truct c^ed—r yj{ 

¨t|-xt 帅血f|【uasAga ̄d 6 0II 8 

) 

j 

1lport。test data rseg‘. 

iaterface flUltest dataI 

test

data td: 

{ 

¥1 ̄roct test一由fj{ 

packedArra at+d

. 

symbot test

data

g卟 e. 

’p ̄ckeg4rrsyl co.,rI 

test_d8ta一口en一 te 

fltLltdI 

j ,4Ct c ̄eckcov 

nn r·p¨t{ 

; 

1 

: 

! 

-· |__thm m‘--col【tIn‘i ·d 0 

coestta ̄.t nu·一col—c t 

J 

他结构,它们对应Ca+fiJ!』l试 台lll定义ji: 

用于DUT激励的Ca+结构 

这是该力‘法的 ·个天键 隶,【!』】规 

ouo_cot Ln= ̄da【L 8】. 

): 

) 

i H 

图1分层规则代码架构 

则同形引用具有相『州名称f¨J 次的埘象, 

并使用可映射到相应c++和SV类型的数据类型。 

由于inFact语言允许为所有变量定义位宽,因此我 

c++类是通过公共规则模型自动创建的,该类具有 

对应于以规则语言定义的接口的内置方法。test_ 

data

_

们可以定位Mentor算法的位精确数据类型和Sys— 

lemC数据类型。 

在本例中,测试数据对象的形式源自围绕c模 

型的C++测试平台,该模型执行可配置的向量乘积 

gen.rseg文件声明了一个名为6u的接口,可在 

任何类型为test data的实例上运行。这会在生成的 

HVL对象(名为ifc』ll,只是加上前缀 一)中产生 

t d t i F / a S e e .  一

{t 9 e t 1 r f d C U r t r S b A e p y 】 e d k y e C a p . {f d t 6 1 t l r S b A C O U r t r e p y l :k d y e C a p , d t l ; e S a — A Ak k a a r rr r e e e C C t a ap p】3 .b 1 :  d S a C n 

个方法、任务或函数。 

该方法、任务或函数将采用一个参数,即对应的 

累加。因此,实现该方法的第一步是确定哪些DUT 

输入将通过图形模型随机化,它们的位宽度是多少, 

并将其收集到测试数据结构或类中。在这种情况下, 

同名HVL对象的句柄——之前显示的test—data类 

或结构。 

S 

V 

d 

a 

d 

a 

y y n 

e 1 

h t a 

【 

t a 

】 8 

-, 

d C m  —

a O C 

packedArrayO包含10位值的8元素固定大小数组, 

因此,集成机制只是构造一个包含便携式激励 

】 8 

.● 

ta e a f 

.●} 

packedArrayl包含一个类似的7位值数组。与其相 

加的是一个名为hum_col的4位数值。用于这些结 

构的数据类型使用Mentor AlgorithmicC位精确数据 

类型定义,支持以任意精度进行设计建模。 

尽管这始于C++测试平台,但在SystemVerilog 

S 

模型的类的实例,然后使用带有句柄的测试平台 

test

_

data容器调用其ifcl』Il方法。图4所示为摘录 

自C++测试平台的代码,其中创建了一个用于 

test data结构的句柄(td—h),以及一个用于包含 

inFact模型的类的句柄(td_gen—h),后者的构造函 

域中也需要一个类似的对象。该对象的SystemVer— 

ilog和C++版本如图3所示。 

SyslemVerilog模型与inFact模型相似,可以包 

数调用将inFact的实例名称定义为内部使用。这个 

inFact实例名称很重要,稍后将会讨论。 

含代数约束,如果准备 

使用传统的Sys— 

a舡 

俪 邱 

” 

“ 

temVerilog .randomize 

()调用来随机化,则 

往往应该包含代数约 

柬。如果始终由inFact 

图形进行随机化,则没 

有此必要。 

m呲 

吖 m幡 m  

小¨兰 

订~ 

{4 

图3 SV和C++的测试数据类型 

//F0 r in Fact:in stance of testdata&graph 

注:这个简单示例 

中的单个约束将hum_col的值限制在1到8之间, 

但是inFact语言支持SystemVerilog中使用的所有常 

见约束运算符,并存在部分较小的语法差异。作为 

data td.h: 

test

dataC*td

gen-h: 

td

gen-h=n test—data—C(。td_gen—h。); 

test

_

——

_

项优势,熟悉SystemVerilog的用户可以采用提供 

Printf(。START\n。l: 

for(int t :t<SOB;t++)t 

//Ca L L the inFact filL inte rface 

td

gen—h。>ifc

fill(&td

h); 

_

的小工具来产生或者更新inFact图形模型。 

—_

num

_

col=td h hUm

COl; 

_

在0测试平台中运行 

定义测试数据对象之后,将便携式激励模型集 

成到c测试平台的工作就相当简单了。如前所述, 

for(int j卸;j ̄numcol;j++l‘ 

{I As sign testdata contents to DUT input va rs 

data

in.data【j】=td—h.data.data【j】: 

coeffs

in.data【j】=td_h.coeffs.data[j】; 

Printf(。Data=韧.coeffs= \n。.( ̄nt Jdata

in.data【j】 

图4 c++测试平台的代码片段 

在(:++测试中的ff1r循环内部,可以看到对 

数组中每组7位元素的所有 t>eft值都将被覆盖. 如 

果需要,可以添加不同的边缘容器(位于范 顶部 

if(:』】l疗法的调用,而后td—h结构实例的内容被分 

配给将应用于作为此T作平台中DUT的C函数的 

局部变量 . 

此架构与使用SyslemVerilog随机类或序列项 

和底部的各个值),在这种情7兄下,较大的数挝(10 

位数据值)会在两个极端各创建两个单值容器 、 

正如所希望的,完成自动化策略之后,代码覆盖 

率非常好(参见图5),达到100%(初始纯随机测 

试方法的结果低20%)。 

: 

以及.randomize()或者SystemC/SCV类及其“next” 

力‘法没有任何区别..唯一的区别是进行随机化的模 

是inFact图形模型。 

Coverage Summary by StrectuFe:Coverage Summary by 1 

在此阶段,inFaet便携式激励模 所带来的价 

簟圈瞄曩誓蠢薯 簟鞠Total。口帅g曹=(Fd ̄nng wel 

S tome ̄ 

Braoches 

100 00% 

0 

0 

6 

6 

6 

6 

l 1O0 00% 

l 100 00% 

值是随机化多个数值的能力,同时符合所有口丁能针 

对这些值或其关系定义的代数约束 

图5代码覆盖率结果 

往:能够在c++源卜实现l00%的代码缀盖牢 

考虑覆盖 

inFa<·t模型的额外价值在于可以在激励模型上 

覆盖另一种类型的输入,这被称为覆盖策略。在某 

种程度卜,町以认为该策略类似于SystemVerilog覆 

对于使用相同的激励在来自HI S的综合RrrIJf 轻 

松实现覆盖率至关重要 这是凶为调试c++槌盖M 

题远比调试HLS的RTI 输It{ 容易、、 

具有随机稳定性的便携式激励 

虽然获得高代码覆盖率魁好的,但本文的晕点 

是介绍如何为一个域开发激励模 以及一个或多 

个相关的覆盖策略,然后在另一个域中再次运i 、 

inFaet激励模型的种子 以If1 J1_】户定义,或者直接 

通过原始运行输出到文件 

该模型的SystemVm,ilog封装版本町以放入sV 

盖组,因为它定义了相关的变量、这些值的所需容器 

以及这 变量的交叉点。不同之处在于这是随机化 

过程的输入,町改变随机分布以有效地覆盖策略中 

的目标 

在这种情况下,所测量的覆盖率指标不是功能 

覆盖率覆盖点/交义点,而是代码覆盖率.后者在 

C/C++环境中更常见(尽管也可以实现功能覆盖 

率)。闪此顾名思义,在覆盖策略中定义的日标应该 

测试平台中,以与C版水相同的方式驱动}汀I 

DUT,即简单地实例调用包 它的SV类对象,然 

是编码的一项或多项策略能够实现高代码覆盖率, 

或者钊对其他策略未包括的特定领域。 

为本示例中的DIIT(乘数)非常简单,所以 

使用其内置任务i —riIl来随机化SystemVm.i1 ,g 

test

data类的内容.如图6所示 

个很简单的策略就足够r。inFaet工具集包含可 

在这种情况下,需要重新格式化test—data类中 

使用的封装数组,以适应l奉例叶J作为DUT输入的宽 

always曩《pOsedge c k J 

begzn 

if(rst==l’b6ll 

begin 

static test

通过各种输入创建覆盖策略的实用程序,其中包括 

预定义类 的自动化策略,使用CSV文件或电子表 

格定义的自定义策略,以及图形编辑器。在该示例 

中,可以使用自动化策略来分别针对每个激励变量, 

即兀交义。刈‘于test—data层次结构中的每个变量 

data td』=neⅥ 

star1c test

data

SV td

gen—h=new(’td

gen h’】 

】f(1td

gen—h m fietds

cov aI1.CoverageGoalsHaveBeenMetf)) 

begIn 

td

gen.h 1f ̄一fil.1ltd』): 

data

data

(包括每个数组元素),实用程序将采用约束分析确 

定所有合法值,并将它们划分为一定数量的容器。 

对于l奉 例,共指定了128个容器,因为这意味着该 

rsc

z={td—h data data【71.td

h data data【61.td—h data c 

tdJ data data【31.td data dataf21 td h data data【l J.td—h data 

coeffsdata

rsc

z={td—h coeff s data(7】,td—h coeffs data【6】.td—h 

td_h coeffs data【3】ltd—h coeffs data【2I.td—h 

——

aura

cot

rSC

z tdh flUm CO1.: 

end 

图6 SystemVer i I og测试平台代码摘录 

…l H【l】国集成电路 

China Integrated Circuit 

■—■ 一 

m 

l 

【 

’ 

reg对象,但是使用级联运算符{arrEl[O]….,arrEl[N]l 

来实现这一点则非常简单。 

在这个示例中,覆盖策略的状态可通过策略的 

另一个内置函数allCoverageGoalsHaveBeenMet() 

进行查询,并可用作生成新输入的限定条件,或者为 

测试定义循环退出条件。 

该方法的另一个优点是不需要改变C和Sys— 


本文标签: 激励 模型 定义