systemverilog笔记
变量类型
变量名 | 状态数 | 是否带符号 | 比特数 |
---|---|---|---|
logic | 4 | 无 | 1 |
bit | 2 | 无 | 1 |
byte | 2 | 有 | 8 |
shortint | 2 | 有 | 16 |
int | 2 | 有 | 32 |
longint | 2 | 有 | 64 |
integer | 4 | 有 | 32 |
time | 4 | 无 | 64 |
$isunknown(表达式)
:在表达式任意位出现X或者Z时返回1。
数组
数组初始化
使用单引号加大括号
数组遍历
$size(数组)会返回数组长度,可以使用for(int i=0;i<$size(test);i++)
为了简写,可以直接使用foreach,foreach(test[j])
,其中j不需要定义。
对于二维数组,foreach(test[i,j])
同时遍历两个维度,foreach(test[i])
遍历第一个维度,foreach(test[,j])
遍历第二个维度。
合并数组与非合并数组
合并数组声明时,数组大小必须在变量名前声明,且数组大小定义格式为[MSB:LSB],而非[size]。
两者可以混合使用,例如bit[3:0][7:0] test [3];
合并数组连续存储,操作部分字节时非常方便。如果作为@后面的触发信号,则必须用合并数组。
例如上面的test,alway@(test)就会报错,得写成alway@(test[0] or test[1] or test[2])
动态数组
声明时[]中不加入内容,通过new分配空间。
例如int test[];
与test=new[5];
。
可以使用动态数组来声明常数数组,此时不需要冒数组长度数错的风险。
队列
数组与链表的结合,两者都支持。声明时使用$。
操作时可以通过方法或者下标指引的方式。
方法的方式
下标指引的方式
关联数组
有时只使用部分固定下标进行索引,此时使用关联数组可以缩小空间。声明时方括号中放入数据类型。
数组方法
数组可以进行求和等。例如bit test[10]
,可以通过test.sum
进行求和。相似的还有product(积),xor,and,or等。
可以通过test.max()
、test.min()
、test.unique()
求最大值,最小值,筛除重复值。
同时还可以通过find进行搜索。
同时还可以通过sum with结合实现一下功能,例如count = d.sum with(item==4)
,统计数组中4的个数。
d.reverse()反向,d.sort()正排序,d.rsort()逆排序,d.shuffle()随机打乱。
使用接口
interface test(input bit clk);
logic[1:0] a,b;
logic rst;
endinterface
//使用时如下
module test_m(test u_test)
always@(posedge test.clk or negedge test.rst)
...
modport
可以使用modport对信号分组并定义输入输出方向。
interface test(input bit clk);
logic[1:0] a,b;
logic rst;
modport A(input a,output b,input rst);
modport B(output a,input b,input rst);
endinterface
//使用时如下
module test_A(test.A u_test);
module test_B(test.B u_test);