毕业设计论文基于功能覆盖率的处理器运算部件测试.docx

上传人:b****3 文档编号:10467866 上传时间:2023-05-26 格式:DOCX 页数:30 大小:506.35KB
下载 相关 举报
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第1页
第1页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第2页
第2页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第3页
第3页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第4页
第4页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第5页
第5页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第6页
第6页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第7页
第7页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第8页
第8页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第9页
第9页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第10页
第10页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第11页
第11页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第12页
第12页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第13页
第13页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第14页
第14页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第15页
第15页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第16页
第16页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第17页
第17页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第18页
第18页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第19页
第19页 / 共30页
毕业设计论文基于功能覆盖率的处理器运算部件测试.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

毕业设计论文基于功能覆盖率的处理器运算部件测试.docx

《毕业设计论文基于功能覆盖率的处理器运算部件测试.docx》由会员分享,可在线阅读,更多相关《毕业设计论文基于功能覆盖率的处理器运算部件测试.docx(30页珍藏版)》请在冰点文库上搜索。

毕业设计论文基于功能覆盖率的处理器运算部件测试.docx

毕业设计论文基于功能覆盖率的处理器运算部件测试

毕业设计(论文)

 

题目基于功能覆盖率的

处理器运算部件测试

专业微电子学

班级微电061班

学生杨光

指导教师余宁梅(教授)

 

2010年

 

基于功能覆盖率的处理器运算部件测试

专业:

微电子学

班级:

微电061班

作者:

指导教师:

职称:

教授

答辩日期:

2010-06-22

摘要

测试验证是数字集成电路设计中一个非常重要的环节,一般一个复杂的芯片从设计到封装成型,测试将占用百分之七十的时间。

因此,一种能花费最短时间,并且能最大限度测试出芯片中设计错误的测试方法是非常重要的。

基于功能覆盖率的测试方法就是一种可信性比较高的测试方法。

本论文主要研究如何用借助仿真工具以及基于功能覆盖率的测试方法,对微处理器中功能部件功能正确性及语法正确性进行批量测试。

测试过程是在systemverilog平台环境下进行的,应用gcc编译工具和GDB调试工具测试C-modle,以及应用Vcs仿真软件测试RTL代码,最后运用基于功能覆盖率的方法编写覆盖组方案代码以及用嵌入式汇编语言编写测试激励,完成C-modle和RTL代码中除了浮点除、浮点乘加以外的所有运算功能测试任务。

测试出部分功能部件模块存在代码语法错误或结构错误,并反馈改正。

达到了对数字电路测试验证的目的。

关键词:

测试,功能覆盖率,处理器功能部件,IEEE-754浮点标准

Abstract

Testverificationisaveryimportantpartofdigitalintegratedcircuitdesign,andgenerallyacomplexchipfromdesigntothepackage-molding,thetestwilltakeup70%time.Therefor,amothodoftestwhichcosttheshortesttimeandcantestthewrongofthedesignofthechipmaximumextentisveryimportant.Testingmethodbasedonfunctionalcoveragerateisamethodwhichhasarelativelyhighcredibility.

Inthispaper,studyhowtousethesimulationtoolsandtestmethodsbasedonfunctionalcoverageratetofinishthebatchtestsofthefunctionalcorrectnessandsyntacticcorrectnessofthecpu.Testingprocessiscarriedoutunderthesystemverilogplatform,usingGCCcompilertoolandGDBdebuggingtooltotestC-modle,andVCSsimulationsoftwaretotestRTLcode,finally,finishallthecomputingfunctionstestingtaskintheC-modleandRTLcodeexceptfloating-pointadditionandfloating-pointmultiply-addusingprogramcodecoveragegroupbasedonfunctionalcoveragerateandtestingstimulusbytheembeddedassemblylanguage.Testexistencesofthesyntaxerrororthestructuralerrorinsomefunctionalmodule,thenfeedbackandcorrect,whichhasreachedthepurposeoftestingthedigitalcircuit.

Keywords:

Test,Functionalcoverage,Processorfunctioncomponents,

IEEEStandard754forBinaryFloating-PointArithmetic

 

 

第1章绪论

1.1测试方法学的研究现状

随着微电子制造加工技术的发展,芯片的集成规模越来越大,系统级芯片的集成度早已跨过百万门级的规模。

另外市场对于电子产品的更新换代要求很快,对于系统级芯片的设计周期往往要求能够缩短至一年以内。

因此迫切要求提高设计的生产效率。

而当前在芯片的设计过程中验证已经成为开发过程中占用人力资源最多,耗费时间最长的部分。

按照以前那样用手工编写测试代码的方法,只能为小规模电路的芯片设计服务,只能达到比较低的测试覆盖率,不论从验证的效率,或是从验证效果方面考虑,都远远不能满足系统级芯片的设计要求。

随着集成电路产业技术的发展,芯片的规模和复杂度不断地提高,尤其是系统芯片(SOC)的兴起【1】,使得我们能在一个芯片上集成整个系统。

而这使得芯片的验证工作变得越来越复杂和困难,验证工作在芯片研发中所占的比重也越来越大,根据许多文献报道,近年来新推出的SoC芯片的验证工作量所占用的人力和时间超过了总资源的70%。

为了适应这种变化,人们提出了很多新的概念来提高验证工作的效率,包括断言、受约束的随机约束、功能覆盖率模型等等,通过采用这些机制,可以大大提高验证的效率和首次流片的成功概率。

本文将就这些机制中的一个方面,即针对功能覆盖率的验证过程,做一个简要的介绍,以引起国内同行的注意。

功能覆盖率简单地说是一个比例数据,指芯片中已验证过的功能占该芯片全部功能的百分比。

只有当芯片中所有的功能都被验证为正确时才能保证流片的成功,验证工作的目标就是尽量使功能覆盖率达到100%。

想要提高验证工作的效率,就必须在尽可能短的时间内,尽可能多地提高功能覆盖率。

1.2测试的意义

测试验证是数字集成电路设计中一个非常重要的环节,一般一个复杂的芯片从设计到封装成型,测试将占用百分之七十的时间。

即使投入这么长时间测试,芯片也不可能100%的测试通过【2】。

因此,一种能花费最短时间,并且能最大限度测试出芯片中设计错误的测试方法对于集成电路设计行业的重要性不言而喻。

浮点和定点的功能部件作为处理器中数据吞吐量最大的部件【3】,其稳定性非常重要。

就功能部件本身而言,它会遇到很大数量的数据崩塌点。

世界著名的半导体公司Intel就曾今因为浮点部件的错误没有测试出来而被大量召回,造成很大损失。

可见,处理器中功能部件是核心,而功能部件的测试,则是这个核心中的最重要的一个零件。

基于功能覆盖率的测试方法就是一种可信性比较高的测试方法。

不仅提供覆盖率报告反映以测试验证的进度,也为功能验证的完成提供重要的量化标准,保证验证工作的完备性,同时证明设计的正确性与可靠性。

1.3本文的主要内容

本课题主要研究基于功能覆盖率的处理器运算部件验证。

功能覆盖率简单地说是一个比例数据,指芯片中已验证过的功能占该芯片全部功能的百分比。

只有当芯片中所有的功能都被验证为正确时才能保证流片的成功,验证工作的目标就是尽量使功能覆盖率达到100%。

想要提高验证工作的效率,就必须在尽可能短的时间内,尽可能多地提高功能覆盖率。

本课题的主要任务是通过对测试功能部件指令研究与分析,结合所有的功能部件指令特点,完成C-modle和RTL代码中除了浮点除、浮点乘加以外的所有运算功能测试任务。

具体工作包括一下几点:

1)C-modle功能部件的基本功能测试。

2)C-modle在微处理器中的联调。

3)基于仿真软件RTL代码的测试。

4)用功能覆盖率的测试方法测试RTL代码。

 

第2章测试内容的基本介绍

2.1基于Mips指令集的微处理器功能部件的简单介绍

2.1.1功能部件在微处理器中的位置

图2-1处理器中功能部件的位置

图2-1为功能部件ALU和FALU在微处理器中的位置。

微处理器通过icache从内存中取出指令,经过译码后发往发射模块,发射模块从RF中取出操作数,并将指令发往功能部件单元模块,功能部件经过运算后将结果写入RF【4】。

2.1.2功能部件实现功能和内部结构

功能部件是微处理器中的核心运算部件之一,实现除了浮点除,浮点乘加以外的所有运算功能。

功能部件的内部结构主要分为定点ALU和浮点FALU两部分。

指令集的前八个模块复用为定点ALU模块,后五个模块复用为浮点FALU模块,定点ALU和浮点FALU共用一个入口寄存器和一个出口寄存器。

指令集具体包括以下模块:

1.位运算模块

2.固定取位模块

3.前导零模块

4.移位模块

5.加法模块

6.比较跳转模块

7.选择取位模块

8.跳转模块

9.浮点简单运算模块

10.浮点判断移位模块

11.定点转浮点模块

12.浮点转定点模块

13.浮点比较模块

2.1.3Mips指令集介绍

MIPS是高效精简指令集计算机(RISC)体系结构中最优雅的一种【5】;即使连MIPS的竞争对手也这样认为,这可以从MIPS对于后来研制的新型体系结构比如DEC的Alpha和HP的Precision产生的强烈影响看出来。

虽然自身的优雅设计并不能保证在充满竞争的市场上长盛不衰,但是MIPS微处理器却经常能在处理器的每个技术发展阶段保持速度最快的同时保持设计的简洁。

相对的简洁对于MIPS来说是一种商业需要,MIPS起源于一个学术研究项目,该项目的设计小组连同几个半导体厂商合伙人希望能制造出芯片并拿到市场上去卖。

结果是该结构得到了工业领域内最大范围的具有影响力的制造商们的支持。

从生产专用集成电路核心(ASICCores)的厂家(LSILogic,Toshiba,Philips,NEC)到生产低成本微处理器的厂家(NEC,Toshiba,和IDT),从低端64位处理器生产厂家(IDT,NKK,NEC)到高端64位处理器生产厂家(NEC,Toshiba和IDT)。

低端的微处理器物理面积只有1.5平方毫米(在SOC系统里面肉眼很难找到).而高端的R10000处理器,第一次投放市场时可能是世界上最快的微处理器,它的物理面积几乎有1平方英寸,发热近30瓦特.虽然MIPS看起来没什么优势,但是足够的销售量使其能健康发展:

1997年面市的44M的MIPS微处理器,绝大多数使用于嵌入式应用领域。

MIPS微处理器是一种RISC结构的微处理器【2】,它产生于一个特殊的蓬勃发展的学术研究与开发时期.RISC(精简指令集计算机)是一个极有吸引力的缩写名词,与很多这类名次相似,可能遮掩的真实含义超过了它所揭示的.但是它的确对于那些在1986到1989年之间投放市场的新型微处理器体系结构提供了一个有用的标识名,这些新型体系结构的非凡的性能主要归功于几年前的几个具有开创性的研究项目所产生的思想。

有人曾说:

"任何在1984年以后定义的计算机体系结构都是RISC";虽然这是对于工业领域广泛使用这个缩写名词的嘲讽,但是这个说法也的确是真实的-1984年以后没有任何一款计算机能够忽视RISC先驱者们的工作。

 MIPS的指令格式只有3种:

1、R(register)类型的指令。

该类型指令从寄存器堆(registerfile)中读取两个源操作数,计算结果写回寄存器堆。

2、I(immediate)类型的指令。

该类型指令使用一个16位的立即数作为一个源操作数。

3、J(jump)类型的指令。

该类型指令使用一个26位的立即数作为跳转的目标地址(targetaddress)。

MIPS的指令种类有:

1、算术运算。

2、逻辑运算。

3、数据传送。

4、条件转移。

5、无条件跳转。

6、特殊指令。

7、例外指令。

8、协处理器指令。

9、系统控制协处理器指令。

基于功能覆盖率的处理器运算部件测试采用了MIPS精简指令集(RISC)体系结构,改体系结构基于的理论是使用相当简单的指令,结合优秀的编译器以及采用流水线执行指令的硬件,就可以用更少的晶元面积生产更快的处理器。

2.2IEEE-754标准

2.2.1IEEE-754内容

有IEEE-754标准是IEEE计算机科学标准委员会的微处理器标准小组委员会浮点工作组于1985年制订的,主要是为便于软件的移植,给浮点数数据格式的表示、加、减、乘、除等运算处理等所作的统一标准【6】,并对于浮点数一些特殊数处理、异常处理以及最终结果的舍入进行了明确的规定。

图2-1-1浮点数的表示形式

图2-1-1为IEEE754标准表示形式。

在表示浮点数时,每个浮点数均由符号位S、指数部分E、尾数部分M三部分组成。

IEEE-754只定义了四种格式的浮点数据类型:

单精度、单精度扩展、双精度、扩展双精度格式【7】。

IEEE-754对于以下的一些特殊数据作了详细的规定:

1)NANs(非数)

当浮点数的指数部分全为1且尾数不全为0时,不论符号位的正负,则为NAN数,即非数。

非数又分为两种,一种为SNAN,一种为QNAN。

当SNAN作为操作数时,触发异常,应报无效操作错误;当QNAN作为操作数时,不触发异常,直接输出QNAN原数据,当操作数中出现多个QNAN数时,由设计者决定优先级。

SNAN和QNAN的区别由设计者确定。

2)无穷(∞)

当浮点数的指数部分为全1且尾数为全0时,则为无穷数,其正负取决于符号位。

所有对于无穷的操作都是精确的,且除以下两种情况外不触发任何异常:

1、无穷数是由有限数据计算产生或者是除0操作产生;

2、无穷数作为触发无效操作异常的操作数。

3)非规格化数

当浮点数的指数部分为全0且尾数不为全0时,则为denormal数,即非规格化数。

以64位双精度来说,此时隐含位不再为1而是为0,其

已经偏移的指数表示的真值为-1022而不是通常所理解的0-1023=-1023。

4)0

当浮点数的指数和尾数部分全为0时,则其值为0,符号位决定正负。

所有格式中对正负0有明显的区别,但是符号位只在某些特定的场合有意义,如乘零的时候,在其他地方则没有意义。

2.2.1IEEE-754舍入方式和异常情况

确定了浮点数的格式之后,我们最关心的就是浮点数的舍入方式及由此带来的误差。

浮点数运算中,运算结果有可能超出浮点数所容许的位数,舍入得目的就是使得有效数据的尾数保持在固定位数范围内。

IEEE-754标准规定了四种舍入模式:

1.就近舍入(roundtonearest):

结果被舍入成最接近原值的可表示数;如果两个值同样接近原值,那么根据IEEE-754标准,系统应该选择最后一个有效数字为“0”的那个值作为舍入结果。

2.向上舍入(roundtoward+∞):

结果被舍入成最接近原值而又大于或等于原值的可表示数。

3.向下舍入(roundtoward-∞):

结果被舍入成最接近原值而又小于或等于原值的可表示数。

4.向零舍入(roundtoward0):

结果被舍入成最接近原值而又绝对值又小于或等于原值的可表示数。

在各种浮点数运算、操作过程中,当出现某些情况时,系统必须通过特定的方式通知用户,IEEE-754用“异常(exception)”来表示这些情况。

IEEE-754定义了五中异常:

上溢(Overflow)

下溢(Underflow)由运算的结果所导致

不精确(Inexact)

无效运算(Invalidoperation)

由参与运算的操作数所导致

除以零(Divisionbyzero)

(1)非法操作例外V

当存在非法情况的两个操作数存在于一个可执行的操作中时,则发出V例外。

在浮点除法部件中具体包括:

两个零相除:

(+0)/(-0)、(+0)/(+0)、(-0)/(+0)、(-0)/(-0)

两个无穷数相除:

(+∞)/(-∞)、(+∞)/(+∞)、(-∞)/(+∞)、(-∞)/(-∞)

对SNAN的所有操作

(2)不精确例外

以下任一种情况发生时产生不精确例外:

舍入后结果上溢;

舍入后结果非精确;

舍入后结果下溢,而且下溢例外和非精确例外的enable位都不被设置,而FS比特被设置。

(3)浮点上溢、下溢例外

在舍入的幅度超过了目标格式的最大有限值时,输出结果会产生上溢异常,此时该输出结果由舍入方式决定。

最近偶舍入上溢的结果设置为∞;目标格式的幅度最大有限值被设置为零舍入上溢的结果;负无穷舍入正上溢则设置为目标格式的最大有限值,负上溢设置为负无穷;正无穷舍入设置负上溢为目标格式的最大有限值,设置正上溢为正无穷。

(4)除以零例外

当除数为零(包括“+0”和“-0”)而被除数是有限值时,发生该例外。

在浮点除法部件中具体如:

3.0/+0.0=+∞

3.0/-0.0=-∞

-3.0/-0.0=+∞

2.3基于功能覆盖率测试方法学的简单介绍

功能覆盖率简单地说是一个比例数据,指芯片中已验证过的功能占该芯片全部功能的百分比【8】。

只有当芯片中所有的功能都被验证为正确时才能保证流片的成功,验证工作的目标就是尽量使功能覆盖率达到100%。

想要提高验证工作的效率,就必须在尽可能短的时间内,尽可能多地提高功能覆盖率。

功能覆盖率似乎是一个较新的概念,但事实上,传统的验证过程也使用了功能覆盖率的概念。

为了验证一个设计,项目组长必须编写验证需求文档(或类似的文档),以确定需要验证的测试案例。

这份文档最后被归纳为一张表格,表格中的一栏填写的是所有测试案例的名称,另一栏是这些测试案例的完成情况。

验证工程师的任务就是要在投片(tape-out)之前把这些的测试案例一个个地完成。

实际上,这样一张表格就是一个功能覆盖率模型。

传统的验证过程由于缺少自动地统计当前功能覆盖率的机制,大大地限制了它的能力,只能说它使用了初级的功能覆盖率模型。

为了适应当前的芯片的规模和复杂度,我们需要一种新的针对功能覆盖率的验证过程,在这个新的验证过程中,对当前功能覆盖率进行自动统计的机制是必不可少的。

图2-3-1针对功能覆盖率的验证过程

在如图2-3-1这个新的验证过程中,与传统的验证过程不同的地方在于:

它实现了一个能够自动统计功能覆盖率的模型。

通过该模型,可以方便地得到当前的功能覆盖率,并根据它调整验证策略,以尽快地达到100%功能覆盖率【9】。

功能覆盖中最常见的是需求覆盖,其含义是通过设计一定的测试用例,要求每个需求点都被测试到。

其公式是需求覆盖=(被验证到的需求数量)/(总的需求数量)

功能覆盖率是通过仿真器统计功能覆盖点的覆盖情况得到的。

它要求验证工程师首先根据spec定义功能覆盖点,覆盖点的定义这里不在细说。

功能覆盖率验证过程。

首先说一下功能点。

从系统设计的角度来看,功能点就是设计的某一个具体功能。

在不同的抽象层次上,功能点的含义有较大的区别。

在较高的抽象层次上,功能点可以是系统的某一项功能;而在较低的抽象层次上,功能点可以仅仅是设计中的某个信号的改变(例如:

微处理器内部某个通用寄存器值的改变)。

从设计验证的角度来看,功能点就是我们为了证明设计的正确性,而构造的一个个能正确执行的测试用例。

因而功能点的含义包含两个方面:

一是测试用例,二是正确性。

图2-3-2功能点的含义

图2-3-2说明了功能点的含义。

我们把不同的测试用例定义为纵向功能线,正确性检查的条件定义为横向功能线。

功能点就是纵向功能线和横向功能线的交点。

如果我们能找到完备的测试用例,并且能证明设计执行每个测试用例都是正确的,我们就可以确认我们的设计是正确的。

当然这是功能验证的理想情况,设计验证要做的就是如何找出完备的测试用例和如何定义充要的正确性条件。

根据前面对功能点的说明,验证的过程可以分为两步:

一是构造能够体现设计功能的测试用例;二是定义设计的正确性条件。

定义好测试用例和正确性条件以后,我们就可以搭建验证平台(Testbench),对设计进行仿真了。

仿真的结果是不是达到了我们预期的目标了呢?

这就需要通过某种手段来分析。

功能覆盖率就是用来分析仿真结果的一种手段。

功能覆盖率包含两方面的内容:

一是测试用例的覆盖率,二是正确性条件的覆盖率。

在仿真完成后,感兴趣的测试条件是不是都被构造出来了?

定义的正确性条件是不是都得到满足?

这些都可以通过功能覆盖率体现出来。

功能覆盖率在这种策略中的作用就是指出哪些功能点已经覆盖到,哪些还没有覆盖到,从而对构造新的测试用例作出指导。

从分析覆盖率到生成新的测试用例,这个过程可以由人手工完成,也可以由验证环境自动完成:

前者节省机器的仿真时间,后者节省人的编码的时间。

 

第3章微处理器功能部件参考模型(C-modle)的测试

3.1微处理器refercencemodle---C-modle的简单介绍

C-modle是个referencemodle,即参照模型。

即用C语言(高级语言)写的一个微处理器的模型【10】,由于C语言是高级语言,具有以下特点:

1.简洁紧凑、灵活方便

2.运算符丰富

3.数据结构丰富

4.C是结构式语言

5.C语法限制不太严格、程序设计自由度大

6.C语言允许直接访问物理地址,可以直接对硬件进行操作

7.C语言程序生成代码质量高,程序执行效率高

8.C语言适用范围大,可移植性好

调试C-modle的目的就是保证其正确性,由于C-modle的正确性和可信度都远远高于RTL代码。

因此,用这个模型做RTL的比对模型,会减少RTL调试时的困难。

3.2C-modle功能部件的基本功能测试

C-modle功能部件的基本功能测试对象为MIPS指令集中的每条指令在C-modle中都是单独用一个函数实现的,然后将这些指令打包成一些有特定功能的模块,这些不同功能的模块就组合成了整个ALU部件,C-modle功能部件的基本功能测试的测试对象就是针对每条指令的这个函数来测试的。

C-modle功能部件的基本功能测试过程先从*.c文件中取出要测试指令模块,根据指令需求写C语言测试激励和输出语句。

然后用gcc编译工具在测试平台上采用相关命令将测试激励编译生成*.txt的可执行文件,输入测试激励,再运行此文件,进行相关测试。

最后,将得到测试指令模块的测试结果与预期的结果进行对比,来验证模块功能的完备性【11】。

C-modle功能部件的基本功能测试结果用位运算模块NOR指令为例具体分析。

图3-2-1提取测试指令模块

图3-2-2修改代码

图3-2-3测试结果

该测试过程可分为六步:

第一步,如图3-2-1所示,从*.c文件中取出要测试指令模块。

第二步,如图3-2-2所示,根据指令需求修改C语言代码,编写测试激励和输出语句。

第三步,用gcc编译工具在测试平台上采用相关命令将测试激励编译生成*.txt的可执行文件,输入测试激励,再运行此文件。

第四步,如图3-2-3所示,赋值分别为212990和2109128。

测试结果为-229376。

手算同或结果为-229376。

测试指令模块的测试结果与预期的结果相同,则该模块测试通过。

在C-modle功能部件的基本功能的测试期间,我对精简Mips指令集中13个模块中的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2