SV——SV与Verilog的不同

介绍SV语法中与Verilog不同的地方。

参考《Systemverilog验证——测试平台编写指南》

1. 过程语句

相比于Verilog,SV从C中继承了一些方便的语法。

  1. 在for循环中可以定义变量,它的作用范围仅限于for循环。

  2. initial 、always块中也可以定义变量。

  3. 可以用++、–自增运算符。

  4. 在begin、fork、module、function等标识符后放置符号,并在结束语句中也放置相同符号,便于首位匹配。

    1
    2
    3
    begin:test  //test就是标识符
    ......
    end:test
  5. 在循环中可以用continue和break。

2. 任务和函数

  1. 在SV中的fork—join_none线程中,函数可以调用任务,只有这时可以。

  2. void’ () 调用函数忽略它的返回值。 void’(fun);

  3. 在task、function定义中可以去掉begin—end

  4. 参数缺省的类型和方向是logic和input。缺省情况下,参数的类型、方向跟前一个参数一样。

  5. 可以传ref类型参数,引用,跟C++中一样概念,可以用const修饰。ref只能用在自动存储的子程序中,也就是有automatic修饰。

  6. 可以为参数指定默认值(缺省值)。

  7. 返回数组类型

    1
    2
    3
    4
    5
    6
    typedef int fixed_array[5] ; //5个int的数组类型,作为返回类型
    fixed_array f5;
    function fixed_array init(int data) ;
    foreach(init[i])
    init[i]++;
    endfunction

3. 局部数据存储 automatic

动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式,包括堆区、栈区。

静态存储方式是指在程序编译期间分配固定的存储空间的方式。

SV中模块、program中的子程序(任务、函数)里的局部变量(没有明确指出是静态的)采用静态存储区,在不同线程中会串用这些变量。如果要自动存储,必须要automatic关键字修饰。如果用automatic修饰了module或者子程序,那么其中的所有局部变量都是自动存储(动态存储)。

​ 多个线程调用同一个任务,定义了automatic之后,不同线程之间动态分配内存。

1
2
3
4
5
6
7
program automatic test;
task wait_mem(input [31:0] addr,expect_data);
while(bus.addr!==addr)
@(bus.addr);
......
endtask
endprogram

​ 如上面程序,如果没有automatic关键字,当任务等待事件而卡住的时候,如果这时又调用了这个任务,那么新的addr\data会覆盖之前调用的任务的参数。

4. 时间、精度

可以在每个模块中指明时间参数。

1
2
3
4
module test;
timeunit 1ns; // 时间单位1ns
timeprecision 1ps; //精度1ps
endmodule