首页 > 其他分享 >SV 语法 简介

SV 语法 简介

时间:2024-11-19 09:40:51浏览次数:1  
标签:clk always 简介 SV 语法 logic data SystemVerilog out

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 的基本结构和常见特性。

标签:clk,always,简介,SV,语法,logic,data,SystemVerilog,out
From: https://www.cnblogs.com/now-lll7/p/18554253

相关文章

  • 信息收集---谷歌搜索语法
    想要做好信息收集,就一定要学会使用Google语法去搜索搜索引擎命令大全表格总结+同AND,搜索包含多个关键词的结果搜索+引擎,搜索包含【搜索】和【引擎】两个词的页面OR或者搜索OR引擎,搜索包含【搜索】或【引擎】两个词的页面- 减号,不包含减号后面词的页面,搜索引擎-......
  • Consul简介
    本文分享自天翼云开发者社区《Consul简介》,作者:滑****秋Consul是一款开源的服务网格解决方案,由HashiCorp公司开发。它提供服务发现、健康检查、KEY/VALUE存储、多数据中心方案等功能,可以帮助企业构建和管理现代应用架构。Consul的主要功能如下:1.服务发现:Consul维护了......
  • .NET 简介
    文章目录一、组件二、免费且开源三、支持四、.NET生态系统.NET是一个免费的跨平台开放源代码开发人员平台,用于生成多种类型的应用程序。.NET可以运行使用多种语言编写的程序,其中C#是最常用的语言。.NET依赖于许多大规模应用在生产中使用的高性能运行时。......
  • 网页中加载 SVG 的七大方式
    一、直接使用<img>标签加载外部SVG文件<imgsrc="path/to/image.svg"alt="描述文字"><!--若多个svg格式的img的宽高设定为百分百高度,容易会造成首屏加载svg的高度为0-->优点:简单易用:与加载其他图片格式(如PNG、JPEG)相同。浏览器支持良好:现代浏览器普遍支持。可缓存:SVG......
  • SV 接口 Interface
    在SystemVerilog(SV)中,接口(interface)是一种用于组织和传递多个信号的机制,它帮助减少模块间连接信号的冗余,并提高设计的可读性和可维护性。接口使得多个模块之间的信号传递更加模块化,减少了重复代码的编写。接口不仅仅是信号的集合,还可以包含函数、任务和约束。通过接口,多个模......
  • SV 接口 Interface 补充(约束方法)
    在SystemVerilog中,如果你希望限制接口的某些部分在特定条件下可用或不可用,可以利用约束(constraint)、任务(task)、函数(function)以及接口内的访问控制来实现。这种限制通常是基于设计需求或者验证需求,常见的应用场景包括:限制某些信号在某些情况下的访问,或者在特定条件下禁止或启......
  • SV 接口 Interface 补充(调用传参举例)
    在SystemVerilog(SV)中,接口可以作为模块的端口传递,也可以在任务和函数中传递作为参数。通过接口传递参数使得多个模块可以共享相同的信号集,减少冗余代码,提高设计的可重用性。以下是一些例子,展示了如何在模块和任务/函数中使用接口作为参数传递。1.接口作为模块的端口传......
  • 解读《华为鲲鹏920 TSV110微架构评测(上):初露锋芒,砥砺前行》
    前言近年来,纵使摩尔定律已死的论调甚嚣尘上,处理器性能还是迎来了一波爆发式增长;适逢DSA的黄金时代,巨头们对于自研微架构的热情空前高涨。众多因素加持下,处理器新秀们如雨后春笋般层出不穷。华为作为世界舞台的顶级玩家之一自然不会错过这场盛宴。在海思麒麟的光芒下鲲鹏系......
  • 什么是SMARC?模块电脑(核心板)规范标准简介三
    1. 概念SMARC(Smart Mobility ARChitecture,智能移动架构)是一种通用的小型计算机模块定义,基于ARM和X86技术的模块化计算机低功耗嵌入式架构平台,旨在满足低功耗、低成本和高性能的应用需求。这些模块通常使用与平板电脑和智能手机中相似的ARM SOC,或其他低功耗SOC和CPU。  图......
  • openEuler-22.03安装部署PrometheusV2.16.0
    环境下载安装包GIT下载地址:PrometheusV2.16.0下载使用GitHub文件加速-CSDN博客安装创建prometheus用户及组,并指定家目录[root@manager~]#groupaddprometheus[root@manager~]#useradd-gprometheusprometheus-d/opt/prometheus/将家目录做为prometheus的安装目......