一、SV 语法 简介

SystemVerilog(简称 SV)是硬件描述语言(HDL)Verilog 的扩展,旨在增强语言的表达能力,特别是在硬件设计与验证方面。它包括了许多新特性,既支持硬件描述,又提供了强大的功能来支持硬件验证。SystemVerilog 的语法和 Verilog 类似,但在许多方面提供了更为丰富的特性,比如面向对象编程、随机化、断言、接口等。

以下是 SystemVerilog 中常见的语法概览和关键特性:


1. 模块(Module)定义

在 SystemVerilog 中,模块的定义与 Verilog 类似。模块可以包含端口、内部信号和变量。

module my_module(
    input logic clk,       // 输入时钟
    input logic reset,     // 输入复位信号
    output logic out       // 输出信号
);
    // 模块内部逻辑
    always_ff @(posedge clk or negedge reset) begin
        if (!reset)
            out <= 0;
        else
            out <= ~out;
    end
endmodule

2. 接口(Interface)

接口是一种结构化的方式来组织信号,在模块之间传递时,可以减少端口的冗余。

interface bus_if;
    logic clk;
    logic rst;
    logic [7:0] data;
endinterface

module my_module(bus_if bus);
    always_ff @(posedge bus.clk or negedge bus.rst) begin
        if (!bus.rst)
            bus.data <= 8'b0;
        else
            bus.data <= bus.data + 1;
    end
endmodule

3. 数据类型

SystemVerilog 提供了许多扩展的数据类型,以下是一些常见的数据类型:

3.1 逻辑类型

  • logic:替代 regwire,支持单比特值,适用于组合和时序逻辑。
  • logic [7:0]:表示一个 8 位的信号。
  • bit:与 logic 相似,但只支持 0 或 1 的值。

3.2 整数类型

  • int:32 位有符号整数。
  • shortint:16 位有符号整数。
  • longint:64 位有符号整数。
  • byte:8 位有符号整数。
  • integer:默认的 32 位整数类型。

3.3 数组类型

  • 定长数组logic [7:0] arr[0:3]; 表示一个有 4 个元素的数组,每个元素为 8 位宽。
  • 动态数组logic [7:0] arr[]; 数组的大小在运行时动态改变。
  • 队列logic [7:0] queue[$]; 队列是动态的并可以增长或缩小。

3.4 结构体和联合体

  • 结构体:允许创建包含不同数据类型的复合数据类型。

    typedef struct {
        logic [7:0] byte_data;
        logic [15:0] short_data;
    } data_t;
    
  • 联合体:与结构体类似,但所有成员共享相同的内存空间。

    typedef union {
        logic [7:0] byte_data;
        logic [15:0] short_data;
    } data_u;
    

4. 程序块和流程控制

SystemVerilog 支持各种类型的程序块和流程控制,类似于 C 语言。

4.1 always

always @(posedge clk) begin
    out <= in;
end

4.2 always_ff (时序逻辑)

用于描述时序逻辑,类似于 always @(posedge clk),但具有更严格的检查。

always_ff @(posedge clk or negedge rst) begin
    if (!rst)
        out <= 0;
    else
        out <= in;
end

4.3 always_comb (组合逻辑)

用于描述组合逻辑。

always_comb begin
    out = a & b;
end

4.4 条件语句

if (condition) begin
    // do something
end else begin
    // do something else
end

4.5 case 语句

case (sel)
    2'b00: out = 0;
    2'b01: out = 1;
    default: out = 2;
endcase

5. 面向对象编程(OOP)

SystemVerilog 引入了面向对象的特性,包括类、继承、多态和封装。

5.1 类(Class)定义

class MyClass;
    // 类成员
    int value;

    // 构造函数
    function new(int val);
        value = val;
    endfunction

    // 成员函数
    function void display();
        $display("Value: %d", value);
    endfunction
endclass

5.2 继承

class DerivedClass extends MyClass;
    function new(int val);
        super.new(val); // 调用基类构造函数
    endfunction
endclass

5.3 虚拟任务

虚拟任务允许在基类中声明方法并在子类中实现它们。

class BaseClass;
    virtual task do_something();
        $display("Base Class: Doing something");
    endtask
endclass

class DerivedClass extends BaseClass;
    virtual task do_something();
        $display("Derived Class: Doing something different");
    endtask
endclass

6. 随机化和约束

SystemVerilog 提供强大的随机化功能,通常用于测试和验证。

6.1 随机变量和约束

class MyRandomClass;
    rand bit [3:0] value;
    constraint valid_value { value > 2; }
endclass

6.2 随机化方法

MyRandomClass obj = new;
if (!obj.randomize()) begin
    $display("Randomization failed");
end

7. 断言(Assertions)

断言是用于验证设计正确性的一个非常重要的工具,SystemVerilog 提供了丰富的断言特性。

7.1 简单断言

assert (a == b) else $fatal("Error: a is not equal to b");

7.2 假设和覆盖

假设用于验证设计在某些条件下的行为,而覆盖则用于记录设计的状态。

assume property (@(posedge clk) a |-> b); // 假设条件
cover property (@(posedge clk) a |-> b);  // 覆盖条件

8. 模块实例化

在 SystemVerilog 中,模块可以被实例化来创建具体的硬件描述。

module top;
    logic clk;
    logic rst;
    logic out;

    my_module u1 (
        .clk(clk),
        .rst(rst),
        .out(out)
    );
endmodule

总结

SystemVerilog 是 Verilog 的扩展语言,提供了更强的功能来支持硬件设计和验证。它包括了多种数据类型、面向对象的编程、随机化、断言、接口、虚拟任务等特性,非常适合复杂的设计与验证环境。希望以上的简要语法概览能帮助你理解 SystemVerilog 的基本结构和常见特性。

posted @ 2024-11-19 09:45  漫不经心的  阅读(15)  评论(0编辑  收藏  举报