vcs编译
vcs -full64 -sverilog -debug_acc+all -timescale=1ns/1ps full_adder.v full_adder_tb.v -l com.log
解释:64位的软件需要添加 -full64
Systemverilog
一、2值逻辑(0|1) 数据类型 (不声明数值时默认位0)
1、比特矢量Bit vector
bit [msb:lsb] variable_name [=initial_value];//位宽:MSB最高位,LSB最低位
默认无符号数,有符号数需要加signed
2、
byte(8-bit 默认有符号数)
shortint(16-bit 默认有符号数)
int(32-bit 默认有符号数)
longint(64-bit 默认有符号数)
无符号需要加上unsigned
3、实型数据
real (等价于c语言的 double、64-bit、有符号数)
shortreal(等价于c语言的 float、32-bit、有符号数)
二、4值逻辑(0|1|x|z)(不声明数值时默认位x)
1、reg[msb:lsb] variable_name [=initial_value];
等同于verilog 无符号数、只能在(always,initial 语句块里面赋值)、在systeverilog可以有多个驱动
2、logic [msb:lsb] variable_name [=initial_value];
等同于verilog 无符号数、可以连续赋值(除了always,initial还可以在assign里面赋值),只能有一个驱动
3、wire
在systeverilog可以有多个驱动
4、integer variable_name [=initial_value]; //32-bit有符号整数
5、time variable_name [=initial_value]; //64-bit有符号数
三、字符串变量类型string
string variable_name [=initial_value];
未赋值时初始值位空字符 “”
四、枚举类型
数据类型默认是 int,初始化值为0,可以使用.name显示字符
typedef enum [data_type] {named constants} enumtype;
声明:
enum [data_type] {named constants} enum_var;
enumtype variable_name [=initial_value];
五、固定数组
type array_name[size] [=initial_value];
超过边界的写操作将被忽略
超过边界的读操作:2值返回0,4值返回 ‘x
支持多维数组
$dimensions(array_name) //函数返回数组的维数
$size(array_name,dimension)//函数返回给定维度的数组元素个数
六、数组
支持循环foreach、缩减、Reduction operators
array_name.sum();//求和
array_name.and();//数组数据相与
array_name.or();//数组数据相或
array_name.xor();//数组数据相逻辑异或
数组操作:
1)function array_type[$] array.find() with (expression) ;//查找所有满足的元素,返回匹配元素的队列,查询失败返回空队列
2)function int_or_index_type[$] array.find_index with (expression) ;//查找所有满足的元素,返回匹配元素对应索引的队列
3)function array_type[$] array.find()_first() [with (expression)] ;//返回第一个满足的数组元素,如果没有表达式返回第一个元素,返回的第一个匹配的元素放到array_type[0]
4)function int_or_index_type[$] array.find_first_index [with (expression)] ;//返回第一个满足的数组元素的索引,如果没有表达式返回第一个索引,返回的第一个匹配的元素放到int_or_index_type[0]
5)find_last(),find_last(),unique(),unique_index(),min(),max(),reverse(),sort(),rsort(),shuffle(),
1、动态数组
type array_name[] [=initial_value];
在仿真运行时,使用构造函数分配数组大小。越界读写时,仿真出错,只有一维。
例:
reg[7:0] ID[];
ID=new[100];//allocate meory
ID.delete();//de-allocate memory
2、队列
type array_name[$] [=initial_value];
在仿真运行时,分配或者释放数组的内存空间。
push_back(),push_front(),insert()
pop_back(),pop_front(),delete()
不能使用new[]函数创建内存空间
索引0指向队列最低索引,索引$指向队列最高索引
越界对队列进行读写会导致仿真错误
队列操作的效果类似于FIFO或堆栈(stack)
单一维度
3、联合数组
type array_name[index_type]; //索引使用特定类型,不一定时数字
type array_name[*]; //索引可以是任何类型
索引类型可以是数字、字符串、类
动态分配和释放内存空间
数组的移动搜索
first(),next(),prev(),last()
num()函数决定了数组元素的个数
exists()函数可以判断有效索引是否存在
越界读操作时,如果是2值逻辑返回0,4值逻辑返回 'x
只支持一维