王志鹏, 徐争
HiSilicon Technologies Co., Ltd.
wangzhipeng@hisilicon.com
xu_zheng@huawei.com
VMM and ESL model have been widely used in verification, SystemVerilog Direct programming interface (DPI) provides a more efficient way to make VMM and ESL model work together than ever before, and Synopsys provides tools to support this feature, this paper gives one application of data exchange between VMM and ESL model with DPI interface in Hisilicon, shows how to integrate ESL model into VMM testbench as a reference model.
VMM验证环境和ESL模型已经越来越多的应用于芯片验证中,DPI接口提供了一种高效的方法使两者协同工作,Synopsys工具也在这方面提供了很好的支持,本文讨论了VMM和ESL模型通过DPI接口的数据交换在海思某项目里的具体应用,说明如何在基于VMM的验证环境里集成ESL模型作为参考模型。
在目前半导体产品面市时间要求高,系统设计不合理带来的成本浪费等各种挑战面前,业界普遍采用ESL设计流程来提前进行架构有效性验证,并且增强全流程的验证重用技术来应对挑战。
VMM则是从验证方法学的角度实现了提高芯片的验证效率,缩短验证周期,提高验证可重用性的效果。
SystemVerilog标准的DPI接口提供了比PLI、VPI更高效,也更便捷的接口来实现VMM与ESL模型协同验证。
本文涉及的ESL模型由ANSI C实现。
ESL模型本身提供统一的对外接口供RTL验证或其他应用使用。主要包括寄存器的接口、表项接口、数据包接口以及采样数据接口等。
所以,要使用ESL模型,必须有一个支持C语言,特别是支持C语言内存操作的接口来实现对ESL模型的调用。
ESL模型为什么不采用和Testbench统一的验证语言?这是一个从验证环境设计策略上很容易被提及的问题。如果能够统一两者的设计语言,那么我们可以省去在跨语言接口设计上的各种资源投入,同时可以避免接口不稳定带来的质量和进度方面的隐患。但是在长期项目实践的过程中我们发现,统一ESL模型和Testbench的设计语言,在具体实现上还是会遇到很多困难。
主要有几个原因:
首先,是工程师专业背景。ESL模型涉及算法、协议栈等专业知识。由半导体工程师编写ESL模型,在模型的协议符合度上很难保证。然而算法、协议方面的专家在软件实现知识背景上,通常对HVL了解有限,并不足以支持诸如SystemVerilog语言模型的实现和调试。
其次,是基于重用的考虑。ESL模型涉及的算法、协议栈很少会是全新的协议,更多的是经典协议的长期演进。这些协议的实现已经相对复杂,每一次新的模型的编写,都是在已有模型基础上的更新。从最底层开始实现哪怕一个很常用的算法或协议,对设计和验证人员都是一次非常巨大的挑战。
当然,如果新成立项目中不存在上述问题或者上述问题对项目带来的影响很小,归一化的验证语言是我们的必然之选。
VMM验证方法学强调验证环境的分层和重用。由于Synopsys提供了vmmgen、DVE、URG等工具,使得基于VMM的验证环境从编码、调试到用例编写、执行的,甚至覆盖率分析都更为方便,能够使验证工程师更多的关注于DUV的设计规格,从而发现更多的缺陷,为设计的质量提供更多的信心。
SystemVerilog DPI接口提供了比PLI和VPI更方便的应用程序接口。通过使用import、export,可以实现直接的SystemVerilog与C/C++语言之间function、task的相互调用,从而实现在应用最为广泛的建模语言和HVL之间的数据交换。
当然,由于DPI实现的数据交换是不同语言之间的数据交换,当然也就是不同数据类型、数据结构的交换,所以在实现上可能会遇到诸如内存泄漏、内存非法访问等问题。所以可能会用到valgrind、DDD等工具进行问题定位。
DUV主要有Ethernet和AMBA两个接口,Testbench中使用Designware VIP interface将验证环境与DUV进行连接。
除了调用ESL模型的接口,协议栈模型同样使用了DPI接口和验证环境进行通信。下图中的AMBA driver、AMBA monitor、ethernet xactor都各自调用了相关的DPI函数来访问DUV的ESL模型。另外,ethernet xactor还通过DPI接口调用协议栈模型完成以太网协议处理。
DPI接口本身提供了SystemVerilog与C之间多种数据类型的自动转换,覆盖了SystemVerilog协议中用于数据存储的大部分数据类型。
由于验证环境与ESL模型之间需要传递的数据量通常是比较大的,所以一次DPI调用传递的数据多数都是一个数组。再加上DUV的内部总线通常为32位甚至更宽,选择bit或者logic类型作为DPI接口使用的主要数据类型并不是最高效的。所以使用SystemVerilog的open array以及svOpenArrayHandle对于一个需要大量传输数据的验证环境而言,显得更为实际。
这里简要介绍寄存器操作和数据操作的相关DPI函数实现。
SystemVerilog Side (VMM testbench):
import “DPI-C” function int register_write(input string register_name, input int data);
import “DPI-C” function int register_read(input string register_name, output int data);
import “DPI-C” function int data_write(input int data [], input int data_length);
import “DPI-C” function int data_read(output int data [], output int data_length);
C side(interface for ESL model):
声明:
int register_write(const char* register_name, int data);
int register_read(const char* register_name, int *data);
int data_write(const svOpenArrayHandle arr_hdl, int data_len);
int data_read(const svOpenArrayHandle arr_hdl, int *data_len);
实现:
int register_write(const char* register_name, int data)
{
register_address = get_register_address(register_name);
write_register(register_address, data);
return error_code;
}
int register_read(const char* register_name, int *data)
{
register_address = get_register_address(register_name);
read_register(register_address, data);
return error_code;
}
int data_write(const svOpenArrayHandle arr_hdl, int data_len);
{
unsigned char * data_pointer = (unsigned char *)svGetArrayPtr(arr_hdl);
memcpy(data_buffer, data_pointer, data_len);
return error_code;
}
int data_read(const svOpenArrayHandle arr_hdl, int *data_len)
{
unsigned char *data_pointer = (unsigned char *)svGetArrayPtr(arr_hdl);
memcpy(data_pointer, data_buffer, sizeof(data_buffer));
*data_len = get_data_length();
return error_code;
}
DVE提供了C/C++ debug功能,用于调试DPI接口。甚至可以用该功能在集成环境中调试模型。
在调试DPI的过程中,可以像调试Verilog或者SystemVerilog一样,查看当前函数中各个变量的名称、类型、取值等基本信息。
也可以看到DPI接口的函数堆栈调用情况。
当然DVE的C/C++ Debugging特性还远远不能和DDD等专业工具提供的C/C++调试功能相比,所以DPI接口还是需要设计得尽可能清晰和简洁。使得C/C++模型和验证环境都具备单独调试的特性,在双方都调试通过的情况下,DPI的调试会是一件更容易处理的任务。
由于C语言是需要用户进行内存管理的语言,而Systemverilog恰恰相反,是不需要用户关心内存管理的。所以编写DPI接口的时候,就会遇到内存管理方面的问题。
通过一个简单的demo可以知道,如果简单地使用svGetArrayPtr();获得数据句柄的话,那么在C语言侧看到的内存排列情况并不一定和用户的想法是一致的,以bit、bit[7:0]、byte、int四种数据类型为例:
由于VCS实现的DPI接口有如上所述的特性,所以我们在32位模型中通过DPI传递数据的时候,都尽量使用int类型的数组,而不是bit[n:0]或者其他数据类型的数组,这样即节省DPI接口处理所需要的空间和时间,也更便于DPI接口相关问题的定位。
当然,从这里也不难发现,如果DPI接口设计不当,也很有可能出现下标越界导致仿真coredump的情况。
ESL设计方法以及VMM验证方法学,是目前应用较为广泛并且效果良好的设计和验证方法,通过SystemVerilog标准定义的DPI接口,可以很容易地将ESL模型重用到基于VMM验证方法学搭建的验证环境中进行DUV的验证。
目前的Systemverilog标准以及主流工具都重点关注ANSI C与SystemVerilog语言之间的接口。但是随着SystemC甚至C++在建模方面越来越多的应用,更便捷、数据传输效率更高的编程接口以及编程接口设计辅助工具、调试工具也会越来越受到欢迎。
感谢海思半导体李伟东等专家为该论文进行检视,感谢Synopsys张春林,陈俊杰, 杨冲等在Synopsys产品使用上提供的支持。感谢所有为本文提供素材,提出意见和建议的同事。
http://www.synopsys.com.cn/information/snug/2009/using-esl-model-in-vmm-verification-environment
文章评论(0条评论)
登录后参与讨论