SystemVerilog笔记
- 使用($isunknown)操作符,可以在表达式的任意位出现X或Z时返回1。
- $size函数返回数组的宽度
- 关联数组switch,以实现从字符串到数字的映射。
- 函数exists()来检查元素是否存在。
- 方法unique返回的是在数组中具有唯一值的队列,即排除掉重复的数值。
- with可以指示SystemVerilog如何进行搜索。在条件语句with中,item被称为重复参数,它代表了数组中一个单独的元素。
- struct只是数据的集合。要想在端口和程序中共享它,则必须创建一个新的类型。
- $cast动态转换函数:目的在于把其右边的值赋给左边的量,如果赋值成功, $cast()返回1,对越界的数值进行检查。
- 流操作符<< 和 >> 用在赋值表达式的右边,后面带表达式、结构或数组。流操作符用于把其后的数据打包成一个比特流。操作符>>把数据从左至右变成流,而>>则把数据从右至左变成流。
- 下标[256]等同于[0:255]而非[255:0]。
- ATM以信元为基本传输单位,信元由信头和信报组成。每个ATM信元包含53字节,其中5字节的头部信息,48字节的数据。百分之十的头部开销显得特别高,所以工程人员戏称这种开销为信元税(cell tax)。
- 枚举创建了一种强大的变量类型,它仅限于一些限定名称的集合。
- name()可以得到枚举变量值对应的字符串。
- next(N)返回以后第N个枚举常量。prev(N)返回以前第N个枚举变量。当到达枚举常量列表的头或尾时,函数next和prev会自动以环形方式绕回。
- 函数getc(N)返回位置N上的字节,toupper返回一个所有字符大写的字符串,tolower返回一个小写的字符串。任务putc(M,C)把字节C写到字符串的M位上,M必须介于0到len所给出的长度之间。函数substr(start,end)提取出从位置start到end之间的所有字符。
- foreach主要用于执行遍历功能的循环。
- $timeformat的语法如下:
$timeformat(units_number, precision_number,suffix_string, minimum_field_wdith); 其中: units_number 是 0 到-15之间的整数值,表示打印的时间值的单位:0 表示秒,-3 表示毫秒,-6 表示微秒,-9 表示纳秒, -12 表示皮秒, -15表示飞秒;中间值也可以使用:例如-10表示以100ps为单位。其默认值为`timescalse所设置的仿真时间单位。
precision_number 是在打印时间值时,小数点后保留的位数。其默认值为0。
suffix_string是在时间值后面打印的一个后缀字符串。其默认值为空字符串。
MinFieldWidth是时间值字符串与后缀字符串合起来的这部分字符串的最小长度,若这部分字符串不足这个长度,则在这部分字符串之前补空格。其默认值为20。 - 接口信号必须使用非阻塞赋值来驱动。
- @(posedge clk)定义了单时钟沿,而@(clk)定义了DDR时钟(双数据率)
- TPLH表示低电平到高电平的时间;TPHL表示高电平到低电平的时间
- 可以在program中使用initial块,但是不能使用always块。
- .*(隐式端口连接)能自动在当前级别自动连接模块实例的端口到具体信号,只要端口和信号的名字和数据类型相同。
- 实例名$root允许你从顶层作用域开始明确地引用系统中的成员名。
- 设计断言应该期望括号内的表达式为真,否则输出一个错误。断言是声明性的代码,它的执行过程和过程代码有很大差异。
- Clocking blocks在UVM的验证中使用非常重要,主要用于对输入的激励驱动和对输出的采样。
- malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址.
- new函数不能有返回值,因为构造函数总是返回一个指向类对象的句柄,其类型就是类本身。
- new()函数仅创建了一个对象,而new[]操作则建立一个含有多个元素的数组。new()可以使用参数设置对象的数值,而new[]只需使用一个数值来设置数组的大小。
- Systemverilog的句柄只能指向一种类型,即所谓的“安全类型”。
- this是当你使用一个变量名的时候,SystemVerilog将在当前作用域内寻找,接着在上一级作用域内寻找,直到找到该变量为止。
- dist操作符带有一个值的列表以及相应的权重,中间用:=或:/分开。:=操作符表示值的范围内的每一个值的权重是相同的;:/操作符表示权重重要均分到值范围内的每一个值。
- ->操作符可以产生和case操作符效果类似的语句块,它可以用于枚举类型的表达式。
- handle.constrain.constrain_mode()控制一个约束块,用handle.constraint_mode()控制对象的所有约束。
- 线程。fork…join_none块在调度其块内语句是时,父线程继续执行。fork…join_any块对块内语句进行调度,当第一个语句完成后,父线程才继续执行,其他停顿的线程也得继续,。
- triggered()函数,可用于查询某个事件是否已被触发,包括当前时刻。
- @操作符是边沿敏感的,所以它总是阻塞着,等待事件的变换。其他的线程可以通过->操作符来触发事件,接触对第一个线程的阻塞。
- 可以使用电平敏感的wait(e1.triggered())来代替边沿敏感的阻塞语句@e1。
- 使用旗语可以实现对同一资源的访问控制。使用new方法可以创建一个带单个或多个钥匙的旗语,使用get可以获得一个或多个钥匙,而put则可以返回一个或多个钥匙。如果你试图获取一个旗语而希望不被阻塞,可以使用try_get()函数。
- 从硬件角度出发,对信箱最简单的理解是把它看成一个具有源端和收端的FIFO。信箱是一种对象,必须调用new函数来进行实例化。使用put任务把数据放入信箱里,而使用get任务则可以移除数据。peek任务可以获取信箱里数据的拷贝而不移除它。
- 继承允许从一个现存的类得到一个新的类并共享其变量和子程序。
- 使用super前缀调用前一层类的成员。
- 如果你的基类构造函数有参数,那么扩展类必须有一个构造函数而且在其构造函数的第一行调用基类的构造函数。
- $cast子程序会检查句柄所指向的对象类型,而不仅仅检查句柄本身。
- 虚接口(virtual interface)是一个物理接口的句柄(handle),可以通过使用虚接口来做到这一点。