著录项信息
专利名称 | 一种SOC芯片的验证方法及系统 |
申请号 | CN201110217229.7 | 申请日期 | 2011-07-29 |
法律状态 | 暂无 | 申报国家 | 中国 |
公开/公告日 | 2013-01-30 | 公开/公告号 | CN102902834A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F17/50 | IPC分类号 | G;0;6;F;1;7;/;5;0查看分类表>
|
申请人 | 炬力集成电路设计有限公司 | 申请人地址 | 广东省珠海市唐家湾镇高新区科技四路1号1#厂房一层C区
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 炬芯科技股份有限公司 | 当前权利人 | 炬芯科技股份有限公司 |
发明人 | 李新辉 |
代理机构 | 深圳中一专利商标事务所 | 代理人 | 张全文 |
摘要
本发明适用于芯片技术领域,本发明实施例提供了一种SOC芯片的验证方法,所述方法包括下述步骤:加载测试程序;根据所述测试程序在系统接口函数库中调用相应的系统函数,根据所述系统函数,及所述系统函数对应的维护列表,生成随机事务;根据所述随机事务,对待测试芯片进行验证。本发明使得软件工程师编写的测试程序可以直接在现有的验证平台上运行,实现了软硬件协同验证,同时把低层信息进行封装,使得验证系统便于使用,且易于复用。
1.一种SOC芯片的验证方法,其特征在于,所述方法包括下述步骤:
加载测试程序;
根据所述测试程序在系统接口函数库中调用相应的系统函数,根据所述系统函数,及所述系统函数对应的维护列表,生成随机事务,所述维护列表包括多个不同的列表,具体为不同的系统函数与不同的列表进行对应,所述随机事务包括随机测试事务、随机IO操作事务和/或随机序列操作事务;
根据所述随机事务,对待测试芯片进行验证。
2.如权利要求1所述的方法,其特征在于,当随机事务为随机测试事务时,所述根据所述系统函数,及所述系统函数对应的维护列表,生成随机事务的步骤具体为:
在待测试器件配置列表中,查找与所述待测试器件对应的待测试器件配置;
根据所述待测试器件配置,生成与测试事务对应的类对象;
对所述类对象进行随机;
根据对所述类对象进行随机的结果,生成测试事务。
3.如权利要求2所述的方法,其特征在于,所述待测试器件配置包括待测试器件的寄存器映像和待测试器件的约束表达式,所述寄存器映像具体包括寄存器的名称、地址、位宽、默认配置值、当前配置值及前一次配置值,所述约束表达式限定待测试器件的随机参数的范围。
4.如权利要求1所述的方法,其特征在于,当随机事务为随机IO操作事务时,所述根据所述系统函数,及所述系统函数对应的维护列表,生成随机事务的步骤具体为:
确定随机IO函数中需要随机化的随机参数;
通过IO列表,按时间先后顺序产生所述随机参数的随机值;
根据所述随机参数的随机值,生成随机IO操作事务。
5.如权利要求1所述的方法,其特征在于,当随机事务为随机序列操作事务时,所述根据所述系统函数,及所述系统函数对应的维护列表,生成随机事务的步骤具体为:
确定测试程序需要的随机数或者随机序列的参数;
根据随机序列表及所述参数,计算测试程序需要的随机数或者随机序列;
将所述计算出的随机数或者随机序列返回给测试程序,并保存在随机序列表中。
6.如权利要求1所述的方法,其特征在于,所述测试程序包括测试主程序和测试中断服务程序;
当待测试器件没有中断产生时,执行测试主程序;
当待测试器件发出中断请求时,执行中断服务程序。
7.一种SOC芯片的验证系统,其特征在于,所述系统包括:
加载器,用于加载测试程序;
随机事务产生器,用于根据所述加载器加载的测试程序在系统接口函数库中调用相应的系统函数,根据所述系统函数,及所述系统函数对应的维护列表,生成随机事务,所述维护列表包括多个不同的列表,具体为不同的系统函数与不同的列表进行对应,所述随机事务包括随机测试事务、随机IO操作事务和/或随机序列操作事务;
验证单元,用于根据所述随机事务产生器产生的随机事务,对待测试芯片进行验证。
8.如权利要求7所述的系统,其特征在于,当随机事务为随机测试事务时,所述随机事务产生器包括:
器件查找单元,用于在待测试器件配置列表中,查找与所述待测试器件对应的待测试器件配置;
类对象生成单元,根据所述器件查找单元查找的待测试器件配置,生成与测试事务对应的类对象;
类对象随机单元,用于对所述类对象生成单元生成的类对象进行随机;
测试事务生成单元,用于根据所述类对象随机单元对类对象进行随机的结果,生成测试事务。
9.如权利要求8所述的系统,其特征在于,所述待测试器件配置包括待测试器件的寄存器映像和待测试器件的约束表达式,所述寄存器映像具体包括寄存器的名称、地址、位宽、默认配置值、当前配置值及前一次配置值,所述约束表达式限定待测试器件的随机参数的范围。
10.如权利要求7所述的系统,其特征在于,当随机事务为随机IO操作事务时,所述随机事务产生器包括:
随机参数确定单元,用于确定随机IO函数中需要随机化的随机参数;
随机值生成单元,用于通过IO列表,按时间先后顺序产生所述随机参数确定单元确定随机参数的随机值;
IO操作生成单元,用于根据所述随机值生成单元生成的随机参数的随机值,生成随机IO操作事务。
11.如权利要求7所述的系统,其特征在于,当随机事务为随机序列操作事务时,所述随机事务产生器包括:
随机序列确定单元,用于确定测试程序需要的随机数或者随机序列的参数;
计算单元,用于根据随机序列表及所述随机序列确定单元确定的参数,计算测试程序需要的随机数或者随机序列;
返回单元,用于将所述计算单元计算出的随机数或者随机序列返回给测试程序,并保存在随机序列表中。
12.如权利要求7所述的系统,其特征在于,所述测试程序包括测试主程序和测试中断服务程序。
13.如权利要求7所述的系统,其特征在于,所述系统还包括中断管理器,用于当有多个中断请求到来时,进行优先级管理和中断嵌套管理。
一种SOC芯片的验证方法及系统\n技术领域\n[0001] 本发明属于芯片技术领域,尤其涉及一种SOC芯片的验证方法及系统。\n背景技术\n[0002] 芯片设计完成后需要进行验证,验证的主要任务是验证设计的正确性,确定芯片是否符合所有的设计规范。\n[0003] 传统的验证方法是直接向量测试(direct vector test),直接向量测试是一种信号级验证,通过制造固定场景的激励直接在信号级上与待验证芯片进行通信,通过检查芯片引脚信号的值和变化来验证芯片的功能。这种验证方法要求必须事先设计出芯片的工作场景,验证人员直接处理非常低层次的信号级信息。采用这种验证方法,验证人员工作量很大,并且一些意外场景、错误处理场景不可能一一考虑和验证到,而导致验证不全面。当芯片比较复杂、规模比较大时,直接向量测试的验证方法基本没有验证能力。由于是信号级的验证,验证平台直接与芯片的接口协议相关,验证平台重用性很差,芯片换代时原有的验证平台基本不可以重复使用,必须重新搭建新的验证平台。\n[0004] 为了克服传统验证方法的缺点,芯片验证的发展趋势是提高抽象层次,进行事务级的验证。\n[0005] 代表性的事务级(transaction level)验证方法是验证方法手册(Verification Methodology Manual,VMM)。VMM验证系统的架构如图1所示,通过验证人员操作配置器中的约束条件来约束产生器产生测试事务,并通过自动比较器实现了在线自动比较。\n[0006] 采用VMM验证方法后,可以实现受约束的随机验证(constrained random verification),在设定的约束条件下进行随机,以覆盖正常工作场景和意外工作场景;覆盖率驱动验证(coverage driven verification),当功能覆盖率、代码覆盖率达目标值以后停止随机验证;全自动在线比较,遇到错误自动报警并停止仿真,保存现场;基于断言的验证(assertion based verification)。\n[0007] VMM验证方法实现了验证方法从信号级向事务级的转变,方便了数据通路类型芯片的验证。但由于VMM验证方法的数据交互和控制比较复杂,对多媒体芯片来说,操作待验证芯片的方法相当复杂,不方便控制仿真流程,易用性低,而且因为其无法加入设备驱动,故无法验证复杂的应用场景和升级成系统级验证。\n发明内容\n[0008] 本发明实施例的目的在于提供一种SOC芯片的验证方法,旨在解决现有技术对于现有验证平台,验证操作复杂,且无法验证复杂的应用场景,无法在仿真系统上实现软硬件协同验证的问题。\n[0009] 本发明实施例是这样实现的,一种SOC芯片的验证方法,所述方法包括下述步骤:\n[0010] 加载测试程序;\n[0011] 根据所述测试程序在系统接口函数库中调用相应的系统函数,根据所述系统函数,及所述系统函数对应的维护列表,生成随机事务;\n[0012] 根据所述随机事务,对待测试芯片进行验证。\n[0013] 本发明实施例还提供了一种SOC芯片的验证系统,所述系统包括:\n[0014] 加载器,用于加载测试程序;\n[0015] 随机事务产生器,用于根据所述加载器加载的测试程序在系统接口函数库中调用相应的系统函数,根据所述系统函数,及所述系统函数对应的维护列表,生成随机事务;\n[0016] 验证单元,用于根据所述随机事务产生器产生的随机事务,对待测试芯片进行验证。\n[0017] 本发明实施例通过加载的测试程序在系统接口函数库中调用相应的系统函数,根据系统函数,及系统函数对应的维护列表,生成随机事务,根据随机事务,对待测试芯片进行验证。使得软件工程师编写的测试程序可以直接在现有的验证平台上运行,将验证方法提升为系统级验证,实现了软硬件协同验证,实现了复杂应用场景的验证,同时通过把低层信息进行封装,使得验证系统便于使用,且易于复用。\n附图说明\n[0018] 图1是本发明提供的现有技术的VMM验证平台的结构图;\n[0019] 图2是本发明实施例一提供的SOC芯片的验证方法的实现流程图。\n[0020] 图3是本发明实施例一提供的测试程序开发的流程图;\n[0021] 图4是本发明实施例二提供的生成随机事务的方法的实现流程图;\n[0022] 图5是本发明实施例二提供的生成测试事务的实现示例的实现流程图;\n[0023] 图6是本发明实施例三提供的生成随机事务的方法的实现流程图;\n[0024] 图7是本发明实施例三提供的生成IO操作事务的实现示例的实现流程图;\n[0025] 图8是本发明实施例四提供的生成随机事务的方法的实现流程图;\n[0026] 图9是本发明实施例四提供的生成随机数或者随机序列实现示例的实现流程图;\n[0027] 图10是本发明实施例五提供的SOC芯片的验证结构图;\n[0028] 图11是本发明实施例六提供的SOC芯片的验证结构图;\n[0029] 图12是本发明实施例七提供的SOC芯片的验证结构图;\n[0030] 图13是本发明实施例七提供的随机器件配置操作单元的结构图;\n[0031] 图14是本发明实施例七提供的随机IO操作单元的结构图;\n[0032] 图15是本发明实施例七提供的随机序列操作单元的结构图;\n[0033] 图16是本发明实施例八提供的SOC芯片的验证过程的流程图。\n具体实施方式\n[0034] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。\n[0035] 本发明实施例通过上述加载的测试程序在系统接口函数库中调用相应的系统函数,根据上述系统函数,及上述系统函数对应的维护列表,生成随机事务,根据上述随机事务,对待测试芯片进行验证。\n[0036] 为了便于说明本发明的技术方案,下面通过具体实施例来进行说明:\n[0037] 实施例一\n[0038] 图2示出了本发明实施例一提供的SOC芯片的验证方法的实现流程图,详述如下:\n[0039] 在步骤S201中,加载测试程序。\n[0040] 在本发明实施例中,测试程序可以实现以下功能:\n[0041] (1)控制验证系统的流程。\n[0042] (2)取得和改变验证系统的状态。\n[0043] (3)操作、访问待测芯片。\n[0044] (4)产生随机测试事务来测试芯片。\n[0045] (5)其他标准C/C++能完成的操作。\n[0046] 在本发明实施例中,测试程序可以为驱动程序或者应用程序,例如,可以包括主程序和中断服务程序等,其中,\n[0047] 1、中断服务程序可以是具有以下形式的函数:\n[0048] int isr(int pid,int source,int port);凡具有以上形式的函数,均可以向系统注册,成为中断服务程序。\n[0049] 2、中断服务程序在主测试程序中的注册的方式,可以调用以下函数:\n[0050] int register_isr(int pid,int port,isr_pt isr);\n[0051] 其中的pid是测试器件编号,port是中断端口编号,isr即为欲注册的函数。\n[0052] 3、中断的形式可以分为软中断和硬中断,由“硬件”即待测试器件发出的中断称为“硬中断”,而测试程序亦可向系统发出中断,称为“软中断”。\n[0053] 调用下列函数即发出软中断:\n[0054] assert_irq(int pid,int source_id,int port_id)\n[0055] 其中,pid是测试器件编号,source_id是中断源编号,用于表明调用者身份,port_id则是中断端口编号。\n[0056] 在本发明实施例中,测试程序可以有多个,测试程序可以是标准的c/c++程序,此时,可以使用标准的c/c++编译器,而且测试程序可以以测试程序库的形式存在,例如,可以通过gcc等编译成测试程序库文件,测试程序库的开发流程可以采用如图3所示的开发流程,在开发过程中,根据c/c++库文件,分别开发测试主程序和中断服务程序,测试主程序和中断服务程序经过gcc编译成目标文件,所有目标文件经过打包生成测试程序库。\n[0057] 在本发明实施例中,可以通过直接编程接口(Direct Programming Interface,DPI)加载测试程序,通过DPI接口,C/C++程序可以调用EDA(Electronic design automation)语言域的函数,而EDA语言域也可以调用C/C++语言域的函数,当测试程序包含主程序和中断服务程序时,DPI接口也可以相应的有两个,分别对应主程序和中断服务程序。\n[0058] 在步骤S202中,根据测试程序在系统接口函数库中调用相应的系统函数,根据系统函数,及系统函数对应的维护列表,生成随机事务。\n[0059] 在本发明实施例中,随机事务可以包括随机测试事务、随机IO操作事务和/或随机序列操作事务。\n[0060] 在本发明实施例中,在系统函数库中调用相应的系统函数,系统函数具体可以包括控制函数、事件函数、IO函数、信号量函数、共享数据函数、线程函数或者随机化函数中的任意组合,其中:\n[0061] (1)控制函数\n[0062] 控制函数用于控制验证系统的运行,如暂停仿真,继续仿真,取得仿真时间,获得仿真系统当前状态,改变系统状态等,具体可以采用:\n[0063] sim_finish();//结束仿真\n[0064] sim_stop();//暂停仿真\n[0065] double get_time();//取得当前仿真时间\n[0066] (2)事件函数\n[0067] 事件函数用于测试线程之间的同步,其中,事件的发生或同步会操作相应的事件列表,\n[0068] int event_create();//创建一个事件列表项,返回事件编号\n[0069] void event_trigger(int event_id);//触发事件,通常在某仿真条件发生后触发\n[0070] void event_sync(int event_id,int sync_type);//同步到事件,在事件发生之前阻塞线程\n[0071] (3)信号量函数\n[0072] 信号量函数用于访问受保护的资源,操作信号量时会操作信号量列表。\n[0073] int semaphore_create(int key_count);//创建一个信号量表项,返回信号量编号\n[0074] void semaphore_get(int semaphore_id,int key_count);//申请信号量,若信号时不足则阻塞直到有足够的信号量。在访问资源前申请。\n[0075] void semaphore_put(int semaphore_id,int key_count);//释放信号量,访问完资源后应释放信号量以使其他线程能访问资源。\n[0076] (3)IO函数\n[0077] IO函数用于通过器件的端口地址直接访问待测试器件的函数,当支持多线程时,各IO操作之间还需要进行同步以确保它们的执行顺序是正确的,这个顺序是由IO列表来保证的,处于列表头的IO操作先完成,后续操作继后,以下为一些IO函数操作函数:\n[0078] void io_write(int pid,int address,int op_size,int data,int mask);//写器件\n[0079] int io_read(int pid,int address,int op_size);//读器件[0080] void io_burst_write(int pid,int address,int op_size,int burst_type,int*data,int*mask);//以迸发方式写器件\n[0081] void io_burst_read(int pid,int address,int op_size,int burst_type,int*data);//以迸发方式读器件\n[0082] void io_random_transfer(int pid,int start_address,int end_address,intop_size,int op,int burst_type,int ntests);//对器件进行随机访问[0083] (4)共享数据函数\n[0084] 当需要在测试程序各线程之间进行数据共享时,共享数据函数会将共享数据放在通用数据列表中以供各线程使用。\n[0085] void scfg_create_reg(char*reg_name,int init_value);//创建一个表项[0086] void scfg_set_reg(char*reg_name,int value);//设置一个共享项[0087] int scfg_get_reg(char*reg_name);//读取一个共享项\n[0088] void scfg_wait_reg(char*reg_name,int exp_value,int mask);//等待直到共享项的值为指定值\n[0089] void scfg_wait_reg_created(char*reg_name);//等待直到共享项被创建[0090] void scfg_wait_reg_write(char*reg_name);//等待直到共享项的值被设置[0091] void scfg_wait_reg_read(char*reg_name);//等待直到共享项的值被读取[0092] void scfg_wait_reg_change(char*reg_name);//等待直到共享项的值改变[0093] void scfg_wait_reg_not(char*reg_name,int exp_value,int mask);//等待直到共享项的值不为指定值\n[0094] void scfg_wait_reg_less(char*reg_name,int exp_value);//等待直到共享项的值小于指定值\n[0095] void scfg_wait_reg_larger(char*reg_name,int exp_value);//等待直到共享项的值大于指定值\n[0096] (5)线程函数\n[0097] 线程函数用于产生多线程,并可以在线程之间进行同步,取消等操作,线程列表保存了当前正在执行的线程以及它们的状态。\n[0098] int io_fork(int(*io_func)(),int total_args,...);//以并行线程方式执行函数,返回线程编号\n[0099] void io_sync(int schedule_id);//同步,阻塞直到指定编号的线程执行完[0100] void io_fiush(int pid);//同步,阻塞直到指定的主器件把所有IO操作做完[0101] void io_nop(int pid);//等待指定主器件的上一个IO操作完成[0102] void delay_t(double delay_time);//当前线程阻塞一段仿真时间[0103] void delay_clock(int pid,int clock_cycles);//当前线程阻塞一定时钟周期[0104] void sim_pause(int pause_id);//当前线程暂停\n[0105] void sim_resume(int pause_id);//继续执行被暂停的线程\n[0106] (6)随机化函数\n[0107] 随机化函数用于随机化待测试器件的配置,执行随机化函数时,一方面随机函数产生一个随机序列并存入随机序列表,一方面查询待测试器件配置列表,查找到对应的待测试器件并把对应的待测试器件配置加载进来,将其中的随机约束描述用于产生随机事务。\n[0108] int randc(int max,int min);//从范围[min,max]中取得一个不重复的随机整数\n[0109] int randc_array(int*ResultArray,int ArraySize,int max,int min);//从范围[min,max]中取得ArraySize个不重复的随机整数\n[0110] int randcase(weight_0,...);//从后续分支中随机取一条分支执行,分支的权重分别为weight_0,weight_1,...weight_N。\n[0111] void cfg_rand_regs(int pid,char*cfg_name,...);//随机化待测试器件寄存器以获得随机配置值\n[0112] void cfg_set_rand_mask(int pid,char*cfg_name,char*reg_name,intrand_mask);//为待测试器件寄存器设置随机掩码,确保不需要随机化的寄存器保持原有的值[0113] void cfg_flush_regs(int pid,char*cfg_name,char*reg_name...);//将随机好的寄存器值通过系统总线写到待测试器件(DUT)\n[0114] 在本发明实施例中,维护列表可以包括多个不同的列表,具体为不同的系统函数可以与不同的列表进行对应,例如,事件函数对应事件列表,IO函数对应IO列表,信号量函数对应信号量列表,共享数据函数对应通用数据列表,线程函数对应线程列表,随机化函数对应随机序列表及待测试器件配置列表。\n[0115] 1.事件列表(event table)\n[0116] 事件列表表示当满足某条件的事件发生了,在仿真系统中进行通知和同步。当仿真系统的某处发生了某事件,就可以声明事件并将事件放入事件列表,仿真系统的其它地方就可以以此事件为触发条件执行处理程序。各线程可通过事件函数操作事件。\n[0117] 2.IO列表(IO table)\n[0118] 测试程序测试待测试器件可能要通过访问待测试器件的寄存器来实现,IO列表将这些操作按时间先后顺序进行维护,实现IO操作同步,保证操作的合法性,同时也对测试程序进行了同步。\n[0119] 测试程序可以通过IO函数来访问待测试器件。\n[0120] 3.信号量列表(semaphore table)\n[0121] 当多个线程需要访问同一资源时,需要保证访问的互斥性。信号量(semaphore)就是保证互斥性的一种方法。每种资源对应若干个信号量;线程访问资源时需要先申请信号量,若信号量不足,则线程被阻塞,直到获得足够的信号量才解阻塞,访问到资源,最后释放信号量以使其他线程能访问资源。各线程可通过信号量函数操作信号量。\n[0122] 4.通用数据列表(universal data table)\n[0123] 通用数据列表保存了通用用途的数据,可供仿真系统各线程共享,各线程可通过共享数据函数访问通用数据。\n[0124] 5.线程列表(scheduled thread table)\n[0125] 测试程序可以用线程函数操作线程,测试程序可以引发多条同时执行的子线程,通过线程列表维护这些子线程,以保证线程的执行顺序是符合预期的,同时也是可控制的,例如,可在其他线程等待某线程完成,杀死某线程,引发子线程等。\n[0126] 6.随机序列表(random sequence table)\n[0127] 随机序列表用于维护随机序列,使得随机序列产生过程对测试程序来说是透明的,程序员不必关心具体的实现过程,测试程序可以通过随机化函数获取随机序列。\n[0128] 7.待测试器件配置列表(device under test configuration table),[0129] 待测试器件配置列表保存了当前系统的所有待测试器件配置文件(device under test configuration,dut_cfg)的清单。每个dut_cfg文件对应一个待测试器件。在操作待测器件时,从待测试器件配置列表中查找对应的待测试器件并将对应的待测试器件配置以产生随机测试事务。\n[0130] 在步骤S103中,根据上述随机事务,对待测试芯片进行验证。\n[0131] 本发明实施例通过上述加载的测试程序在系统接口函数库中调用相应的系统函数,根据上述系统函数,及上述系统函数对应的维护列表,生成随机事务,根据上述随机事务,对待测试芯片进行验证,使得软件工程师编写的测试程序可以直接在现有的验证平台上运行,实现了软硬件协同验证,同时通过把低层信息进行封装,使得验证系统便于使用,且易于复用。\n[0132] 实施例二\n[0133] 图4示出了本发明实施二提供的当随机事务为随机测试事务时,根据系统函数,及系统函数对应的维护列表,生成随机事务的方法的实现的流程图,详述如下:\n[0134] 在步骤S401中,在待测试器件配置列表中,查找与上述待测试器件对应的待测试器件配置。\n[0135] 在本发明实施例中,每个待测试器件都有一个待测试器件配置,待测试器件配置包括待测试器件的寄存器映像和待测试器件的约束表达式,上述寄存器映像具体包括寄存器的名称、地址、位宽、默认配置值、当前配置值及前一次配置值,上述约束表达式限定待测试器件的随机参数的范围,具体为:\n[0136] 1、待测器件的寄存器映像,包括寄存器的名称,地址,位宽,默认值,前一次配置值,当前配置值等。\n[0137] 2、待测试器件的约束表达式,约束表达式限定待测试器件的随机参数的范围,随机化时这些表达式将会被满足。如当前配置与前一次配置需满足的逻辑关系,两个寄存器需满足的逻辑关系,寄存器的值的合法范围等。\n[0138] 在步骤S402中,根据上述待测试器件配置,生成与测试事务对应的类对象。\n[0139] 在本发明实施例中,通过待测试器件配置确定待测试器件的寄存器映像及约束表达式,并根据待测试器件配置建立与测试事务对应的类对象,且将寄存器映像及约束表达式作为类对象的成员。\n[0140] 在步骤S403中,对上述类对象进行随机。\n[0141] 在步骤S404中,根据对所述类对象进行随机的结果,生成测试事务。\n[0142] 为了便于理解,以下以一个具体实现示例对本发明实施例的方法进行说明,但不以本实现示例为限,具体请参阅图5,系统函数调用时,通过待测试器件配置列表查找待测试器件,并加载对应的待测试器件配置,通过待测试器件配置获取寄存器映像及约束表达式,寄存器映像具体包括待测试器件寄存器的名称、地址、位宽、默认值、当前值、前一次值等参数及配置约束表达式,同时设置类对象的属性,将上述参数以及随机序列表中的数据作为事先建构的类对象的成员,解约束服务器调用类对象的随机方法对类对象进行随机,解出类对象的随机结果,完成类对象随机后,将解出的结果组合生成测试事务,测试事务产生以后被送到后续的事务处理器,再由总线驱动器驱动到待测试器件。\n[0143] 本发明实施例中,可以根据待测式器件的类型的不同设置至少1个待测试器件配置,具体可以包括待测试器件配置1、待测试器件配置2、......待测试器件配置N,其中,N为自然数,具体待测试器件配置数目N的取值可以根据实际的需要确定,在次不用以限制本发明。\n[0144] 在本发明实施例中,通过待测试器件配置使产生随机事务变得透明、自动,编写测试程序时不必考虑测试向量的覆盖率,也不必考虑测试向量是怎样产生的。通过自动对随机事务进行随机化,保证验证随机、全面和自动化。\n[0145] 实施例三\n[0146] 图6示出了本发明实施三提供的当随机事务为随机IO操作事务时,根据系统函数,及系统函数对应的维护列表,生成随机事务的方法的实现流程图,详述如下:\n[0147] 在步骤S601中,确定随机IO函数中需要随机化的随机参数。\n[0148] 在步骤S602中,通过IO列表,按时间先后顺序产生上述随机参数的随机值。\n[0149] 在步骤S603中,根据上述随机参数的随机值,生成随机IO操作事务。\n[0150] 为了便于理解,以下以一个具体实现示例对本发明实施例的方法进行说明,但不以本实现示例为限,具体请参阅图7,当随机事务为随机IO操作事务时,根据随机IO函数的参数,确定哪些参数是可以被随机的,哪些是固定的,其中,被随机的可以是操作地址,操作数,迸发方式,操作方式等,然后,通过IO列表,按时间先后顺序取出地址和地址随机掩码、操作数和操作数随机掩码、操作方式和操作方式随机掩码以及迸发方式和迸发方式掩码,当需要随机时,调用系统随机函数,获得地址、操作数、操作方式及迸发方式等随机参数的随机值,根据随机参数的随机值,生成随机IO操作事务。\n[0151] 实施例四\n[0152] 图8示出了本发明实施四提供的当随机事务为随机序列操作事务时,根据系统函数,及系统函数对应的维护列表,生成随机事务的方法的实现流程图,详述如下:\n[0153] 在步骤S801中,确定测试程序需要的随机数或者随机序列的参数。\n[0154] 在步骤S802中,根据随机序列表及上述参数,计算测试程序需要的随机数或者随机序列。\n[0155] 在步骤S803中,将计算出的随机数或者随机序列返回给测试程序,并保存在随机序列表中。\n[0156] 为了便于理解,以下以一个具体实现示例对本发明实施例的方法进行说明,但不以本实现示例为限,具体请参阅图9,在本实现示例中,测试程序需要获取满足特定条件的随机数或随机数序列。根据随机序列表中的已知的值,及上述参数,包括调用的系统函数中的已知的值、权重和范围使用数学运算的方法计算出符合条件的数或数组返回给测试程序,并结果保存在随机序列表中以待下次使,同时可以删除随机序列表中时间最早的项,以保持随机序列表的项数为固定值。\n[0157] 实施例五\n[0158] 图10示出了本发明实施例五提供的SOC芯片的验证系统的结构,为了便于理解,仅示出了相关部分的结构。\n[0159] 本发明实施例的系统的结构具体包括加载器101、随机事务产生器102及验证单元103,其中:\n[0160] 加载器101加载测试程序。\n[0161] 在本发明实施例中,加载器101加载测试程序,具体可以对测试函数库中的测试主程序或者测试中断服务程序进行加载并运行,当待测试器件没有中断产生时,则加载测试主程序并运行;而当待测试器件发出中断请求时,则加载中断服务程序并运行,此时,测试主程序被挂起暂停执行,转而执行中断服务程序,中断服务程序执行完成后,测试主程序继续执行。\n[0162] 随机事务产生器102根据上述加载器101加载的测试程序在系统接口函数库中调用相应的系统函数,根据上述系统函数,及上述系统函数对应的维护列表,生成随机事务。\n[0163] 根据上述随机事务产生器102产生的随机事务,验证单元103对待测试芯片进行验证。\n[0164] 当随机事务为随机测试事务时,所述随机事务产生器102包括器件查找单元、类对象生成单元、类对象随机单元和测试事务生成单元,具体为:\n[0165] 器件查找单元在待测试器件配置列表中,查找与所述待测试器件对应的待测试器件配置。\n[0166] 在本发明实施例中,所述待测试器件配置包括待测试器件的寄存器映像和待测试器件的约束表达式,所述寄存器映像具体包括寄存器的名称、地址、位宽、默认配置值、当前配置值及前一次配置值,所述约束表达式限定待测试器件的随机参数的范围[0167] 根据所述器件查找单元查找的待测试器件配置,类对象生成单元生成与测试事务对应的类对象。\n[0168] 类对象随机单元对所述类对象生成单元生成的类对象进行随机。\n[0169] 根据所述类对象随机单元对类对象进行随机的结果,测试事务生成单元生成测试事务。\n[0170] 当随机事务为随机IO操作事务时,所述随机事务产生器102包括随机参数确定单元、随机值生成单元和IO操作生成单元,具体为:\n[0171] 随机参数确定单元确定随机IO函数中需要随机化的随机参数。\n[0172] 通过IO列表,随机值生成单元按时间先后顺序产生所述随机参数确定单元确定随机参数的随机值。\n[0173] 根据所述随机值生成单元生成的随机参数的随机值,IO操作生成单元生成随机IO操作事务。\n[0174] 当随机事务为随机序列操作事务时,所述随机事务产生器102包括随机序列确定单元、随机序列确定单元、计算单元和返回单元,具体为:\n[0175] 随机序列确定单元确定测试程序需要的随机数或者随机序列的参数。\n[0176] 根据随机序列表及所述随机序列确定单元确定的参数,计算单元计算测试程序需要的随机数或者随机序列。\n[0177] 返回单元将所述计算单元计算出的随机数或者随机序列返回给测试程序,并保存在随机序列表中。\n[0178] 本发明实施例通过加载器加载测试程序,并在系统接口函数库中调用相应的系统函数,根据上述系统函数,及上述系统函数对应的维护列表,生成随机事务,根据上述随机事务,对待测试芯片进行验证,使得软件工程师编写的测试程序可以直接在现有的验证平台上运行,实现了软硬件协同验证。\n[0179] 实施例六\n[0180] 图11示出了本发明实施例六提供的SOC芯片验证系统的结构,为了便于理解,仅示出了相关部分的结构。\n[0181] 在本发明实施例中,可以通过直接编程接口(Direct Programming Interface,DPI)启动加载器,并将加载的测试程序加载至仿真系统,通过DPI接口,C/C++程序可以调用EDA(Electronic design automation)语言域的函数,而EDA语言域也可以调用C/C++语言域的函数。\n[0182] 其中,测试程序可以包含主程序和中断服务程序,相应的系统的DPI接口可以包括主程序DPI接口111和中断程序DPI接口112。\n[0183] 在本发明实施例中,当待测试器件没有中断产生时,执行测试主程序,当待测试器件发出中断请求时,执行中断服务程序,当有多个中断请求到来时,系统可以包括中断管理器114进行优先级管理和中断嵌套管理。\n[0184] 实施例七\n[0185] 图12示出了本发明实施例七提供的SOC芯片验证系统的结构,为了便于理解,仅示出了相关部分的结构。\n[0186] 随机事务产生器在系统接口函数库125中调用的相应的系统函数,系统函数具体包括:控制函数、事件函数、IO函数、信号量函数、共享数据函数、线程函数或者随机化函数。\n[0187] 统函数操作相应的维护列表126,维护列表种类具体包括:事件列表、IO列表、信号量列表、通用数据列表、线程列表、随机序列表和待测试器件配置列表。\n[0188] 在本发明实施例中,随机事务产生器128包括随机器件配置操作单元1281、随机IO操作单元1282和/或随机序列操作单元1283。\n[0189] 其中,图13示出了随机器件配置操作单元的具体包括器件查找模块131、类对象生成模块132、类对象随机模块133及测试事务生成模块134,其中:\n[0190] 器件查找模块131在待测试器件配置列表127中,查找与上述待测试器件对应的待测试器件配置,并加载与待测试器件对应的待测试器件配置。\n[0191] 在本发明实施例中,待测试器件配置可以包括待测试器件的寄存器映像和待测试器件的约束表达式,上述寄存器映像具体包括寄存器的名称、地址、位宽、默认配置值、当前配置值及前一次配置值,上述约束表达式限定待测试器件的随机参数的范围。\n[0192] 根据上述器件查找模块131查找的待测试器件配置,类对象生成模块132生成与测试事务对应的类对象。\n[0193] 类对象随机模块133对上述类对象生成模块132生成的类对象进行随机。\n[0194] 在本发明实施例中,类对象随机模块131调用相应的类对象的随机方法,对类对象进行随机。\n[0195] 根据上述类对象随机模块133对类对象进行随机的结果,测试事务生成模块134生成测试事务。\n[0196] 图14示出了上述随机IO操作单元的具体结构:\n[0197] 随机参数确定模块141确定随机IO函数中需要随机化的随机参数。\n[0198] 随机值生成模块142通过维护列表126中的IO列表,按时间先后顺序产生随机参数确定模块确定随机参数的随机值。\n[0199] 根据随机值生成模块142生成的随机参数的随机值,IO操作生成模块143生成随机IO操作事务。\n[0200] 图15示出了上述随机序列操作单元的具体结构:\n[0201] 随机序列确定模块151确定测试程序需要的随机数或者随机序列的参数。\n[0202] 根据维护列表126中的随机序列表及随机序列确定模块151确定的参数,计算模块152计算测试程序需要的随机数或者随机序列。\n[0203] 返回模块153将计算模块计算出的随机数或者随机序列返回给测试程序,并保存在随机序列表中。\n[0204] 实施例八\n[0205] 图16示出了本发明实施例八提供的SOC芯片的验证过程:\n[0206] (1)硬件工程师设计好待测试器件(device under test,DUT),提供寄存器-传输级代码(Register Transfer Level Code,RTL)\n[0207] (2)硬件工程师或验证工程师根据硬件设计规格书提取出描述器件特性的待测试器件配置约束文件(device under test configuration,dut_cfg)。\n[0208] (3)验证工程师根据当前流行的验证方法学(例如VMM)准备好验证系统其他部件如事务处理器、总线驱动器、监视器、自动比较器等。\n[0209] (4)验证工程师将上述DUT、dut_cfg、本发明的部件以及验证平台其他部件连接成验证系统。\n[0210] (5)验证工程师或软件工程师准备好以c/c++语言编写的测试程序作为测试文件,例如,测试程序可以为驱动程序或者应用程序。\n[0211] (6)验证工程师或软件工程师将测试文件,用标准c/c++编译器编译成测试程序库文件。\n[0212] (7)验证工程师用EDA仿真器编译验证系统。\n[0213] (8)验证工程师以时间作为随机种子(random seed)运行验证系统。\n[0214] (9)仿真开始后,主控制器通过加载器将测试程序库文件装载进验证系统并运行。\n[0215] (10)验证系统运行期间可能会发现硬件逻辑行为、性能等与硬件设计规格书定义不一致的缺陷(bug),这时,自动比较器暂停验证系统,记录下随机种子并导出仿真波形,交由验证工程师、硬件工程师共同调试;使用相同的随机种子重新运行验证系统可以重现缺陷场景,方便调试。硬件工程师更改设计后,验证工程师重新编译验证系统。\n[0216] (11)若验证系统运行期间未发现硬件缺陷,验证系统运行直到当前测试函数完成。\n[0217] (12)当前测试函数完成后,检查DUT代码覆盖率。\n[0218] (13)若未达到设定的覆盖率目标,则重复8~12步重新进行下一次随机仿真,直到代码覆盖率达到预定目标时结束仿真。\n[0219] 综上上述,本发明实施例通过上述加载的测试程序在系统接口函数库中调用相应的系统函数,根据上述系统函数,及上述系统函数对应的维护列表,生成随机事务,根据上述随机事务,对待测试芯片进行验证。,使得软件工程师编写的测试程序可以直接在现有的验证平台上运行,实现了软硬件协同验证,同时通过把低层信息进行封装,使得验证系统便于使用,且易于复用。\n[0220] 此外,通过待测试器件配置使产生随机事务变得透明、自动,编写测试程序时不必考虑测试向量的覆盖率,也不必考虑测试向量是怎样产生的。通过自动对随机事务进行随机化,保证验证随机、全面和自动化。\n[0221] 值得注意的是,上述系统所包括的各个单元只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。\n[0222] 另外,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件完成,相应的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。\n[0223] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
法律信息
- 2020-09-25
专利权人的姓名或者名称、地址的变更
专利权人由炬芯(珠海)科技有限公司变更为炬芯科技股份有限公司
地址由519085 广东省珠海市唐家湾镇高新区科技四路1号1#厂房一层C区变更为519085 广东省珠海市唐家湾镇高新区科技四路1号1#厂房一层C区
- 2015-12-09
- 2015-01-21
专利申请权的转移
登记生效日: 2015.01.06
申请人由炬力集成电路设计有限公司变更为炬芯(珠海)科技有限公司
地址由519085 广东省珠海市高新区科技创新海岸科技四路1号变更为519085 广东省珠海市唐家湾镇高新区科技四路1号1#厂房一层C区
- 2013-03-13
实质审查的生效
IPC(主分类): G06F 17/50
专利申请号: 201110217229.7
申请日: 2011.07.29
- 2013-01-30
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2009-08-26
|
2008-02-23
| | |
2
| |
2010-06-30
|
2010-01-01
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |