sv语法 大纲
SV语法
- 数据类型
- 内建
- 数据类型
- 逻辑类型
- 二值类型(0,1)
- bit,byte,int,shortint,longint
- 四值类型(0,1,X,Z)
- logic,reg,integer,net-type(如:wire)
- 二值类型(0,1)
- 符号类型
- 无符号
- bit,logic,reg,net-type
- 有符号
- byte,shortint,int,longint,integer
- 无符号
- 逻辑类型
- 数据转换
- 静态转换
- 在转换的表达式之前加单引号即可
- 动态转换
- 使用系统函数做转换($cast(tgt, src))
- 静态转换
- 数据类型
- 数组
- 固定数组
- 声明和赋值
-
- 申明:int array[4]; 2. 赋值:array='
-
- 合并和非合并
- 1.合并 bit[2:0][7:0] array; 前面3表示个数,后面[7:0]表示位宽,以整体来存储,以整体来赋值 2.非合并 bit[7:0] array[3]; 后面3表示个数,前面[7:0]表示位宽,分开存储,按维度来赋值
- 声明和赋值
- 动态数组
-
- 在程序运行时确定数组大小 2.通过new[]来分配空间 3.通过size()返回大小 4.通过delete()清空
-
- 数组方法
- 赋值
-
- 申明: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 struct 2.若干个相关变量集合(如果元素比较少,那比类要方便些) 3.默认非合并,每个元素独立放置,不能对其约素
- 枚举
- 1.一系列相关变量集合 typedef emu 2.比宏定义常量来说,有更好的可读性,可维护性
- typedef emu {RED,BLUE,GREEN} color; color color_e; color_e=color.first(); //此时的color为第一个变量
- 1.一系列相关变量集合 typedef emu 2.比宏定义常量来说,有更好的可读性,可维护性
- 内建
- 操作符与表达式
- 算数操作
-
- +, -, *, /, %,
-
- 关系操作
-
-
, <, >=, <=, ==, !=, =, !
-
-
- 逻辑操作
-
- &&, ||, !
-
- 按位操作
-
- ~, &, |, ^, ~^ 2. a=3'b001, b=3'b110; a|b=?
-
- 归约操作
-
- &, ~&, |, ~|, ^, ~^, 2. a=3'b001; &a=?
-
- 移位操作
-
- <<, >>, <<<, >>> 2. a=3'b111; a<<2; a=?
-
- 连接操作
-
- {} 2. a={1'b1, {2{3{1'b1}}}}; a=?
-
- 赋值操作
-
- =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= 2. a=3'b001, b=3'b110; a &= b; a=?
-
- 流操作
-
- {>>{val}} 把val从左到右打成流 {<<{val}} 把val从右到左打成流
-
- 集合表达式
-
- inside,return 0 or 1
-
- 条件表达式
-
- ?: 2. val=(cond_0)? a:(cond_1)? b:c
-
- 通配表达式
-
- 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):全局变量
- 任务(task)
- 过程语句