modelsim系统函数总结_第1页
modelsim系统函数总结_第2页
modelsim系统函数总结_第3页
modelsim系统函数总结_第4页
modelsim系统函数总结_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 / 37 modelsim 系统函数总结 Modelsim仿真小结 Modelsim的基本仿真流程大致分以下几个步骤:建库、编译工程、前后仿真、调试等。 Modelsim 仿真既 可以在 modelsim界面操作,也可以用 do文件实现, 这里结合学习的教程、网上看到的资料,和实际遇到的一些问题,分别做一整理小结。 1. 建库 建库包括 Altera 库和 Xilinx 库,同时都包括 Verilog 和VHDL。这里只建了 Verilog库, VHDL 和 Verilog步骤相同。 对于 Altera 库主要包括 lpm 元件库、 Mega_Function 库atera_mf、 altera 原语库 altera_primitive 和各器件系列模型库。前三种是调用 altera 模块的必备库,第四种是进行综合后功能仿真和布线后时序仿真需要的库,和器件系列有关,只选对应系列即可。 2 / 37 Altera 库创建和编译步骤如下: a) 在 Modelsim 安装目录下新建文件夹,命名 altera_lib,以存放编译后的库文件,可 以在 altera_lib 下新建 Verilog和 VHDL两个子文件夹,分别存放 Verilog 和 VHDL 库。 b) 打开 Modelsim,新建Library, file -new-library . c) 如 下 图 , 创 建 lpm 库 , 路 径E:modeltech_altera_libVeriloglpm d) 添加库文件,并 编译, compile - compile ,出现compile source files 窗口, library 指定到 lpm 下,查找范围,选 quartus 安装目录下 edasim_lib目录里的仿真原型文件: , 点 compile ,点done。 到此, lpm 库建立完毕。 e) 同理,建立 altera_mf库添加 altera_ ,建立 primitive3 / 37 库添加 altera_ 建立各系列的模型库,命名可用系列名加 _ver“xxx_ver” ,也可随意吧,添 加各系列的 xxx_。 这里,也可以把以上库放在一个文件夹,这样做简单,一次就搞定,分开也就是条理清楚,没人去看,所以没必要。 f) 修改文件,为的是让 modelsim能自动 map到已经编译的这些库上。 先去掉只读属性,在 Library和 vcom之间加上:库名 =库路径 绝对路径或者相对路径 ,相对路径是相对于 modelsim安装路径, modelsim 安装路径用 $MODEL_TECH 表示。 这里所有库都放在 E:modeltech_altera_lib 下,库名是altera_lib ,这里只添加一句: altera_lib = E:modeltech_altera_lib g) 保存退出,改回只读属性,防止乱改。至此 altera库建立完毕。 4 / 37 Xlinx库创建和编译步骤如下: 相比 altera, xilinx 建库很方便。 xilinx 有批处理命令,直接在 console 命令窗口,输入 compxlib 命令,调出编译库的窗口,先改掉 modelsim 安装目录下只读属性。设置如下图: Next,选择语言: Next,选择需要编译的器件: Netx - next,选择输出路径, launch compile process,等待编译完成。完成后改回只读属性。至此 xilinx 库建立完毕。 2. 编译工程 编译工程主要包括: code、 testbench、建立工程、建立工程库 、映射、编译等。 Code 主要有 code 思想和风格,在Verilog部分涉及。 Testbench,下边给出一个公用模板,基于这个方便修改,可以根据自己的习惯建一个 temp_。 5 / 37 Modelsim界面编译工程: a) 新建工程:打开 modelsim, file - new - project . ,指定工程名、路径、工程库。 b) Add existing file c) Add testbench file . d) 编译, compile complie all e) 编译语法查错,直到编译通过。至此编译完毕。 3. 功能和时序仿真 仿真是在编译的基础上,进行的功能调试,包括综合前功能仿真、综合后功能仿真和布 一、 Modelsim 简介 Modelsim仿真工具是 Model公司开发的。它支持 Verilog、VHDL以及他们的混合仿真,它可以将整个程序分步执行,使6 / 37 设计者直接看到他的程序下一步要执行的 语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在 Dataflow 窗口查看某一单元或模块的输入输出的连续变化等,比 Quartus 自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。 ModelSim 分几种不同的版本: SE、 PE 和 OEM,其中集成在 Actel、 Atmel、 Altera、 Xilinx 以及 Lattice 等 FPGA 厂商设计工具中的均是其 OEM 版本。比如为 Altera 提供的 OEM版本是 ModelSim-Altera,为 Xilinx提供的版本为 ModelSim XE. SE 版本为最高级版本 ,在功能和性能方面比 OEM 版本强很多 ,比如仿真速度方面 ,还支持 PC、 UNIX、 LIUNX混合平台。 为什么要学 Modelsim? 是专业的 HDL 语言仿真器 ,比 Quartus 自带的仿真器功能强大的多 . 2. Quartus simulator 不支持 Testbench ,只支持波形文件 .vwf vwf 文件全称是矢量波形文件 (Vector Waveform File),是7 / 37 Quartus II中仿真输入、计算、输出数据的载体。一般设计者建立波 形文件时,需要自行建立复位、时钟信号以及控制和输入数据、输出数据信号等。其中工作量最大的就是输入数据的波形录入。比如要仿真仅 1KB的串行输入数据量,则手工输入信号的波形要画 8000 个周期,不仅费时费力而且容易出错 怎样入门 ? 对于初学者, modelsim 自带的教程是一个很好的选择,在Help-SE PDF Documentation-Tutorial 里面 .它从简单到复杂、从低级到高级详细地 讲述了 modelsim 的各项功能的使用,简单易懂。 Modelsim的安装 同许多其他软件一样, Modelsim SE 同样需要合法的 License,通常我们用 Kengen 产生。 解压安装工具包开始安装,安装时选择 Full product 安装。当出现 Install Hardware Security Key Driver 时选择否。当出现 Add Modelsim To Path 选择是。出现 Modelsim License Wizard 时选择 Close。 8 / 37 在 C盘根目录新建一个文件夹 flexlm,用 Keygen 产生一个 ,然后复制到该文件夹下。 修改系统的环境变量。右键点击桌面我的电脑图标,属性 -高级 -环境变量 -新建。按下图所示内容填写, 变量值内如果已经有别的路径了,请用 “ ; ” 将其与要填的路径分开。 LM_LICENSE_FILE = c:flexlm 使用 Modelsim 进行仿真 Modelsim运行方式有 4种 : 用户图形界面模式 交互式命令行模式 不显示 modelsim 的可视化 界面 ,仅通过命令控制台输入的命令完成所有工作 1、 Tcl 和宏模式 编写可执行扩展名为 do或者 tcl语法文件 9 / 37 2、批处理模式 其所有操作都在后台进行,用户看不到 modelsim 的界面,也不需要交互式输入命令。当工程很大,文件比较多时,用批处理比较方便。直接运行批处理文件 ,在后台调用modelsim,执行 modelsim的脚本文件 * .do,完成操作 注 :/retype/zoom/ad28e6280066f5335a8121f2?pn=3&x=0&y=1268&raww=585&rawh=408&o=png_6_0_0_166_741_567_396_&type=pic&aimh=&md5sum=383f41cc7a00588c8313dedf7c6964a7&sign=d5e819eb8e&zoom=&png=552-22457&jpg=0-0 target=_blank点此查看 3.为工程添加文件 工程建立后 ,选择 Add Exsiting File 后,根据相应提示将文件加到该 Project中 这里是和其测试向量 count_,源代码如下 : (转载于 : 海 达 范 文网 :modelsim 系统函数总结 ) 4.编译文件 10 / 37 编译。编译可点击 Comlile?Comlile All 来完成。 5.装载文件 (1)双击 libray 中 work中的 count_tp 装载 (2)点击 simulate start simulation 按右图设置 ,点击 ok 6.开始仿真 点击 workspace 下的 sim,点击 count_tp,选择 add ? add to wave 然后点 run all,开始仿真 Modelsim 仿真方法总结 Modeling 仿真工具是 Model公司开发的。它支持 Verilog、VHDL 以及他们的混合仿真。 Modelsim 各版本的使用方法大11 / 37 体一致, Modelsim 仿真主要分为前仿真和后仿真。下面来具体介绍 modelsim 的仿真方法,涉及 quartus-modelsim 联合仿真的差异会特 别提示。 前仿真与后仿真说明 前仿真 前仿真也称为功能仿真、行为仿 真。旨在验证电路的功能是否符合设计要求,其特点是不考虑延迟,主要验证电路与理想情况是否一致。前仿真需要用到 RTL 级代码 (由源代码经过综合后产生)与 Testbench。 )后仿真 后仿 真也称为时序仿真或者布局布线仿真。是指在电路已经映射到特定的工艺环境以后,综合考虑门延迟与线延迟的影响,验证电路在一定的时序条件下是否存在时序违规以及能否满足设计构想的过程。需要用到的文件是 从布局布线结果中抽象出来的门级网表、 testbench 和后缀名为 sdo 或者 sdf的标准时延文件。 12 / 37 注:扩展名为 sdo 和 sdf的标准时延文件包含门延迟与实际布线延迟,能较好的反应芯片的实际工作情况。 二) modelsim 仿真主要有以下几个步骤: 建立库并映射库到物理目录; 编译源代码执行仿真; 解释: 库: modelsim 中有两类仿真库。一种是工作库,默认名为work;另一种是资源库。 Work 库中存放当前工程下所有已经编译过的文件,所以编译前一定要建立一个 work 库。资源库存放 work 库中已经编译文件所要调用的资源,这样的资源可能有很多,它们被存放在 不同的资源库内。 映射库用于将已经预编译好的文件所在目录映射为一个modelsim可识别的库。建立库 在执行一个仿真前先建立一个单独的文件夹,将操作对象文13 / 37 件放在该文件夹下面。然后启动 modelsim 软件将 modelsim当前路径改动到此文件下。修改方法是 File Change Directory。 注意:上面说的是独立运行 modelsim 仿真的情况。当采用quartus联合 modelsim仿真时,在 quartus里面设置第三方EDA仿真工具后,编译成功会自动在 quartus工程 目录下面创建一个 simulationmodelsim的文件夹,此文件夹等同于独立运行 moddelsim仿真时最先建立的文件夹。另quartus 联合 modelsim 仿真, modelsim 默认路径即为其自动创建文件夹 simulationmodelsim 下,不必人为更改。 启动 modelsim 后,建立仿真库。点击 filenewlibrary,出现对话框,选择 a new library and a logical mapping to it(已默认),在 library name 中输入要创建库的名称。 总 结 步 骤 为 : 启 动 modelsim 点击 filechang directory( 如需更改路径的话);再filenewlibrary,进行相关设置。即可。 14 / 37 )编写源代码及 testbench; 在编写目标测试文件 (testbench)之前,我们先写完目标文件,把它编译进工作库。源代码的编写就不用介绍了,下面介绍编写 testbench 的两种方法。 A) 可以在 modelsim 内直接编写测试文件,而且 modelsim提供各种 testbench 模板,我们只需更改其中小部分即可。在 modelsim中执行 File New Source Library或者直接点新建文件,会出现一个 verilog,点 Next。可以指定Testbench 的名称以及要编译到的库等,此处我们使用默认设置直接点 Finish。这时在 Testbench 内会出现对目标文件的各个端口的定义还有调用函数接下来,设计者可以自己往Testbench 内添加内容 了,我们只需更改其中的少量部分,即可完成 testbench,然后保存为 .v 格式即可。按照前面的方法把 Testbench 文件也编译到工作库中。 B) 在 Quartus 内编写并编译 Testbench ,之后将Testbench 和目标文件放在同一个文件夹下,按照前面的方法把 Testbench 文件和目标文件都编译到工作库中之后。 另如果在工作库中没有该文件 (在 Testbench 文件没有端口15 / 37 的情况下 ),则在 Simulate Start Simulate 卡片中去掉优化选项 Enable optimization 之后再重新编译,即可在工作库中找到该文件。 三)执行仿真 )前仿真 前仿真相对来说简单些,在执行到上面一步,把需要的文件编译到作库后,我们只需点 simulation start simulation或快捷按钮。会出现 startsimulation对话框,点击 Design标签选择 work库中的测试文件然后点 ok既可以。在主界面中会多出来一个 Objects 窗口,里面显示 Testbench 里定义的所信号引脚 ,在 Workspace里也会多出来一个 Sim标签。右键点测试文件,选择 Add-Add to Wave,然后将出现 Wave窗口,现在就可以仿真了。 )后仿真 后仿真与前仿真步骤大体相同,只不过中间需要添加仿真库网表和延 16 / 37 时文件的步骤。 后仿真的前提是 quartus 已经对要仿真的目标文件进行编译, 注意引脚的分派。并生成 modelsim 仿真所需要的 .vo文件 (网表文件 )和 .sdo 文件。具体操作过程又有两种方法,一种是通过 Quartus 调用 Modelsim, Quartus在编译之后自动把仿真需要的 .vo 文件以及需要的仿真库加到 modelsim 中,操作简单;一种是手动将需要的文件和库加入 modelsim 进行仿真,这种方法可以增加主观能动性,充分发挥 modelsim的强大仿真功能。 A) 通过 quartus 调用 modelsim; 使用这种方法时首先要对 Quartus 进行设置。 先运行Quartus,打开要仿真的工程,点菜单栏的 Assignments,点EDA Tool settings,选中左边 Category 中的 Simulation.,在右边的 Tool name 中选 ModelSim(Verilog),选中下面的Run Gate Level Simulation automatically after complication。 Quartus 中的工程准备好之后点击 start complication 按钮,此时 modelsim 会自动启动,而 quartus处于等待状态。17 / 37 而且 work 库中出现了需要仿真的文件。 Modelsim 自动将quartus生成的 .vo 文件编译到 work 库,并建立相应的资源库。 编写测试台程序,最好放在生成的 .vo 文件所在的目录,以方便在需要手动仿真时使用。点 Compile在出现的对话框中选中刚写好的测试文件,然后点 Compile 按钮 ,编译结束后点 Done,这时在 Work库中会出现测试台文件。 点击 simulate-Start Simulation 或快捷按钮 会出现start simulate 对话框。点击 Design标签选择 Work 库 下的测试文件,然后点击 Libraries 标签在 Search Library 中点击 Add 按钮,选择仿真所需要的资源库。 再点 start simulate 对话框的 SDF 标签。在出现的对话框的 SDF File框内加入 .sdo时延文件路径。在 Apply To Region框内有一个 “/” , 在 “/” 的前面输入测试台文件名,在它的后面输入测试台程序中调用被测试程序时给被测试程序起的名称。 (一般为 DUT) B) 手动仿真; 18 / 37 手动仿真需要自己添加文件和编译库,但可以充分发挥modelsim强大的仿真功能。操作时也要先对 quartus 进行设置,设置与前面相同只是不要选中 Run Gate Level Simulation automatically after complication。然后启动 modelsim , 将 当 前 路 径 改 到 工 程 文 件 夹simulationmodelsim下。向该文件夹中手动添加所需要的仿真文件,包括 .vo 文件、相关芯片资源库以及原理图情况下的 IP core 相关资源。然后在 modelsim 中点编译,将这些文件编译到工作库下,点击 simulate-Start Simulation或快捷按钮 会出现 start simulate 对话框。这里和 A 情况相比只有 Libraries 标签在 Search Library 时不一样,其余 2 项都一样。 Libraries 标签在 Search Library下选中 simulationmodelsim 下 work 库。后面观察波形与前面方法一致。 两种方法的区别在于, modelsim 仿真所需要的 .vo 文件以及 .sdo 文件,和资源库的建立方法不 同,手动仿真需要自己添加这些文件到工作库下。建议使用手动添加的方式,有利于我们对软件使用的更好理解。 以上方法可供参考, modelsim 软件自带的教程也是一个不错的学习路径,在 helpSE PDF DocumentationTutorial 里19 / 37 面有详细的功能讲解,使用时可以看看。 Verilog Modelsim 文件操作 使用 While循环,如不是最后一行,则一直读取,类似 c 语言的 while(!foef(fp_r) 。 转: 系统函数 fopen 用于打开一个文件,并还回一个整数指针然后, fdisplay 就可以使用这个文件指针在文件中写入信息,写完后,则可以使用 fclose系统关闭这个文件 例如: integer write_out_file;定义一个文件指针 integer write_out_file=$fopen(write_out_); $fdisplay(write_out_file,%hn h, addr, data); fclose(write_out_file); 20 / 37 以上语法是将 addr, data 分别显示在 %hn h中的个 h 的位置,并写入 write_out_file 文件指针所指向的write_out_中 从文件中读取数据,可以用 $readmemb $readmemh 从文件中读入数据 ,该文件格式是一定的 reg: data:; $readmemh; 就是将 file_name txt 中的数据读入到 data 数组中,然后就可以使用这些数 据了 还有一种方式可以把指定的数据放入指定的存储器地址单元内,就是在存放数据的文本文件内,给相应的数据规定其内存地址,形式如下: address_in_hexadecimal data 2f 20 21 / 37 两个系统任务可以在仿真的任何时刻被执行使用,其使用格式共有以下六种: 1) $readmemb(,); 2) $readmemb(,); 3) $readmemb(,); 4) $readmemh(,); 5) $readmemh(,); 6) $readmemh(,); 在这两个系统任务中,被读取的数据文件的内容只能包含:空白位置 (空格,换行,制表格 (tab)和 form-feeds),注释行 (/形式的和形式的都允许 ),二进制或十六进制的数字。数字中不能包含位宽说明和格式说明,对于 $readmemb 系统任务,每个数字必须是二进制数字,对于 $readmemh 系统任务,每个数字必须是十六进制数字。数字中不定值 x 或 X,22 / 37 高阻值 z 或 Z,和下划线 (_)的使用方法及代表的意义与一般Verilog HDL 程序中的用法及意义是一样的。另外数字必须用空白位置或注释行来分隔开。 在下面的讨论中,地址一词指对存贮器 (memory)建模的数组的寻址指针。当数据文件被读取时,每一个被读取的数字都被存放到地址连续的存贮器单元中去。存贮器单元的存放地址范围由系统任务声明语句中的起始地址和结束地址来说明,每个数据的存放地址在数据文件中进行说明。当地址出现在数据文件中,其格式为字符 “” 后跟上十六进制数。如: hh.h 对于这个十六进制的地址数中,允许大写和小写的数字。在字符 “” 和数字之间不允许存在空白位置。可以在数据文件里出现多个地址。当系统任务遇到一个地址说明时,系统任务将该地址后的数据存放到存贮器中相应的地址单元中去。 对于上面六种系统任务格式 ,需补充说明以下五点 : 23 / 37 1) 如果系统任务声明语句中和数据文件里都没有进行地址说明,则缺省的存放起始地址为该存贮器定义语句中的起始地址。数据文件里的数据被连续存放到该存贮器中,直到该存贮器单元存满为止或数据文件里的数据存完。 2) 如果系统任务中说明了存放的起始地址,没有说明存放的结束地址,则数据从起始地址开始存放,存放到该存贮器定义语句中的结束地址为止。 3) 如果在系统任务声明语句中,起始地址和结束地址都进行了说明,则数据文件里的数据按该起始地址开始存放到存贮器单元中,直到该结束地址,而不考虑该存贮器的定义语句中的起始地址和结束地址。 4) 如果地址信息在系统任务和数据文件里都进行了说明,那么数据文件里的地址必须在系统任务中地址参数声明的范围之内。否则将提示错误信息,并且装载数据到存贮器中的操作被中断。 5) 如果数据文件里的数据个数和系统任务中起始地址及结束地址暗示的数据个数不同的话,也要提示错误信息。 24 / 37 下面举例说明: 先定义一个有 256 个地址的字节存贮器 mem: reg7:0 mem1:256; 下面给出的系统任务以各自不同的方式装载数据到存贮器mem中。 initial $readmemh(,mem); initial $readmemh(,mem,16); initial $readmemh(,mem,128,1); 第一条语句在仿真时刻为 0时,将装载数据到以地址是 1 的存贮器单元为起始存放单元的存贮器中去。第二条语句将装载数据到以单元地址是 16 的存贮器单元为起始存放单元的存贮器中去,一直到地址是 256的单元为止。第三条语句将从地址是 128的单元开始装载数据,一直到地址为 1的单元。在第三种情况中,当装载完毕,系统要检查在数据文件里是25 / 37 否有 128 个数据,如果没有,系统将提示错误信息。 引用 参考 1.打开文件 integer file_id; file_id = fopen(file_path/file_name); 2.写入文件 /$fmonitor 只要有变化就一直记录 $fmonitor(file_id, %format_char, parameter); eg:$fmonitor(file_id, %m: %t in1=%d o1=%h, $time, in1, o1); /$fwrite 需要触发条件才记录 26 / 37 $fwrite(file_id, %format_char, parameter); /$fdisplay 需要触发条件才记录 $fdisplay(file_id, %format_char, parameter); $fstrobe(); 3.读取文件 integer file_id; file_id = $fread(file_path/file_name, r); 4.关闭文件 $fclose(fjile_id); 5.由文件设定存储器初值 $readmemh(file_name, memory_name); /初始化数据为十六进制 27 / 37 $readmemb(file_name, memory_name); /初始化数据为二进制 转: 提供了丰富的系统函数,这为 Testbench的 编写提供了方便。尤其是 IEEE1364-XX,其系统级建模的能力更强。 以前我一般常用到的系统函数只有几个: $readmemb,$readmemh, $display, $fmonitor, $fwrite, $fopen, $fclose等。通常需要对文件作预处理,才能用于 Testbench 读取。今天又尝试了几个其他的文件输入输出函数,不需要对文件进行预处理,直接使用需要的文件,只对需要的部分进行读取。 $fseek,文件定位,可以从任意点对文件进行操作; $fscanf,对文件一行进行读写。 下面是一些常见的应用: 28 / 37 1、读写文件 timescale 1 ns/1 ns module FileIO_tb; integer fp_r, fp_w, cnt; reg 7:0 reg1, reg2, reg3; initial begin fp_r = $fopen(data_, r); fp_w = $fopen(data_, w); while(!$feof(fp_r) begin cnt = $fscanf(fp_r, %d %d %d, reg1, reg2, reg3); $display(%d %d %d, reg1, reg2, reg3); 29 / 37 $fwrite(fp_w, %d %d %dn, reg3, reg2, reg1); end $fclose(fp_r); $fclose(fp_w); end endmodule 2、 integer file, char; reg eof; initial begin file = $fopenr(); 30 / 37 eof = 0; while (eof = 0) begin char = $fgetc(file); eof = $feof (file); $display (%s, char); end end 3、文件处理定位 define SEEK_SET 0 define SEEK_CUR 1 define SEEK_END 2 31 / 37 integer file, offset, position, r; r = $fseek(file, 0, SEEK_SET); r = $fseek(file, 0, SEEK_CUR); r = $fseek(file, 0, SEEK_END); r = $fseek(file, position, SEEK_SET); 4、 integer r, file, start, count; reg 15:0 mem0:10, r16; r = $fread(file, mem0, start, count); r = $fread(file, r16); 5、 32 / 37 integer file, position; position = $ftell(file); 6、 integer file, r, a, b; reg 80*8:1 string; file = $fopenw(); r = $sformat(string, Formatted %d %x, a, b); r = $sprintf(string, Formatted %d %x, a, b); r = $fprintf(file, Formatted %d %x, a, b); 7、 integer file, r; 33 / 37 file = $fopenw(); r = $fflush(file); 8、 / This is a pattern file - read_ / time bin dec hex 10: 001 1 1 : 010 20 020 : 111 5 FFF : 100 4 DEADBEEF : XXX 2 Z

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论