SystemVerilog语法基础

    技术2025-07-11  9

    0.前言

    相较于verilog,system verilog在验证方面应用更广泛,当下最常用的uvm就是基于sv实现的。sv在verilog的基础上借鉴了一些高级语言的语法,它拥有以下功能: .设计+验证 .产生随机约束 .功能覆盖率统计分析 .断言(SVA) .面向对象的验证 这一篇学习笔记用于记录常用的变量类型、过程语句,以便于后续再深入补充。

    1.数据类型

    (1)两态数据类型:0、1; sv的数据类型在verilog的基础上,借鉴了C/C++的语法

    变量类型位宽符号位状态数备注reg自定义无4线网型,四态为:0,1,X,Zwire自定义无4寄存器型, 四态为:0,1,X,Zlogic自定义无4可以代替reg和wire型int32位有两态两态为:0,1shortint16位有两态longint64位有两态unsigned int32位无两态byte8位有两态bit1位有两态

    注:X为不确定态;Z为高阻态

    (2)枚举类型

    enum{red=2'b0,yellow,green}RGB; //表示00为red,01为yellow,10为grenn //当缺省时起点时,默认从0开始

    (3)用户自定义类型

    typedef unsigned int uint; uint a,b;

    (4)压缩数组

    (5)动态数组

    dyn[];//可以不声明数组大小 dyn=new[5];//使用new函数声明大小 dyn.delete();//使用完回收空间

    (6)关联数组 分布式存储,类似于哈希数组

    //前面表示内容的地址,后面表示索引。 //都要声明类型,索引也可以使用string,如assoc["小明"] bit[63:0] assoc[bit[63:0]]; //foreach遍历数组 foreach(assoc[i]) {$display("assoc[%h]=%h",i,assoc[i])} //函数索引遍历 if(assoc.first[idx])begin do{ $display("assoc[%h]=%h",i,assoc[i]) } while(assoc.next(idx)); end //操作:找到并删除第一个元素 assoc.first(idx); assoc.delete(idx);

    (7)队列

    q[$]={1,2,3,4};//初始化队列,中括号内加$ q.insert(1,j)={};//在第i个数据之后插入j q.delete(i);//删除数据i,不是第i个;缺省i则删除所有数据 q.push_front(i); q.push_back(i);//把数据i向前/向后压入 q.pop_front(); q.pop_back();//把最前/最后一个数据弹出 ¥size(q);//查询队列q的长度

    (8)面向对象 sv中借鉴C++的语法,tb基于类实现,是dut和验证平台的交互。 class->object 从类到某一对象,需要句柄(即地址) 一个类包含属性和方法,例如

    class Bus; bit [31:0] addr,crc,data[8];//属性 function calc_crc;//方法 crc=addr^data.xor; endfunction:calc_crc function:display;//方法 $display("Bus trans:%h",addr); endfunction:display endclass:Bus

    (9)信箱 类似于FIFO (10)旗语 对同一资源的访问控制,相当于仲裁机制

    semaphore sem; sem=new(1);//声明钥匙数量 sem.get(1);//获取钥匙 sem.put(1);//释放要是

    2.过程语句

    (1)赋值语句 阻塞/非阻塞赋值; 自加/自减赋值;

    (2)并行进程语句 fork…join:阻塞,等待全部进程执行完 fork…join_any:阻塞,等待最快的进程执行完 fork…join_none:不阻塞,与下一块同时执行

    (3)条件选择语句 if/case (4)循环语句 for/while/repeat/forever/do…while/foreach (5)跳转语句 break;continue;return(表达式/0)

    (6)事件控制 function:有返回值,不能使用#延迟,不可嵌套task task:无返回值,可以使用#延迟,内部可以嵌套function

    (7)随机产生机制

    .内置系统函数

    a=$random();//返回32位有符号 a=$urandom();//32位无符号 a=$urandom_range(0,10);//32位无符号,范围0-10

    .randcase/randsequence

    randcase 1:x=1; 2:x=5; 3:x=10; endcase //带权重,表示出现的概率分别为1/6,2/6,3/6

    .基于对象的随机生成

    class rand_num; rand int size; constraint c_size{ size inside{[1:100];} } endclass:rand_num rand_num randnum_inst; randnum_inst=new(); randnum_inst.randomoze();

    .标准随机函数

    std::randomize()

    (8)断言 SVA,system verilog assertion,是描述设计期望行为的代码 例如:

    assert property@(posedge clk) $rose sys_reset |-> (##[0:6]$rose ready);

    断言基础可以参考 https://blog.csdn.net/qq_39556143/article/details/94590198

    3.模块连接

    TB和DUT的连接:interface类型

    //声明一个interface interface bus_if(input bit clk); logic[1:0] a; endinterface //tb的输入参数是interface类型 module tb(bus_if busif); //通过“.”连接符寻找变量 busif.a<=2'b01; //top集成dut与tb module top; dut ins(.a(busif.a)); bus_if busif(clk); tb test(busif); endmodule
    Processed: 0.008, SQL: 9