跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言

System Verilog 教程:从基础到高级验证

综述由AI生成System Verilog 教程:从基础到高级验证 简介:System Verilog 是用于系统级验证、芯片设计与验证以及 FPGA 实现的强大硬件描述语言。它扩展了 Verilog 的基础特性,支持高级语言结构,如类、接口、任务和函数,优化了验证流程。教程内容涵盖 System Verilog 的基础概念、结构化编程元素、并发与同步机制、现代验证方法学、UVM 验证方法论以及标准库的应用。旨…

黑客帝国发布于 2026/4/6更新于 2026/5/2269K 浏览

System Verilog 教程:从基础到高级验证

简介:System Verilog 是用于系统级验证、芯片设计与验证以及 FPGA 实现的强大硬件描述语言。它扩展了 Verilog 的基础特性,支持高级语言结构,如类、接口、任务和函数,优化了验证流程。教程内容涵盖 System Verilog 的基础概念、结构化编程元素、并发与同步机制、现代验证方法学、UVM 验证方法论以及标准库的应用。旨在教授学生掌握 System Verilog 语法和高级特性,实现高效、可维护的验证代码。

1. System Verilog 概述及应用领域

1.1 System Verilog 的起源与发展

System Verilog 是作为硬件设计和验证领域的重要语言,由 Verilog 发展而来,随后被进一步扩展以满足现代电子设计自动化的需要。其发展始于 20 世纪 90 年代,目的是在原有 Verilog HDL 的基础上,提供更为强大的设计验证功能。

1.1.1 Verilog 与 VHDL 的区别

虽然 Verilog 和 VHDL 都是硬件描述语言(HDL),但它们在语法和使用方法上存在差异。Verilog 更接近于 C 语言,而 VHDL 的语法结构则更接近于 Pascal 或 Ada。Verilog 因其易于学习和使用的特性,在业界被广泛采用,特别是在美国和亚洲地区。

1.1.2 System Verilog 的创新特点

System Verilog 继承了 Verilog 的语法,并引入了许多面向对象的概念和结构。它包括新的数据类型、面向对象编程(OOP)特性和改进的验证方法,如断言、随机化、序列化、覆盖等。System Verilog 在硬件设计和验证领域为工程师提供了更大的灵活性和更强的表达能力。

System Verilog 的这些创新使得设计验证过程更加高效和规范,帮助工程师减少设计错误,缩短产品上市时间,为复杂硬件系统的验证提供了强有力的工具支持。随着集成电路复杂性的增加,System Verilog 成为了验证高端集成电路不可或缺的工具。

2. System Verilog 基础数据类型和结构

2.1 System Verilog 的数据类型

System Verilog 为硬件设计和验证提供了丰富且灵活的数据类型,与传统的硬件描述语言相比,其数据类型在表达能力和易用性上都有显著的提升。

2.1.1 基本数据类型

System Verilog 的基本数据类型是构建复杂数据类型和结构的基础,包括逻辑类型、整数类型、实数类型、时间类型、字符串类型等。

  • 逻辑类型 (logic):System Verilog 中引入了 logic 类型来替代传统的 wire 和 reg 类型,logic 类型可以用于更广泛的情况,例如组合逻辑和时序逻辑都可以使用 logic 类型。
  • 整数类型:包括整型 (int)、短整型 (shortint)、长整型 (longint) 等,支持有符号和无符号类型。
  • 实数类型:在硬件模拟中,通常使用 real 和 realtime 类型来表示浮点数。
  • 时间类型:time 和 realtime 类型用来记录时间跨度,非常适合于测试平台的时序控制。
  • 字符串类型:string 类型用于存储字符串,这是 System Verilog 新增的数据类型之一,方便了文本处理。

代码示例:

logic [7:0] byte_data; 
int number; 
real time_period; 
time simulation_time; 
string message; 

逻辑类型可以用来表示硬件的两种状态:0(假)和 1(真),以及'z(高阻)和'x(未知)。整数类型则使用二进制补码表示有符号数值。实数类型以 IEEE 754 标准的浮点数表示。时间类型以最小时间单位来度量时间间隔。字符串类型则用于文本数据的存储和处理。

2.1.2 复杂数据类型

System Verilog 除了提供基本数据类型,还引入了一些复杂的数据类型,如枚举类型 (enum)、数组、结构体 (struct) 等。

  • 枚举类型:enum 类型允许定义一组命名的常量,使得代码更加可读。
  • 数组:数组可以是一维或多维的,提供了一种方便的方式来表示和操作一组数据。
  • 结构体:struct 类型允许将不同类型的数据组合在一起,形成一个复合数据类型。

代码示例:

enum {RED, GREEN, BLUE} led_color; 
byte[7:0] ram[0:255]; // 256x8-bit RAM 
struct { 
  logic [3:0] red; 
  logic [3:0] green; 
  logic [3:0] blue; 
} pixel; 
2.2 System Verilog 的数据结构

数据结构是数据组织和存储的方式,它允许有效地访问和修改数据。System Verilog 提供了多种数据结构,以便于在硬件描述和验证中有效地处理数据。

2.2.1 数组和队列

数组 (array) 是相同数据类型的多个变量的集合,可以用来存储固定数量的数据元素。而队列 (queue) 是一种动态数组,可以改变大小以存储不定数量的数据元素。

  • 数组:可以是固定大小的一维或多维数组。
  • 队列:支持动态添加和删除元素。

代码示例:

int my_array[15]; // 固定大小的数组 
bit[7:0] my_queue[$]; // 动态大小的队列 

数组和队列在硬件设计中常用来存储和处理数据集合,比如存储一个向量或者一个流水线的数据。

2.2.2 结构体和联合体

结构体 (struct) 和联合体 (union) 是将不同类型的数据组合在一起的复合数据类型。

  • 结构体:允许数据项根据其用途逻辑上分组在一起。
  • 联合体:允许不同的数据成员共享相同的存储空间。

代码示例:

struct { 
  logic [7:0] address; 
  logic [31:0] data; 
  bit we; 
} busTransaction; 
union { 
  logic [31:0] data_word; 
  logic [7:0] data_bytes[4]; 
} data_storage; 

结构体常用于封装总线事务中的地址、数据和控制信号,而联合体则可以用来节省存储空间,如定义不同宽度的字节和字。

2.2.3 类和对象

类是面向对象编程的基础,System Verilog 通过类和对象扩展了硬件描述语言的功能,使得硬件模型可以更加模块化和可重用。

  • 类:包含数据成员和成员函数(方法)。
  • 对象:类的实例。

代码示例:

class myClass; 
  int myInt; 
  function void myMethod(input int value); 
    myInt = value; 
  endfunction 
endclass 
myClass myObject = new(); 
myObject.myMethod(10); 

类和对象在硬件设计和验证中支持更高级的抽象,如生成复杂的测试平台组件和设备驱动模型。

2.3 System Verilog 中的类和对象

System Verilog 类和对象为硬件设计和验证提供了面向对象的能力,这使得模拟设计的模块化和封装性得到提高。

2.3.1 类的定义和特性

类是 System Verilog 面向对象特性的核心,它定义了一组操作对象和使用数据的函数和变量。

  • 封装:类中的数据和函数可以封装在类的定义内。
  • 继承:类可以继承另一个类的特性,提高代码复用性。
  • 多态:类的实例可以有多种表现形式,具体取决于实例化对象的类型。

代码示例:

class baseClass; 
  virtual function void myFunc(); 
    $display("Base method"); 
  endfunction 
endclass 
class derivedClass extends baseClass; 
  virtual function void myFunc(); 
    $display("Derived method"); 
  endfunction 
endclass 
2.3.2 类的实例化和使用

类的实例化是指创建类的对象,使用这个对象进行数据操作和函数调用。

  • 实例化:通过 new 函数创建对象。
  • 方法调用:可以调用对象上定义的方法进行操作。
  • 属性访问:可以直接访问对象的属性。

代码示例:

derivedClass myObject = new(); 
myObject.myFunc(); // 调用的是 derivedClass 中定义的方法 

在 System Verilog 中,类和对象的使用极大地增强了设计的抽象能力,使设计师能够创建更加模块化和可维护的设计模型。

2.4 System Verilog 类的高级特性

System Verilog 不仅提供了面向对象编程的基础特性,还增加了一些高级特性以满足更复杂的硬件设计和验证需求。

2.4.1 重载与重写

System Verilog 允许函数重载和重写,这为设计和验证提供了极大的灵活性。

  • 函数重载:同名函数可以有不同的参数列表。
  • 函数重写:派生类可以重写基类中定义的虚函数。

代码示例:

class A; 
  virtual function void display(); 
    $display("Class A display"); 
  endfunction 
endclass 
class B extends A; 
  function void display(int param); // 重载 
    $display("Class B display with param %0d", param); 
  endfunction 
  function void display(); // 重写 
    $display("Class B display"); 
  endfunction 
endclass 
B myObject = new(); 
myObject.display(); // 调用的是重写的 display 方法 
myObject.display(5); // 调用的是重载的 display 方法,传入了一个参数 
2.4.2 模拟控制和随机化

System Verilog 的类提供了模拟控制方法,如随机化和约束,这些在硬件验证中非常重要。

  • 随机化:允许对象的属性在约束的条件下随机生成。
  • 约束:定义属性生成的约束规则。

代码示例:

class Transaction; 
  rand int data; 
  constraint c1 { data >= 0; data < 16; } 
  function void randomizeData(); 
    assert(randomize(data)); 
  endfunction 
endclass 
Transaction tr = new(); 
tr.randomizeData(); 

在本章节中,我们深入了解了 System Verilog 的基础数据类型和结构,包括基本数据类型和复杂数据类型,数组和队列,结构体和联合体,以及类和对象。这些类型和结构是设计和验证复杂硬件系统的基础。通过本章节的介绍,我们能够理解 System Verilog 是如何支持硬件开发的复杂性和高性能需求的。

3. 模块、接口、类的概念及其在硬件设计中的作用

3.1 System Verilog 的模块和接口

3.1.1 模块的基本概念和使用

在 System Verilog 中,模块是设计的基本构建块,用于实现硬件设计的特定部分。模块具有输入、输出和双向端口,允许它们与设计中的其他部分进行交互。模块可以包含数据流、行为描述、结构体、任务和函数等。

模块的定义以关键字 module 开始,后跟模块名和端口列表,使用 endmodule 结束。以下是一个简单的模块示例,展示了如何定义一个带有输入和输出端口的模块。

module adder( 
  input logic [3:0] a, b, // 4-bit input ports 
  output logic [4:0] sum // 5-bit output port 
); 
  // A simple behavioral description of an adder 
  always_comb begin 
    sum = a + b; 
  end 
endmodule 

在此示例中, adder 模块将两个 4 位输入 a 和 b 相加,产生一个 5 位的输出 sum。关键字 always_comb 指示编译器这是一个在任意输入变化时都会重新评估的组合逻辑块。

模块可以被实例化多次,以创建硬件中的多个副本。这使得模块的概念非常适用于创建可重用的硬件组件。

3.1.2 接口的定义和应用

接口在 System Verilog 中用于封装模块间通信所需的信号和协议。它们提供了一种方法,将相关的端口和任务封装在一个单一的单元中,从而简化了模块间的交互和连接。

接口定义以关键字 interface 开始,并包含信号声明、任务、函数和参数定义。与模块不同,接口在单独的文件中定义,并可以被多个模块实例共享。

interface bus_if(input logic clk); 
  logic [3:0] data; // 4-bit data bus 
  logic [3:0] addr; // 4-bit address bus 
  logic write; // Write enable signal 
  // Tasks for bus operations 
  task write_data(input logic [3:0] addr, input logic [3:0] wdata); 
    // Implement write operation 
  endtask 
  // ... other tasks and functions 
endinterface 

在此示例中, bus_if 接口封装了一个数据总线、地址总线、写使能信号以及一个用于写操作的任务。此接口可以被多个模块使用,从而简化了它们之间的通信。

接口的使用使得设计更加模块化和可维护,并且可以在仿真环境中方便地进行监视和驱动。

3.2 System Verilog 的面向对象特性

3.2.1 类的定义和特性

System Verilog 引入了面向对象编程(OOP)的概念,允许设计者以更加自然和结构化的方式表达设计。类是 OOP 中的一个核心概念,用于定义具有状态和行为的对象。

在 System Verilog 中定义类需要关键字 class,类中可以包含属性、方法(函数和任务)、构造函数、静态成员等。

class packet; 
  rand bit [3:0] addr; // Randomized address 
  rand bit [7:0] data; // Randomized data 
  int id; // Packet ID 
  // Constructor 
  function new(int _id = 0); 
    id = _id; 
  endfunction 
  // Method to print packet contents 
  function void print(); 
    $display("Packet ID: %d, Address: %0d, Data: %0h", id, addr, data); 
  endfunction 
endclass 

此例中定义了一个名为 packet 的类,具有三个属性: addr、data 和 id。其中 addr 和 data 被声明为 rand,表示它们可以在随机化时被自动赋予随机值。 new 方法是构造函数,用于创建类的实例。 print 方法用于打印包内容。

类为硬件设计提供了一种新的抽象层次,使得代码重用和维护变得更加容易。

3.2.2 继承与多态在 System Verilog 中的实现

继承是面向对象编程中的另一个核心概念,它允许新类从现有类继承状态和行为,从而扩展或修改其功能。继承在 System Verilog 中的实现提升了设计的灵活性和扩展性。

在 System Verilog 中,类可以通过 extends 关键字继承另一个类,被继承的类称为基类或父类,继承者称为派生类或子类。

class extended_packet extends packet; 
  rand bit [2:0] control; // Additional control signals 
  // Overriding the print method 
  function new(int _id = 0); 
    super.new(_id); 
    control = $urandom; // Randomize control signals 
  endfunction 
  virtual function void print(); 
    $display("Extended Packet ID: %d, Address: %0d, Data: %0h, Control: %0b", id, addr, data, control); 
  endfunction 
endclass 

在此示例中, extended_packet 类继承自 packet 类,并添加了新的 control 属性。 print 方法被重写以包含新的输出格式。继承允许 extended_packet 使用 packet 类的所有特性和方法。

多态是 OOP 中一个高级特性,它允许对象在运行时表现出不同的形态。在 System Verilog 中,可以通过虚方法实现多态,这使得可以在不知道具体对象类型的情况下调用方法,并且方法的具体实现取决于对象的实际类型。

多态的实现增强了 System Verilog 程序的灵活性和可扩展性,是现代硬件设计验证的重要组成部分。

4. 任务与函数的定义与区别

4.1 System Verilog 中的任务和函数

4.1.1 任务的定义和应用

在 System Verilog 中,任务(task)是一种可以执行一系列操作但不返回值的程序块。它类似于过程式编程中的函数,但不返回任何结果。任务用于封装重复执行的代码块,使得设计更加模块化和易于维护。定义一个任务需要使用关键字 task,结束时使用 endtask。

以下是定义一个简单的任务的示例代码:

task example_task; 
  // 定义一个名为 example_task 的任务 
  // 在这里编写任务代码 
  $display("This is a task example."); 
endtask : example_task // 结束任务定义 

任务可以接受输入、输出或输入输出参数,这使得它们在处理更复杂的行为时非常有用。通过传递参数,可以向任务传递数据,并在任务执行后从任务中获取数据。

task example_task_with_parameters(input int a, output int b); 
  b = a + 1; // 一个简单的算术操作作为示例 
endtask 

使用任务时,只需调用其名称并传入所需的参数。这可以是通过直接调用,或者如果任务定义在另一个模块或程序块中,需要使用作用域运算符 ::。

module main; 
  initial begin 
    int result; 
    example_task_with_parameters(5, result); // 调用任务并接收结果 
    $display("Result of the task: %0d", result); 
  end 
endmodule 
4.1.2 函数的定义和限制

函数(function)与任务类似,但有一个重要的区别:函数可以返回一个值,并且不能包含延时(如 # 或 ##)或等待语句(如 wait)。函数用于实现能够返回结果的算法和表达式。定义函数需要使用关键字 function,并指明返回类型,结束时使用 endfunction。

下面是一个简单的函数定义和调用的示例:

function int example_function(input int a); 
  example_function = a * a; // 返回参数的平方作为示例 
endfunction 

函数可以像操作数一样在表达式中使用,这提供了极大的灵活性和表达力。

module main; 
  initial begin 
    int square_of_4; 
    square_of_4 = example_function(4); // 使用函数结果 
    $display("Square of 4 is %0d", square_of_4); 
  end 
endmodule 

在定义函数时,必须指定返回类型,如果省略返回类型,默认是 void。函数的参数可以是 input、output 或 inout,但是 output 和 inout 参数不能包含位宽。

系统 Verilog 要求函数在过程块(如 initial、always 块)中不能直接调用,函数调用必须是值传递,不能传递引用。

4.2 任务与函数在硬件描述中的区别

4.2.1 执行上下文的区别

任务和函数在执行上下文中有着根本的区别。任务可以模拟硬件中的并行行为,因为它们可以包含时序控制语句,例如延时和等待语句。这意味着任务可以以非阻塞的方式执行,允许它们在执行过程中有时间控制的行为。

task example_task_with_delay; 
  #10 $display("Task with delay"); 
endtask 

与此相反,函数必须是完全同步的,意味着它们不能包含任何时序控制语句。函数的执行必须是阻塞的,一旦开始执行,它必须完成所有操作,直到结束。

4.2.2 调用机制和返回值的区别

在调用机制方面,任务可以通过简单的引用进行调用,而且任务可以包含多个输出参数。函数则通常在表达式中使用,或者被赋值给一个变量。因为函数返回值,所以它们不能有输出参数。

函数的返回值通过在函数定义中指定返回类型来设置。函数必须在每个可能的退出路径上返回一个值,包括在过程块的最后隐式地返回。

function int add(input int a, input int b); 
  add = a + b; // 返回参数之和 
endfunction 

在函数调用中,返回的值可以通过赋值操作来捕获:

initial begin 
  int sum; 
  sum = add(3, 4); // 调用函数并捕获返回值 
  $display("Sum is: %0d", sum); 
end 

在 System Verilog 中,任务和函数的区分提供了在硬件描述和验证环境中实现不同功能的能力。任务更加灵活,但功能实现可能会变得复杂。函数则提供了清晰、有返回值的代码实现,适合实现可重复使用的计算和逻辑功能。

5. 并发与同步执行语句的使用

并发和同步是硬件描述语言 (HDL) 和验证语言(如 System Verilog)中不可或缺的概念,它们允许设计者和验证工程师描述并处理复杂的同步事件和异步过程。在本章中,我们将深入探讨 System Verilog 中并发与同步执行语句的用法,并展示如何在硬件设计和验证中有效地应用这些特性。

5.1 并发执行语句的理解

5.1.1 并行进程的概念

System Verilog 提供了一种描述并行活动的方式,这些活动通常在测试平台或仿真中非常有用。并行进程是独立的代码块,它们同时执行,相互之间不直接依赖执行顺序。

在 System Verilog 中,通常使用 initial 或 always 块来描述并行进程。每个 initial 块只执行一次,而 always 块则根据敏感列表中列出的信号变化而无限重复执行。

initial begin // 执行一次的代码块 
end 
always @(posedge clk) begin // 在每个上升沿执行的代码块 
end 
5.1.2 fork/join 语句的用法

为了进一步管理并行进程,System Verilog 提供了 fork 和 join 语句。 fork 语句创建了一个并行区域,其中的语句或块可以同时执行。 join 语句则等待所有并行执行的进程完成。

fork // 并行执行的代码块 1 
begin // 操作... 
end // 并行执行的代码块 2 
begin // 操作... 
end join 

5.2 同步执行机制的掌握

为了精确控制并发执行的流程,System Verilog 提供了多种同步机制,包括事件控制、等待语句、信号量和互斥锁等。

5.2.1 事件控制和等待语句

事件是一种特殊的数据类型,当某个过程发生时,可以通知事件来'触发'其他过程。在 System Verilog 中,可以使用 @ 符号来等待一个事件发生。

event my_event; 
initial begin // 触发事件 -> my_event; 
end 
always @(my_event) begin // 事件发生时执行的操作 
end 

wait 语句也可以用来同步多个进程,它会阻塞当前进程直到指定条件成立。

5.2.2 信号量和互斥锁的使用

在并行环境中,确保资源的独占访问是至关重要的,这可以通过信号量和互斥锁来实现。

semaphore my_semaphore = new(1); // 创建一个拥有一个许可的信号量 
initial begin // 尝试获取许可 
  my_semaphore.get(1); // ... 执行需要独占访问的代码 ... 
  my_semaphore.put(1); // 释放许可 
end 
// 使用互斥锁来保护共享资源 
mutex my_mutex = new; // 创建互斥锁 
initial begin // 尝试锁定互斥锁 
  my_mutex.lock(); // ... 执行需要独占访问的代码 ... 
  my_mutex.unlock(); // 解锁互斥锁 
end 

本章介绍了 System Verilog 中并发和同步执行语句的基本概念和用法。通过理解并行进程的概念、 fork/join 语句、事件控制和等待语句以及信号量和互斥锁的使用,读者应该能够在设计硬件和测试平台时更好地控制并发执行的复杂行为。这些概念的熟练掌握对于创建高效、可预测和可靠的 System Verilog 仿真至关重要。

目录

  1. System Verilog 教程:从基础到高级验证
  2. 1. System Verilog 概述及应用领域
  3. 1.1 System Verilog 的起源与发展
  4. 1.1.1 Verilog 与 VHDL 的区别
  5. 1.1.2 System Verilog 的创新特点
  6. 2. System Verilog 基础数据类型和结构
  7. 2.1 System Verilog 的数据类型
  8. 2.1.1 基本数据类型
  9. 2.1.2 复杂数据类型
  10. 2.2 System Verilog 的数据结构
  11. 2.2.1 数组和队列
  12. 2.2.2 结构体和联合体
  13. 2.2.3 类和对象
  14. 2.3 System Verilog 中的类和对象
  15. 2.3.1 类的定义和特性
  16. 2.3.2 类的实例化和使用
  17. 2.4 System Verilog 类的高级特性
  18. 2.4.1 重载与重写
  19. 2.4.2 模拟控制和随机化
  20. 3. 模块、接口、类的概念及其在硬件设计中的作用
  21. 3.1 System Verilog 的模块和接口
  22. 3.1.1 模块的基本概念和使用
  23. 3.1.2 接口的定义和应用
  24. 3.2 System Verilog 的面向对象特性
  25. 3.2.1 类的定义和特性
  26. 3.2.2 继承与多态在 System Verilog 中的实现
  27. 4. 任务与函数的定义与区别
  28. 4.1 System Verilog 中的任务和函数
  29. 4.1.1 任务的定义和应用
  30. 4.1.2 函数的定义和限制
  31. 4.2 任务与函数在硬件描述中的区别
  32. 4.2.1 执行上下文的区别
  33. 4.2.2 调用机制和返回值的区别
  34. 5. 并发与同步执行语句的使用
  35. 5.1 并发执行语句的理解
  36. 5.1.1 并行进程的概念
  37. 5.1.2 fork/join 语句的用法
  38. 5.2 同步执行机制的掌握
  39. 5.2.1 事件控制和等待语句
  40. 5.2.2 信号量和互斥锁的使用
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Qwen3 与 Qwen Agent 智能体开发实战:接入 MCP 工具
  • MiniRAG:面向 1.5B 小模型的 RAG 框架,效果媲美 GPT4
  • 从 Obsidian App 迁移至 Obsidian.nvim 功能保留指南
  • Python 路径拼接实战:os.path.join() 函数用法详解
  • Java String 不可变性深度解析
  • K 个一组反转链表:迭代解法详解
  • 支持国内股票分析的 AI 智能开源项目精选
  • 基于 RTX 5090 云主机部署 Stable Diffusion WebUI 指南
  • Ollama Windows 安装与使用指南:本地运行 Llama 等模型
  • 秋叶绘世 Stable Diffusion 整合包技术解析与使用指南
  • VsCode 远程 Copilot 调用 Claude Agent 报“无效请求”:参数配置排查与修复
  • OpenClaw 多 Agent 架构对接飞书机器人实战指南
  • Spring 嵌入式内存数据库选型:H2、Derby 与 HSQL 对比
  • 魔搭社区:探索 LLM 大模型的应用与微调实践
  • 网络安全入门:成为安全研究员需掌握的十大基础技能
  • FastAPI:Python 高性能 Web 框架
  • TypeScript 前端高频面试题详解
  • Android 系统日志报告收集与查看指南
  • Vue 自定义指令核心原理与实战
  • 俄罗斯黑客群体的技术优势与产业背景分析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online