sv语法 大纲

SV语法

  • 数据类型
    • 内建
      • 数据类型
        • 逻辑类型
          • 二值类型(0,1)
            • bit,byte,int,shortint,longint
          • 四值类型(0,1,X,Z)
            • logic,reg,integer,net-type(如:wire)
        • 符号类型
          • 无符号
            • bit,logic,reg,net-type
          • 有符号
            • byte,shortint,int,longint,integer
      • 数据转换
        • 静态转换
          • 在转换的表达式之前加单引号即可
        • 动态转换
          • 使用系统函数做转换($cast(tgt, src))
    • 数组
      • 固定数组
        • 声明和赋值
            1. 申明:int array[4]; 2. 赋值:array='
        • 合并和非合并
          • 1.合并 bit[2:0][7:0] array; 前面3表示个数,后面[7:0]表示位宽,以整体来存储,以整体来赋值 2.非合并 bit[7:0] array[3]; 后面3表示个数,前面[7:0]表示位宽,分开存储,按维度来赋值
      • 动态数组
          1. 在程序运行时确定数组大小 2.通过new[]来分配空间 3.通过size()返回大小 4.通过delete()清空
      • 数组方法
        • 赋值
            1. 申明:int array_0[4]; bit[31:0] array_1[4]; 2. 赋值:array_0='{0,1,2,3} array_0='{4{8}} array_0='{8, default:1} array_0[0]=5 array_1=array_0
        • 比较
          • 可使用==,!=,对两个数组进行逻辑比较操作
        • 循环
          • for和foreach
        • 缩减
          • 缩减返回的是运算值(在随机化中常用到) 求元素和:array.sum() 求元素与:array.and()
        • 约束
          • 约束返回的是布尔值 array.sum() with((item>7)?item:(item+1))
        • 定位
          • 定位返回是元素坐标队列(也适用于队列) int tq[$]; tq=array.max() tq=array.unique_index tq=array.find_index with(item>3)
        • 排序
          • 对非合并数组,进行排序 array.reverse() array.sort()
        • 迭代器
          • 对非合并数组进行元素的索引值迭代操作,返回的是元素值队列(目前语法只支持一维数组迭代) int array[]='{1,2,3,4,5,6}; int tq[$]; tq=array.find with(item.index>2 && item.index<5);
    • 联合数组
      • 定义
        • 1.类似于字典,以key,value形式存储,key和value可以是任何数据类型 2.例子:bit[31:0] ass[int]; 存储值是bit型,索引值是int型,存储形式:{int_0: bit[31:0], int_1: bit[31:0], int_2: bit[32:0]} 3.注意索引值可以是无序的
      • 遍历
        • 通过foreach对索引值遍历,foreach(ass[idx])
      • 方法
        • ass.num(),ass.delete(),ass.exists(),ass.first(),ass.next()
    • 队列
      • 定义
        • 1.相同元素的可变尺寸的有序集合 2.用[\(]表示,地址由0到\) 3.通过索引对元素进行操作 4.不需要new[],初始空间为0
      • 常用操作
        • 以下简单操作 1.int q_0[\(]={1,2,3} 2.d=q_0[0],q_1[\)] 3.q_1=q_0[1:$] 4.q_0={}
      • 自有方法
        • q.push_front(),q.pop_front() q.push_back(),q.pop_back()
    • 结构体
      • 1.自定义类型,typedef struct 2.若干个相关变量集合(如果元素比较少,那比类要方便些) 3.默认非合并,每个元素独立放置,不能对其约素
        • typedef struct{bit[7:0] r,g,b} pixel; pixel my_pixel; my_pixel='{8'h10,8'h20,8'h30} my_pixel.r=8'h10; my_pixel.g=8'h20; my_pixel.b=8'h30;
    • 枚举
      • 1.一系列相关变量集合 typedef emu 2.比宏定义常量来说,有更好的可读性,可维护性
        • typedef emu {RED,BLUE,GREEN} color; color color_e; color_e=color.first(); //此时的color为第一个变量
  • 操作符与表达式
    • 算数操作
        1. +, -, *, /, %,
    • 关系操作
        1. , <, >=, <=, ==, !=, =, !

    • 逻辑操作
        1. &&, ||, !
    • 按位操作
        1. ~, &, |, ^, ~^ 2. a=3'b001, b=3'b110; a|b=?
    • 归约操作
        1. &, ~&, |, ~|, ^, ~^, 2. a=3'b001; &a=?
    • 移位操作
        1. <<, >>, <<<, >>> 2. a=3'b111; a<<2; a=?
    • 连接操作
        1. {} 2. a={1'b1, {2{3{1'b1}}}}; a=?
    • 赋值操作
        1. =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= 2. a=3'b001, b=3'b110; a &= b; a=?
    • 流操作
        1. {>>{val}} 把val从左到右打成流 {<<{val}} 把val从右到左打成流
    • 集合表达式
        1. inside,return 0 or 1
    • 条件表达式
        1. ?: 2. val=(cond_0)? a:(cond_1)? b:c
    • 通配表达式
        1. 3'b1??;
  • 断言
  • 功能覆盖
  • 面向对象
  • 随机约束
    • 概述:理解随机的意义
    • 随机变量
      • rand/randc:申明变量是随机的(单一变量,数组,句柄)
    • 随机方法
      • randomize/pre_randomize/post_randomize:对随机变量里面的rand属性进行随机求解
      • $random():概率平均,返回32位有符号随机值 $urandom:概率平均,返回32位无符号随机值 $urandom_range(a, b):概率平均,在指定范围内返回一个随机值
    • 约束块
      • constraint name{ }:随机变量的值由约束块表达式来确定,约束块的名字必须是唯一的
    • 约束与分布
      • 数值约束
        • 关系操作符:<,<=,==,>=,>
      • 权重约束
        • 权重操作符: dist,其中:= 表示变量在取值范围内取的每一个值的权重是相同 :/ 表示权重要平分到范围内的每一个值
      • 集合约束
        • 集合操作符:inside,其中变量在集合中取值概率是相等,集合的边界可以是变量
      • 条件约束
        • 条件操作符: if{ } else
      • 双向约束
        • 在约束块中,所有的约束都是同时有效,求解要同时满足所有的约束条件
    • 约束的控制
      • 打开或者关闭
        • constraint_mode(0):关掉约束块,constraint_mode(1):打开约束块
      • 内嵌块约束
        • randomzie() with{ }:用于增加额外约束
    • 随机控制
  • 线程与同步
    • 线程
      • 概述:区别软件和硬件
      • 顺序线程
        • 用法: begin ... end
      • 并行线程
        • 用法: 1. fork ... join 2. fork ... join_any 3. fork ... join_none
      • 等待与终止线程
        • 用法:wait fork
        • 用法:disable fork_name
    • 同步
      • 概述:区别软件和硬件
      • 事件(event)
        • 边沿触发
        • 电平触发
      • 旗语(semaphore)
        • 用法:new(num)分配钥匙,put/try_put(num)放钥匙,get/try_get(num)拿钥匙
      • 邮箱(mailbox)
        • 用法:new(num)分配大小,put/try_put(tr)放数据,get/try_get(tr)拿数据
  • 过程语句与子程序
    • 过程语句
      • 循环
        • 1.forever statement: initial forever #2 clk=~clk;end
        • 2.repeat(expression) statement: repeat(3) @(posedge clk);
        • 3.while(expression) statement: while(1)begin … end
        • 4.for(for_initialization;expression;for_step) statement: for(int a=0;a<10; a++)begin … end;
        • 5.do statement while(expression): do(i++)while(i<10);
        • 6.foreach(array[idx])statement: foreach(array[idx]) begin ... end
      • 条件
        • 1.if...else...
        • 2.case(statement)... endcase
      • 跳转
        • 1.break:跳出整个循环
        • 2.continue:跳出这次循环
        • 3.return:主动退出函数或者任务
      • 结束
        • final结束语句
    • 子程序
      • 任务(task)
        • 任务介绍:允许消耗仿真时间,通过return提前结束掉,以output做端口输出值,调用函数和任务
      • 函数(function)
        • 函数介绍:不消耗仿真时间,不能调用task,允许通过return做函数输出,允许使用output做端口输出,允许用void做空函数
      • 传参
        • 索引
          • ref关键字,表示参数为索引而不是复制
        • 缺省
          • 给参数传入默认值
        • 绑定
          • 给参数传入绑定值
      • 变量周期
        • 动态变量(automatic):局部变量
        • 静态变量(static):全局变量
posted @ 2024-01-12 21:18  LeslieQ  阅读(45)  评论(0编辑  收藏  举报