路科验证(Rocker IC)专注于验证系统思想和前沿工程资讯,拥有一支活跃的技术原创团队,著有《芯片验证漫游指南》一书,致力为高校微电子相关专业学生与IC从业人员提供技术食粮。 您可以在手机移动端同步关注微信订阅号“路科验证”或是登录网页www.rockeric.com了解更多资讯。如果您需要联系我们,请发送邮件至 bin.rocker.liu@intel.com 。

SV及UVM高级话题篇之二:SystemVerilog开源公共库(下)

上一篇 / 下一篇  2018-06-12 21:03:45 / 个人分类:验证系统思想

  

SV开源库之二:cluelib

cluelib也是一个开源库,它来自于ClueLogic公司。而它的开发者也在其介绍cluelib的论文中谈到,SV缺少的底层函数之所以目前开源地较少,归结于几个现实因素:

  • 大多数的verifier缺少时间去开发一个完整的底层库。

  • 开发一个稳定的库需要花足够多的时间去测试。

  • 去定义一致的、可配置的函数和类并不是一件轻松的事情。

  • 另外,verifier对于一些只能重复去做的事情还暂时可以忍受,也就是说,重复在顶层函数实现上的代码他们还可以承受。

  • 最后,我们也已经谈到,由于技术和法律的限制,一些可靠的库依然无法对外公布和分享。


而cluelib也是目前开源的相对有生命力的(仍然在更新)的库。路桑在这本书中摘录的是有品质保证的库,如果将来这些库已经停止了更新,那么路桑也会在后续本书新的版本中将这一节进行更新,为读者推荐其它有品质的开源库。cluelib在开发时,也遵循了类似于svlib开发时的规则,比如尽量保持独立不依赖于其它SV库、可在多个仿真器和平台上移植、好的命名规则、参考已有的Python/Java的底层函数等。

cluelib也是由两部分方式实现的,一部分是完全由SV实现,另外一部分则由DPI-C++实现。cluelib中的类可以分为:

  • 文本处理类(text processing)

  • 容器类(container)

  • 策略类(strategy)

  • 验证相关类(verification specific)

  • 领域相关类(domain specific)

上图中的这些类在最新的cluelib中有的类已经过期(不存在),同时也有新的类出现。读者如果对这个库感兴趣,可以通过这个链接下载:

https://github.com/cluelogic/cluelib

而关于cluelib库的最新类的文档可以通过在线的方式查看:

http://cluelogic.com/tools/cluelib/api/framed_html/index.html


文本处理类

cluelib新定义了一个虚类virtual class text,text类中定义了与字符串处理有关的函数,并且全部声明为静态函数。这么做的好处是方便用户在外部直接调用静态函数,例如text::index(),同时这一点也符合SV用户对字符串操作的习惯。text类支持的函数按照返回值可以分为下面几种:

容器类

开发者借鉴了C++、Python的与容器类有关的类和方法,新定义了一些有用的类。考虑到文章篇幅的关系,我们这里给出一个类的大致划分:

  • pair

  • tuple

  • tree_node

  • route_node

  • aggregate

    • packed_array

    • unpacked_array

    • dynamic_array

    • queue

    • data_stream

    • bit_stream

  • collection

    • set

    • deque

    • tree

    • route


pair和tuple可以存放数据,并且提供一些比较和克隆的功能。

pair#(int,string) p;

p = new( 123, "a pair of int and string" );

$display( "%d", p.first ); // first element

$display( "%s", p.second ); // second element


tree_node和route_node在排序中经常会用到,因此如果读者需要构建图(diagram),用tree或者route模式,那么可以考虑使用这两种类和随后配套的tree和route类来构建图。

对于aggregate类集合中,按照存放数据的方式,又可以分为packed_array、unpacked_array、dynamic_array和queue、data_stream和bit_stream。下面是这些类的一些使用例码:

bit[7:0] pa; // packed array

bit ua[7:0]; // unpacked array

ua = packed_array#(bit,8)::to_unpacked_array( pa );

my_class ua[8]; // unpacked array of my_class

unpacked_array#(my_class,8)::reverse( ua );


collection类内部一般由queue或者associate array来实现,而比起SV已有的queue、associate array,它们提供更多的方法:

  • set类:包含没有重复的成员。

  • deque类:支持首尾双端push/pop的操作。

  • tree类:实现了tree模式的数据存储结构。

  • route类:按照route模式的数据存储结构。


从上面关于tree模式和route模式的结构图来看,显著的差别在于,tree模式的父节点(parent node)只有一个,而route模式的父节点可以允许有多个。所以在建立结构的时候可以根据不同的场景选用tree模式还是route模式。


策略类

对于上面的容器类在需要比较和格式化的时候,就需要用户自定义的方法或者类来实现。 comparator类用来比较两个容器对象,例如:

class pair_comparator #( type T = pair ) extends comparator #(T);

virtual function bit eq( T x, T y );

return x.first == y.first && x.second == y.second;

endfunction: eq

// ... other functions

endclass: pair_comparator


formatter类用来将容器中的对象例如长整形、枚举型或者句柄转化为字符串。例如下面的例子中,comma_formatter类将整形转化为由逗号间隔的字符串便于阅读:

comma_formatter#(longint) com_fmtr = comma_formatter#(longint)::get_instance();

$display( com_fmtr.to_string( 123456789 ) );  // 123,456,789


验证相关类

一些与随机相关的类,例如下面的类random_4_bin_num在例化之后,可以通过指定随机的范围和比重来实现随机约束,继而产生期望的数值。

random_4_bin_num n = new;

// min max wt

n.db = ’{ ’{ 100, 200, 1 }, // bin 0

’{ 300, 400, 2 }, // bin 1

’{ 500, 600, 3 }, // bin 2

’{ 700, 800, 4 } }; // bin 3

assert( n.randomize() );

$display( n.val ); // the randomized value


对象n在给定约束n.db之后,产生的随机值n.val将在100和200,300和400,500和600,700和800之间,而四个区间的比重是1、2、3和4。

另外,还提供计时器kitchen_timer。计时器的功能可以通过对仿真计时,继而用作看门狗(watch-dog timer)或者利用事件触发来处理其它事务。


领域相关类

而到了与验证具体功能领域相关的类,这恐怕是开发者总结了以往接触到的项目,继而将它们整理到了一起。目前cluelib提供了三个类:

  • crc

  • scramblers

  • network


以crc类为例,这个类或者说类簇,包含了多个静态函数,而每一个静态函数都会根据不同的协议标准返回需要的crc值。例如crc::crc5_usb返回crc-5-usb值,crc::crc7_mvb返回crc-7-mvb值。也许这些有限的领域相关类并不是读者需要的,但这种将现有验证功能领域的函数汇总收集为一个类、放入一个完整库的思路,值得verifiers们借鉴。


也许SV标准委员会在一开始制定SV标准的时候考虑地比较多,毕竟SV的首要使用对象,即早期的verifier们都是从古老的HDL世界迁移过来的“原住民”。为了让他们更快地使用SV的特性,在底层函数制定可能做了一些妥协。例如字符串string,是一个类型同时又提供一些方法,但它又并不是一个类,这一点不同于Java的显式String类,或者Python的隐形str类。它这种尴尬的位置使得后期在string类型做扩展时遇到了不小的麻烦,而开发者们不得不转而求其次重新定义了字符串类。当然SV另外一些特性,例如内存管理、垃圾回收、对象句柄操作等使用方式又尽量简单,不对使用者造成太多困扰,这一点值得肯定。


目前SV和UVM的现状就是开源生态圈没有建立起来,尽管一些EDA厂商例如MentorGraphics在推进这件事情(Verification Academy),但与软件生态圈的丰富第三方库比起来仍然有不小的差距。一方面这与验证从业人员的数量、编码方式、职业习惯有关,另外这也与半导体行业一直较为封闭的价值观有关(好的代码也无法开源出来)。我们本节希望通过介绍上面这些有限的但有质量的开源库,读者们可以更多地浏览源代码,了解开发公共库的常需要考虑的方向、如何测试库、发布和维护库等等,在自己所在的团队、公司层面可以更多地促成这样地事情。所谓前人栽树后人乘凉,至少可以让公司在功能验证方面的资源都整合在一起、有章法可循,而通过这种方式进一步确立验证工程师属于“正规军”的形象,让公司知道它的价值不单在于设计IP资源,同时也包括完善的验证IP资源。


下一节我们将进入软件开发过程中经常使用到的标准测试概念,和已经推出的和SV相关的单元测试方法《SV单元测试方法SVUnit》。


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



TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

路科验证

路科验证

路科验证(Rocker IC)专注于验证系统思想和前沿工程资讯,拥有一支活跃的技术原创团队,为高校微电子相关专业学生与IC从业人员提供技术食粮。 您可以在手机移动端同步关注微信订阅号“路科验证”。如果您需要联系我们,请发送邮件至 rocker.ic@vip.163.com 或者 bin.rocker.liu@intel.com 。

日历

« 2018-06-23  
     12
3456789
10111213141516
17181920212223
24252627282930

数据统计

  • 访问量: 116276
  • 日志数: 221
  • 建立时间: 2016-06-25
  • 更新时间: 2018-06-14

RSS订阅

Open Toolbar
博聚网