一般来说,在数字IC验证中,编写testbench文件会采用verilog,但随着设计越来越复杂,为了更方便例化模块,面向对象编程的SystemVerilog(以下简称SV)越来越流行。
1.SV简介
2.SV语法
SV和Verilog的语法类似,基本SV可包含Verilog的所有规则,若有相异处下文会特意指出。
Verilog语法链接:https://blog.csdn.net/qq_39815222/article/details/89601331
- 数据类型
- 二值逻辑
包括 bit, byte, shortint, int, longint;这些类型的值只包含{0,1},目的是提高仿真性能,节约空间。若有四值逻辑数给其赋值,x,z会自动被赋值为0,因此二值逻辑数要远离DUT - logic
四值类型,类似于verilog里的reg
- 通配符 .*
可以把相同名字的net和port连在一起
test test1( .a(a), .b(b), .c(c) ); //或者 test test1( .a, .b, .c );
等同于
test test1( .* );
- clocking Block
为了避免冒险竞争,通常会把clk驱动的同步信号封装在一个模块里,由interface调用。 - interface
将多个信号集合,简化连接,方便调用,调用非常自由。
/***** 声明******/
interface signal_test( input bit clk );
logic [1:0] A, B;
logic reset;
clocking dram @( posedge clk)
input #1ps A;
input #5
output #6 B;
endclocking
modport user1( output A, input B, reset); //声明的端口可以在不同的modport里定义为不同的输入输出模式
modport user2( clocking cb, input reset); //调用clocking,port输入输出和user1不一样
endinterface
/***** 调用 ******/
always #5 clk = ~clk;
signal_test.user1 signal1(clk); //调用user1模式
signal_temp signal2( .A(signal1.A), ......); //interface互相直接连接
test test1( signal1 ); //interface与module连接
- 赋值
data0 = 'x //SV中赋值可无需添加b,o,h等代表进制的符号
data1 = '1 //SV中可给某个值赋值全1,注意Verilog中不行