3.1 uvm_component与uvm_object
■ component与object是UVM中两大最基本概念;
3.1.1 uvm_component派生自uvm_object
■ uvm_void
uvm_object
uvm_component
◆ uvm_component拥有uvm_object的特性,同时又有自己的一些特质;uvm_component的一些特性,uvm_object则不一定具有;
■ uvm_component的两大特性(uvm_object没有):
- 通过new的时候指定parent参数来形成一种树形的组织结构;
- 有phase的自动执行特点;
■ 所有的UVM树的结点都是由uvm_component组成的,只有基于uvm_component派生的类才可能成为UVM树的结点;
3.1.2 常用的派生自uvm_object的类
■ 除了driver、monitor、agent、model、scoreboard、env、test等component类外,几乎所有的类本质上都是uvm_object,如sequence、sequence_item、transaction、config等;
■ uvm_object是一个分子,uvm_component是由其搭建成的一种高级生命,而sequence_item则是由其搭建成的血液,它流通在各个高级生命(uvm_component)之间,sequence则是众多sequence_item的组合,config则是由其搭建成的用于规范高级生命(uvm_component)行为方式的准则;
■ 验证平台中,派生自uvm_object的类:
◆ uvm_sequence_item:所有的transaction要从uvm_sequence_item派生,transaction就是封装了一定信息的一个类;uvm_sequence_item添加了很多实用的成员变量和函数/任务,从uvm_sequence_item直接派生,就可以使用这些新增加的成员变量和函数/任务;
◆ uvm_sequence:所有的sequence要从uvm_sequence派生一个,sequence就是sequence_item的组合;
◆ config:所有的config一般直接从uvm_object派生,config的主要功能就是规范验证平台的行为方式,如driver在读取总线是地址信号要持续几个时钟,片选信号从什么时候开始等;
◆ uvm_reg_item:它派生自uvm_sequence_item,用于register model中;
◆ uvm_phase:它派生自uvm_object,其主要作用为控制uvm_component的行为方式,使得uvm_component平滑地在各个不同的phase之间依次运转;
3.1.3 常用的派生自uvm_component的类
■ uvm_driver:所有的driver都派生自uvm_driver,driver的功能主要就是向sequencer索要sequence_item(transaction),并将sequence_item里的信息驱动到DUT的端口上,这相当于完成了从transaction级别到DUT能够接受的端口级别的转换;
■ uvm_monitor: 所有的monitor都要派生在uvm_monitor,driver向DUT的pin上发送数据,而monitor则是从DUT的pin上接收数据,并且把接收到的数据转换成transaction级别的sequence_item,再把转换后的数据发送给scoreboard,供其比较;
■ uvm_sequencer: 所有的sequencer都要派生自uvm_sequencer;
■ uvm_scoreboard: 一般的scoreboard都要派生自uvm_scoreboard,当自己定义scoreboard时,可以直接从uvm_component派生;
■ reference model:reference model都是派生自uvm_component,reference model的作用就是模仿DUT,完成与DUT相同的功能;DUT是用Verilog写成的时序电路,而reference model则可以直接使用SV高级语言的特性,同时还可以通过DPI等接口调用其它语言来完成与DUT相同的功能;
■ uvm_agent:所有的agent要派生自uvm_agent,agent的使用主要是从可重用性的角度来考虑的,uvm_agent的最大改动是引入了一个变量is_active;
■ uvm_env:所有的env要派生自uvm_env,env将验证平台上用到的固定不变的component都封装在一起,当要运行不同的测试用例时,只要在测试用例中实例化此env即可;
■ uvm_test:所有的测试用例都要派生字uvm_test或其派生类,任何一个派生出的测试用例中,都要实例化env,只有这样,当测试用例在运行的时候,才能把数据正常的发给DUT,并正常地接收DUT的数据;
3.1.4 与uvm_object相关的宏
■ uvm_object_utils:它用于把一个直接或间接派生自uvm_object的类注册到factory中;
■ uvm_object_para_utils:它用于把一个直接或间接派生自uvm_object的参数化的类注册到factory中;
eg: 参数化的类格式
class A #(int WIDTH = 32) extends uvm_object;
■ 参数化的类在代码可重用性中经常用到,尽可能使用参数化的类,它可以提高代码的可移植性;
■ uvm_object_utils_begin:当需要使用field_automation机制时,需要使用此宏;
//如果使用了此宏,又没有把任何字段使用uvm_field系列宏实现,也可以使用;
■ uvm_object_param_utils_begin: 与uvm_object_utils_begin宏一样,只适用与参数化,且其中某些成员变量要使用field_automatic机制实现的类;
■ uvm_object_utils_end: 它总是与uvm_object_*_begin成对出现,作为factory注册的结束标志;
3.1.5 与uvm_component相关的宏
■ uvm_component_utils:它用于把一个直接或间接派生自uvm_component的类注册到factory中;
■ uvm_component_param_utils:它用于把一个直接或间接派生自uvm_component的参数化的类注册到factory中;
■ uvm_component_utils_begin: 与uvm_object_utils_begin相似,它用于同时需要使用factory机制和field_automation机制注册的类;
◆ 在component中使用field_automatic机制,可以直接使用如object拥有的compare、print函数,也可以自动地使用config_db来得到某些变量的值;
■ uvm_component_param_utils_begin: 与uvm_component_utils_begin相似,只适用与参数化,且其中某些成员变量要使用field_automatic机制实现的类;
■ uvm_component_utils_end: 它总是与uvm_component_*_begin成对出现,作为factory注册的结束标志;
3.1.6 uvm_component的限制
■ uvm_object中有clone函数,它用于分配一块内存空间,并把另一个实例复制到这块新的内存空间中,此clone函数无法用于uvm_component中,因为一旦使用后,新clone出来的类,其parent参数无法指定;
eg:
class A extends uvm_object;
...
endclass
class my_env extends uvm_env;
virtual function void build_phase(uvm_phase phase);
A a1;
A a2;
a1 = new (“a1”);
a1.data = 8’h9;
$cast(a2 , a1.clone( ));
endfunction
endclass
■ clone = new + copy;
■ uvm_component可以使用copy函数,因为在调用copy之前,目标实例已经完成了实例化,其parent参数已经指定了;
■ 位于同一个父节点下的不同component,在实例化时不能使用相同的名字;
3.1.7 uvm_component与uvm_object的二元结构
■ uvm_component在整个仿真中是一直存在的,但发送一个transaction(激励)给DUT,此transaction(激励)可能只需要几毫秒就可以发送完,发送完,此transaction(激励)的生命周期几乎就结束了;
3.2 uvm的树形结构
3.2.1 uvm_component中的parent参数
■ uvm
常用命令和语法速查手册
命令格式:cd [目录名]
功能解释:切换工作目录
操作示例:^_^%> cd ../ work //返回上一工作目录
^_^%> cd ./env/sv/ //进入env/sv目录
-
-
- ls
-
命令格式:ls [选项] [目录名]
功能解释:列出目标目录中的所有子目录和文件信息
操作示例:^_^%> ls -a . //显示当前目录文件,包含隐藏文件
^_^%> ls -l . //显示当前目录文件,包含操作属性,等效于ll命令
-
-
- mkdir
-
命令格式:mkdir [选项] 目录名
功能解释:在指定位置创建一个目录
操作示例:^_^%> mkdir work //在当前目录下创建一个work目录
-
-
- cp
-
命令格式:cp [选项]... [-T] 源 目的
功能解释:复制文件或目录内容
操作示例:^_^%> cp log.txt log_bak.txt //将“log.txt”中的内容复制到文件
//“log_bak.txt”中
^_^%> cp –rf ./sv/* ./tmp/ //将当前sv目录下的所有内容复制到
//tmp目录中
命令格式:touch [选项] 文件
功能解释:创建一个不存在的文件或更改文件时间戳
操作示例:^_^%> touch test.sv //创建test.sv文件
-
-
- mv
-
命令格式:mv [选项] 源文件或目录 目标文件或目录
功能解释:移动文件或者将文件改名
操作示例:^_^%> mv data.txt data.log //将data.txt文件名改为data.log
^_^%> mv log.txt ../ //将log.txt文件移至上一级目录中
-
-
- pwd
-
命令格式:pwd [选项]
功能解释:查看”当前工作目录“的完整路径
操作示例:^_^%> pwd //显示当前目录的完整路径
^_^%> pwd -p //显示当前路径,而非使用link创建的路径
-
-
- rm
-
命令格式:rm [选项] 文件…
功能解释:删除一个目录中的一个或多个文件或目录
操作示例:^_^%> rm data.txt //删除data.txt文件
^_^%> rm –rf ./evn/sv/* //删除env/sv/目录下的所有内容
-
-
- rmdir
-
命令格式:rm [选项] 目录...
功能解释:从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限
操作示例:^_^%> rmdir ./sv //删除当前目录下的sv空目录
^_^%> rmdir –p ./env/sv/vir_seq //递归删除env/sv/vir_seq空目录,如果父目录//也为空,则一并删除
-
-
- cat
-
命令格式:cat [选项] [文件]...
功能解释:连接文件或标准输入并打印
操作示例:^_^%> cat log1.txt //显示文件log1.txt的内容
^_^%> cat –b log1.txt log2.txt >log.txt //将log1.txt和log2.txt中的内容加上行号//合并后存入log.txt中,其中空白行不加
-
-
- ln
-
命令格式:ln [选项] 源文件 目标文件
功能解释:为文件创建连接,连接分为硬连接和符号连接两种,默认的连接类型是硬连接,如果要创建符号连接,必须使用“-s”选项。
操作示例:^_^%> ln /duv/src.txt ../../env/data/src.txt //在env/data/下创建src.txt的符号/ /连接,连接到/duv/src.txt上
-
-
- chmod
-
命令格式:chmod [选项] 模式 文件
功能解释: 改变文件的读写权限。只能文件属主或特权用户才能使用该功能
。模式可以是数字形式或以who opcode permission形式表示。who是可选的,默认是a(所有用户)。只能选择一个opcode(操作码),可指定多中模式,以逗号分开,作为选择,我们多数用三位八进制数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。
操作示例:^_^%> chmod u+x script.sh //给属主用户增加可执行权限
^_^%> chmod 751 script.sh //给script.sh的属主分配读、写、执行(7)的权限,//给script.sh的所在组分配读、执行(5)的权限,给//其他户分配执行(1)的权限
命令格式:which [选项] filename
功能解释:查看可执行文件的位置
操作示例:^_^%> which passwd //查看可执行文件passwd的具体路径
命令格式:whereis [选项] filename
功能解释:查看文件的位置
操作示例:whereis passwd //查看所有passwd文件的具体路径
命令格式:locate [选项] filename
功能解释:配合数据库查看文件的位置
操作示例:locate passwd //在数据库中查看所有passwd文件的具体路径
命令格式:find 路径 [选项]
功能解释:从制定目录开始查找文件
操作示例:find ./ –name data.txt //从当前目录开始查找名为data.txt的文件
命令格式:grep [选项 ] 字符串 文件路径
功能解释:在一个或多个文件中查找某个指定的字符串,如果找到则显示文件中包含改字符串的每一行
操作示例:grep uvm_error ./work/result.log //从result.log中查找字符串uvm_error。
命令格式:df [选项]… [文件]…
功能解释:显示文件系统给的当前占用情况
操作示例:^_^%> df -h //查看文件系统占用情况
命令格式:du [选项]… [文件]…
功能解释:显示文件或目录占用的空间大小
操作示例:^_^%> du -sh //显示当前目录占用空间大小(单位K字节)
命令格式:more [选项] filename
功能解释:让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按Q键停止显示
操作示例:^_^%> more block.log //分页显示block.log文件内容
命令格式:less [选项] filename
功能解释:用法与more命令类似,也可以用来浏览超过一页的文件,所不同的是less命令除了可以按空格键向下显示文件外,还可以利用上下键来卷动文件
操作示例:^_^%> less block.log //分页显示block.log文件内容
-
-
- history
-
命令格式:history
功能解释:显示历史操作信息
操作示例:^_^%> history //显示历史操作命令
命令格式:echo [选项] 字符串
功能解释:将字符串内容送给标准输出
操作示例:^_^%> echo “this is a test” //在屏幕上打印this is a test字样
^_^%> echo $DUV_PATH / /显示宏定义$DUV_PATH的具体信息
命令格式:ps [选项]
功能解释:查看进程
操作示例:^_^%> ps //显示当前所有进程
^_^%> ps –ef | more //分页显示当前所有进程
命令格式:kill [选项] 进程号
功能解释:杀掉进程
操作示例:^_^%> kill 323 //杀掉进程号为323的进程
命令格式:top
功能解释:监视进程状态
操作示例:^_^%> top //显示当前所有进程信息
Sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据惊醒替换、删除、新增、选取等操作。
Sed命令行格式为: sed [-nefri] ‘command’输入文本
一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加
到备份文件中。
常用选项:
-n:使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会 被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或 者动作)才会被列出来;
-e:直接在指令列模式上进行 sed 的动作编辑。
-f:直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r:sed 的动作支援的是延伸型正规表示法的语法(预设是基础正规表示法语法);
-i:直接修改读取的档案内容,而不是由屏幕输出。
常用命令:
a:新增,a的后面可以接字串,而这些字串会在新的一行出现(当前的下一行);
c:取代,c的后面可以接字串,这些字串可以取代 n1,n2 之间的行;
d:删除,执行删除操作,d 后面通常不接任何字符串;
i:插入,i的后面可以接字串,而这些字串会在新的一行出现(当前的上一行);
p:列印,将某个选择的内容打印出来,通常 p 会与参数 sed -n 一起操作;
s:替代,执行替代操作,通常这个 s 的动作可与正则表达式一起操作。
操作示例:(假设我们有一名为my_pro.log的文件)
^_^%> sed ‘1d’ my_pro.log //删除第一行
^_^%> sed ‘$d’ my_pro.log //删除最后一行
^_^%> sed ‘1, 2d’ my_pro.log //删除第一行到第二行
^_^%> sed ‘3, $d’ my_pro.log //删除第三行到最后一行
^_^%> sed ‘/test/’d my_pro.log //删除全文中包含“test”的行
^_^%> sed ‘1p’ my_pro.log //显示第一行
^_^%> sed ‘$p’ my_pro.log //显示最后一行
^_^%> sed ‘1, 2p’ my_pro.log //显示第一行到第二行
^_^%> sed ‘3, $p’ my_pro.log //显示第三行到最后一行
^_^%> sed ‘1a mark’ my_pro.log //第一行后增加字符串“mark”
^_^%> sed ‘1, 3a mark’ my_pro.log //第一行至第三行后增加字符串“mark”
^_^%> sed ‘s/ok/not ok/g’ my_pro.log //将文件中的“ok”替换为“not ok”
^_^%> sed -n ‘s/ok/not ok/g’ my_pro.log //将文件中的“ok”替换为“not ok”,//并且打印出来
语法格式:tar [主选项+辅选项] 文件或者目录
使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。
- 主选项介绍:
c 创建新的文件,如果用户想备份一个目录或是一些文件,就要选择这个选项。
r 把要存档的文件追加到已创建文件的末尾。例如用户已经作好备份文件,又发现还有
一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加
到备份文件中。
t 列出文件的内容,查看已经备份了哪些文件。
u 更新文件,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,
则把它追加到备份文件的最后。
x 从已创建文件中释放文件。
- 辅助选项介绍:
b 该选项后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。
f 使用文件或设备,这个选项通常是必选的。
k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。
m 在还原文件时,把所有文件的修改时间设定为现在。
M 创建多卷的档案文件,以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件,加上该选项后可以将文件进行压缩,但还原时也一定要
使用该选项进行解压缩。
操作示例:
- 压缩
^_^%> tar -cvf my_pro.tar *.sv
这条命令是将所有以.sv为后缀的文件打成一个名为my_pro.tar的包。
^_^%> tar -czf my_pro.tar.gz *.sv
这条命令是将所有以.sv为后缀的文件打成一个名为my_pro.tar.gz的包。
^_^%> tar -cjf my_pro.tar.bz2 *.sv
这条命令是将所有以.sv为后缀的文件打成一个名为my_pro.tar.bz2的包。
- 解压缩
^_^%> tar -xvf my_pro.tar
这条命令是解出my_pro.tar包中所有文件。
^_^%> tar -xzf my_pro.tar.gz
这条命令是解出pro.tar.gz包中所有文件。
^_^%> tar -xjf my_pro.tar.bz2
这条命令是解出my_pro.tar.bz2包中所有文件。
我们有时要把在Windows操作系统下编辑的文本文件在Linux系统下使用或者再编辑,因为Linux和Windows文本文件的行结束标志不同。在Linux中,文本文件用"/n"表示回车换行,而Windows用"/r/n"表示回车换行。所以在Linux中使用Windows的文本文件常常会出现错误。为了避免这种错误,Linux提供了两种文本格式相互转化的命令:dos2unix和unix2dos,dos2unix把"/r/n"转化成"/n",unix2dos把"/n"转化成"/r/n"。
-
-
-
- Dos2unix ()
-
-
语法格式:dos2unix 源文件 目的文件
操作示例:^_^%> dos2unix a.txt b.txt //将Window下编辑的文件a.txt转换为Linux
//下的格式b.txt文件
-
-
-
- Unix2dos ()
-
-
操作示例:^_^%> dos2unix b.txt a.txt //将Linux下编辑的文件b.txt转换为Windows
//下的格式a.txt文件
- 连接ftp服务器
语法格式:ftp [hostname| ip-address]
操作示例:连接IP地址为10.7.73.2的ftp服务器,在命令行模式下输入:
^_^%> ftp 10.7.73.2
^_^%> 根据提示输入用户名密码
^_^%> ls //查看服务器上当前目录的内容
- 下载文件
语法格式:get [remote-file] [local-file]
操作示例:从服务器上取data.txt文件,在命令行模式下输入:
^_^%> get data.txt
^_^%> !ls //查看本地当前目录的内容,查看是否正常下载
- 上传文件
语法格式:put local-file [remote-file]
操作示例:上传report.txt文件到服务器,在命令将模式下输入:
^_^%> put report.txt
^_^%> ls //查看服务器上当前目录的内容,查看是否正常上传
- 断开连接
语法格式:bye
操作示例:断开与与ftp服务器的连接,在命令将模式下输入:
^_^%> bye(Enter) //断开连接。
命令格式:soffice [options] [documents]
常用选项:
--writer:启动文字处理器;
--calc:启动一个空的电子表格;
--web:启动一个空的HTML文档;
--helpwriter:获取writer帮助文件;
--helpcalc:获取电子表格帮助文件;
--writer --nologo:不显示屏幕的情况下启动LibreOffice;
--view:以只读模式打开文件;
--headless --convert-to pdf example.doc:将example.doc转换为pdf文件。
操作示例:
- 打开Word文件
^_^%> soffice 123.doc //打开123.doc文件
- 打开PDF文件
^_^%> soffice 123.pdf //打开123.pdf文件
- 打开Excel表格
^_^%> soffice 123.xlsx //打开123.xlsx文件
- 打开PPT演示文档
^_^%> soffice 123.pptx //打开123.pptx文件
- 打开HTML文件
^_^%> soffice 123.html //打开123.html文件
- 将文档转换为PDF格式
^_^%> soffice --headless --convert-to pdf 123.doc //打开123.doc转换为123.pdf
- 启动一个空的电子表格
^_^%> soffice --calc //启动一个空的电子表格
命令格式:/usr/lib64/firefox/firefox [options] [URL]
常用选项:
--new-table:在firefox的新标签页中加载指定URL;
--private-window:在新的隐私窗口中打开URL;
--new-window:在新的窗口中打开URL;
--browser:打开一个浏览器窗口;
--jsconsole:打开浏览器控制台;
操作示例:
- 打开firefox浏览器窗口
^_^%> firefox --browser //打开firefox浏览器窗口
- 在firefox的新标签页中加载指定URL
^_^%> firefox --new-table http://localhost/test/testapp
//在新建标签页中加载http://localhost/test/testapp
- 打开浏览器控制台
^_^%> firefox --jsconsole //打开浏览器控制台
命令格式:/pub/tools/others/anaconda3/bin/spyder [options] files
常用选项:
--new-instance:在spyder上运行一个新的实例;
--reset:删除所有配置文件;
--hide-console:隐藏父控制台窗口;
操作示例:
- 打开123.py文件
^_^%> /pub/tools/others/anaconda3/bin/spyder 123.py //打开123.py文件
- 删除所有配置文件
^_^%> /pub/tools/others/anaconda3/bin/spyder --reset //删除所有配置文件
操作符: i
用法示例: 打开文件后, 输入“i”,即可进入编辑模式。
操作符: h, j, k, l
用法示例: 打开文件后,点击“h键”可将光标向左移动;点击“j键”可将光标向上移动;点击“k键”可将光标向右移动;点击“n键”可将光标向下移动。
操作符: /
用法示例: 打开文件后,输入“/agent\[0\]”即可查找到含有“agent[0]”关键字的行。
操作符: :
用法示例: 打开文件后,输入“:”即可进入命令模式。
操作符: :w或:!w
用法示例: 打开文件,进入命令模式后,输入“W”或者“!w”即可保存当前编辑结果。
操作符: :xx
用法示例: 打开文件,进入命令模式后,输入“55”即可跳转到55行。
操作符: gg和GG
用法示例: 打开文件后,输入“gg”可跳转到文件头;输入“GG”可跳转到文件尾。
操作符: :xxd
用法示例: 打开文件,进入命令模式后,输入“55d”,可删除55行内容;输入“2,55d”可删除第2行到第55行的内容。
操作符: u, ctrl+r
用法示例: 打开文件,执行多次保存操作后,输入“u”可回退文件到前一次编辑时的状态,连续输入可回退多次;同时输入“ctrl+r”可从回退的状态往后一编辑状态转变。
操作符: :%s/XXX/xxx/g
用法示例: 打开文件,进入命令模式后,输入“%s/123/567/g”,可保存当前文件中所有“123”替换为“456”。
操作符: :sp或vp
用法示例: 打开文件,进入命令模式后,输入“sp”即将当前屏幕水平分屏;输入“vp”可将当前屏幕垂直分屏。
操作符: nyy, p, ndd
用法示例: 打开文件,输入“5yy”可复制当前光标开始的5行,移动光标后输入“p”可将刚才复制的内容粘贴在当前光标处;输入“3dd”,可删除当前光标处开始的3行内容。
操作符: zC,zO或zc,zo
用法示例: 打开文件, 输入“zO”可打开所有折叠点的折叠文件,输入“zc”可在所有折叠点折叠文件;光标移动到折叠点处,输入“zo”可展开当前折叠点;输入“zc”可在当前折叠点折叠文件。
数组是同类元素存储在一起的单元集合,有常规数组,动态数组和关联数组之分。
可如下定义数组:
int ai_data[3]= {1, 2, 3}; //定义有三个整型元素的数组
string as_name[] = {“LiLei”, “HaiMeimei”}; //定义有两个元素的数组
bit [7:0] ab[0:15]; //定义有16个元素的8bit数的数组, 等效于bit [7:0] ab[16];
-
-
- 数组常用函数及功能
- Find()
- 数组常用函数及功能
-
函数功能: 返回数组中满足给定条件的元素,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.array.find(x) with (x == 4); //qi = {4, 4};
qi = ai.array.find(x) with (x > 4); //qi = {};
-
-
-
- Find_index()
-
-
函数功能: 返回数组中给定条件的元素的索引值,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.array.find_index(x) with (x <= 2); //qi = {0, 1, 6, 7};
-
-
-
- Find_first()
-
-
函数功能: 返回数组中满足条件的第一个元素,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.array.find_first( ) with ( item <= 5); //qi = {1};
-
-
-
- Find_first_index()
-
-
函数功能: 返回数组中满足条件的第一个元素的索引值,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.array.find_first_index( ) with ( item > 3); //qi = {3}
-
-
-
- Find_last()
-
-
函数功能: 返回数组中满足条件的最后一个元素,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.array.find_last( ) with ( item >= 1); //qi = {1};
-
-
-
- Find_last_index()
-
-
函数功能: 返回数组中满足条件的最后一个元素的索引值,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.array.find_last_index( ) with ( item > 3); //qi = {4}
-
-
-
- Min()
-
-
函数功能: 返回数组中的最小元素,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.array.min( ); //qi = {1, 1};
-
-
-
- Max()
-
-
函数功能: 返回数组中的最大元素,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.array.max( ); //qi = {4, 4};
-
-
-
- Unique()
-
-
函数功能: 返回数组中的不重复元素,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.unique( ); //qi = {1, 2, 3, 4};
-
-
-
- Unique_index()
-
-
函数功能: 返回数组中的不重复元素的索引值,返回类型为队列。
用法示例: int ai_array[8] = {1, 2, 3, 4, 4, 3, 2, 1};
int qi[$];
qi = ai.unique( ); //qi = {0, 1, 2, 3};
-
-
-
- Reverse()
-
-
函数功能: 将数组中元素的逆序排列。
用法示例: int ai_array[5] = {2, 3, 1, 4, 8};
ai.array.reverse( ); //ai = {8, 4, 1, ,3, 2};
-
-
-
- Sort()
-
-
函数功能:将数组中元素的从小到大排列。
用法示例: int ai_array[5] = {2, 3, 1, 4, 8};
ai.array.sort( ); //ai = {1, 2, 3, 4, 8};
-
-
-
- Rsort()
-
-
函数功能:将数组中元素的从大到小排列。
用法示例: int ai_array[5] = {2, 3, 1, 4, 8};
ai.array.rsort( ); //ai = {8, 4, 3, 2, 2};
-
-
-
- Shuffle()
-
-
函数功能: 将数组中的元素随机化排列。
用法示例: int ai_array[5] = {2, 3, 1, 4, 8};
ai.array.shuffle ( ); //元素任意顺序摆放;
-
-
-
- Sum()
-
-
函数功能: 将数组元素的和返回。
用法示例: int ai_array[ ] = {1, 2, 3, 4};
int i_data;
i_data = ai_array.sum ( ); // i_data == 10 == 1+2+3+4;
-
-
-
- Product()
-
-
函数功能: 将数组元素的积返回。
用法示例: int ai_array[ ] = {1, 2, 3, 4};
int i_data;
i_data = ai_array.product ( ); // i_data == 24 == 1x2x3x4;
-
-
-
- And()
-
-
函数功能: 将数组元素相与后返回。
用法示例: bit [2:0] b_array[ ] = {1, 2, 3, 4};
bit [2:0] b_data;
b_data = b_array.and ( ); //b_data == 24 == 1&&2&&3&&4;
-
-
-
- Or()
-
-
函数功能: 将数组元素的积返回。
用法示例: bit [2:0] b_array[ ] = {1, 2, 3, 4};
bit [2:0] b_data;
b_data = b_array.or ( ); //b_data == 7 == 1||2||3||4;
-
-
-
- or()
-
-
函数功能: 将数组元素的积返回。
用法示例: bit [7:0] b_array[ ] = {1, 2, 3, 4};
bit [7:0] b_data;
b_data = b_array.xor( ) with {item+4}; //b_data == 12 == 5^6^7^8;
int a[100:1]; // 定义有100个整数元素的数组;
int b[]; // 定义一个动态数组;
int c[] = new[8]; // 定义一个有8个元素的素组;
b = a; // 将a赋值给b;
b = c; // 将c赋值给b;
b = new[c.size()](c); // 将c赋值给b;
c = a[8:1] // 将a中的前8个元素赋值给c;
队列是同类元素按顺序存储,长度可自适应变化的一个数据集合。类似于数组,可以使用位置索引来应用其中的元素,其中索引0指示队列的第一个元素,$指示队列的最后一个元素。
可如下定义队列:
int qi_data[$]= {1, 2, 3}; //定义有三个整型元素的队列
string qs_name[$] = {“LeiFen”}; //定义有一个元素的字符串队列
bit qb[$:15]; //定义一个元素个数最大为15的队列
-
-
- 队列常用函数及功能
- Size()
- 队列常用函数及功能
-
函数原型: function int size( )
函数功能: 返回队列中元素的个数。
用法示例: int qi_data[$] = {3, 6, 3};
int i_num;
i_num = qi_data.size( ); //i_num ==3;
-
-
-
- Insert()
-
-
函数原型: function void insert(input integer i_index, input element_type item)
函数功能: 在队列的i_index位置处插入item元素。
用法示例: int qi_data[$] = {3, 6, 9};
qi_data.insert(2, 7); // qi_data == {3, 6, 7, 9};
注意: 当i_index<0或i_index>$时,执行insert操作后队列无变化。
-
-
-
- Delete()
-
-
函数原型: function void delete(input integer i_index)
函数功能: 输出队列中位置i_index的元素。
用法示例: int qi_data[$] = {3, 6, 7, 9};
qi_data.delete(1); // qi_data == {3, 7, 9};
qi_data.delete( ); // qi_data = {};
注意: 当i_index<0或i_index>$时,执行delete操作后队列无变化;当函数的参数为空时,执行delete操作将删除队列的所有元素。
-
-
-
- Pop_front()
-
-
函数原型: function element_type pop_front( )
函数功能: 移除队列的第一个元素且返回此元素
用法示例: int qi_data[$] = {3, 6, 9};
int i_data;
i_data = qi_data.pop_front( ); //i_data == 3; qi_data == {6, 9};
-
-
-
- Pop_back()
-
-
函数原型: function element_type pop_back( )
函数功能: 移除队列的第一个元素且返回此元素。
用法示例: int qi_data[$] = {3, 6, 9};
int i_data;
i_data = qi_data.pop_back( ); //i_data == 9; qi_data == {3, 6};
-
-
-
- Push_front()
-
-
函数原型: function void delete(input element_type item)
函数功能: 将元素item压入队列头部。
用法示例: int qi_data[$] = {3, 6, 9};
qi_data.push_front (7); // qi_data == {7, 3, 6, 9};
-
-
-
- Push_back()
-
-
函数原型: function void delete(input integer i_index)
函数功能: 将元素item压入队列尾部。
用法示例: int qi_data[$] = {3, 6, 9};
qi_data.push_back (7); // qi_data == {3, 6, 9, 7};
首先,队列支持数组的常用操作;其次,队列还支持以下基本原则:
- 队列可以自适应的变化长短,不用担心它的最大边界限制,如:
int qi[$]; //定义一个整数队列
qi = {1, 2, 3}; //给队列赋值3个元素
qi = {4, 5, 6,7} //给队列重新赋值4个元素,元素自适应加一
- 队列的部分引用,索引值不用是常量表达式,如:
qi[5 : (a + b)]; //引用队列qi中5到(a+b)的元素,其中i_a+i_b为变量//表达式
- 空队列是有效的队列,可以是一些操作后的结果;
- qi[a:b]表示队列中含有b-a+1个元素;qi[n:n] ===qi[n];当a<0或b>$时,队列qi为空队列;
- 对列有它自己内建的一些方法,如(3.2.2)。
通过ssh客户端,用hwi域账号和密码器登录loginserver,设置客户端。
方法一:在lsf软件安装目录下设置,路径为:
source/pub/platform/lsf/conf/cshrc.lsf
方法二:将配置执行文件写在用户的.cshrc文件。
命令格式:bsub -o%J.out -IP -m xarhel70 “myjob”
功能解释:
-o filename:脚本或者命令的执行结果和出错信息写在filename文件
%J:bsub提交的Job_ID;
-o %J.out:把执行结果写在Job_ID.out文件
-IP:交互式作业;
-m:指定Job运行的服务器;
“myjob”:用户脚本;
常用命令:
-B:当作业被派遣并开始执行时发送一封电子邮件;
-b begin time:指定派遣作业的最早日期或时间;
-c cpu time:限制作业可以使用的总CPU时间;
-e file name:指定输出文件,作业提交后标准错误输出的信息会保存在这个文件中;
-J Job name:指定作业的名字;
-R “...”:资源需求串;
-q queue name:提交作业到指定队列;
-W runtime:限定作业的运行时间;
-w expression:提交作业前指定操作;
-R string:设置资源需求;
命令格式:bjobs
功能解释:显示用户的job状态
操作示例:^_^%> bjobs //显示用户的job状态
命令格式:bpeek JobID
功能解释:显示正在运行的Job的输出和出错信息
操作示例:^_^%> bpeek 123 //显示123的输出和出错信息
命令格式:bkill JobID
功能解释:终止正在运行或者等待队列中的任务
操作示例:^_^%> bkill 123 //终止任务123
命令格式:bstop JobID
功能解释:挂起没有运行结束的任务
操作示例:^_^%> bstop 123 //挂起任务123
命令格式:bresume JobID
功能解释:恢复运行挂起的任务
操作示例:^_^%> bresume 123 //恢复任务123
命令格式:lsload
功能解释:显示负载信息
操作示例:^_^%> lsload //显示负载信息
命令格式:lshosts
功能解释:显示host信息
操作示例:^_^%> lshosts //显示host信息
命令格式:bqueues
功能解释:显示队列信息
操作示例:^_^%> bqueues //显示队列信息
命令格式:svn info
功能解释:查看版本信息
操作示例:^_^%> svn info testcase0.sv //查看文件testcase0.sv版本信息
命令格式:svn co https://路径(目录或文件全路径) [本地目录全路径]
功能解释:下载目录文件
操作示例:^_^%> svn co https://localhost/test/testapp //下载目录testapp
命令格式:svn add 文件名
功能解释:添加新文件
操作示例:^_^%> svn add testcase0.sv //添加文件testcase0.sv
命令格式:svn ci ...-m ’xxx’
功能解释:上传新文件
操作示例:^_^%> svn ci testcase0.sv -m ‘commit testcase0.sv’ //上传文件testcase0.sv
命令格式:svn up 文件名
功能解释:更新文件目录文件
操作示例:^_^%> svn up testcase0.sv //更新文件testcase0.sv
命令格式:svn sw https://目录全路径 本地目录全路径
功能解释:切换svn路径
操作示例:^_^%> svn sw http://localhost/test //切换路径到http://localhost/test
命令格式:svn export [-r 版本号] https://目录全路径 [本地目录全路径]
功能解释:导出脱离svn的干净目录代码
操作示例:^_^%> svn export https://localhost/test/testapp //导出目录testapp