SystemVerilog for design 笔记(二)
转载请标明出处
1. System Verilog文本值和数据类型
1.1. 增强的文本值赋值
相对于verilog,SV在文本值赋值时可以1.无需指定进制 2.赋值可以是逻辑1
用法:
reg [63:0] data;
data = '0 //fills all bits on the left-hand side with 0 按位赋值
data = '1; // fills all bits on the left-hand side with 1
data = 'x(z); // fills all bits on the left-hand side with x (z)
1.2. `define增强
SV中宏文本可以包含特殊字符。
- 进行宏文本字符串内的变量替换(通过在字符串的引号前加上重音号’来实现 )
`define print(v) \
$display(‘"variable v = %h’", v)
`print(data);
- 通过宏建立标识符名(通过两个连续的重音符’’作为不引入空格的间隔符)没懂
1.3. System Verilog变量
SV中的信号同时具有对象类型(reg,integer,wire)和数据类型(logic,bit.etc)。
- 四态变量:logic(类似verilog中的reg)0,1,x,z(缺省值x)
Logic是一种数据类型,而不是变量类型:wire logic [63:0] data; // a 64-bit wide net
- 两态变量:包括bit(1),byte(8),shortint(16),int(32),longint(64)括号内是位数(缺省值0)
在可综合RTL硬件模型中,常使用四态:
其中z用于表示未连接或三态逻辑;x有助于检测和隔离设计错误
而系统级和交易级常用两态
互相赋值:logic赋值给bit时,x/z→0
Integer和time: 具有预定义宽度的 四态数据类型的 变量 ;
int,byte,shortint,longint:具有预定义宽度的 两态数据类型的 变量 。
var : (variable)表示对象是一个变量 var logic [7:0] a; // 4-state 8-bit variable
可用不含数据类型的var声明变量,此时默认变量为logic类型
var [7:0] d; // 4-state 8-bit variable
所有的Verilog线网类型 (wire, uwire, wand, wor, tri, triand,trior, tri0, tri1, trireg, supply0 and supply1) 都隐含为四态逻辑数据类型。 There are no 2-state net types.
wire [31:0] busB; // 声明一个线网类型,隐含为四态逻辑数据类型
1.4. 数据类型规则的放宽
l 赋值任意变量方式(不可对一个变量同时使用过程赋值&持续赋值):
- initial / always过程块中赋值(过程赋值)
- always_comb / always_ff / always_latch过程块中赋值(过程赋值)
- 持续赋值assign xx=zzzzz;
- 单个模块或原语的output/input端口驱动赋值
单驱动逻辑使用变量,多驱动逻辑使用线网(net)
1.5. 有符号和无符号修饰符
Verilog: 缺省:无符号数 有符号定义关键词:signed
SV: 缺省有符号数:byte, shortint, int, and longint. 无符号定义关键词:unsigned
其中,signed和unsigned在类型关键字后使用:int unsigned u; // SV定义
1.6. 静态和自动变量
Verilog中自动task和function中的变量都是动态的。
SV中通过static和automatic声明变量是静态还是动态。
(appear within tasks, functions, begin...end blocks, or fork...join block)
(不能在module中显示声明,module中都是静态变量)
SV中存储方式默认静态。(例外:动态task/function中的变量默认动态)
1.6.1. 初始化:
l Verilog中只能在模块级声明的变量进行内嵌初始化(声明的同时初始化)
l SV中task/function中声明的变量可以内嵌初始化(发生在仿真开始前)
- 静态变量只初始化一次,第二次调用静态函数时,其中的静态变量的初始化操作直接被跳过
function int count_ones (input [31:0] data);
logic [31:0] count = 0; // initialized once.第二次调用count_ones时,count的值为上 次调用时的赋值
logic [31:0] temp = data; // initialized once.首次调用count_ones时,data的值为0. 第二次直接跳过
endfunction
- 自动变量在每次task和function调用时都会动态的创建,调用完毕后动态的释放存储区。
v 静态变量初始化不可综合;动态变量初始化可综合(不能传送到task/function/block外)。
v 用const声明的变量的内嵌初始值可综合
1.6.2. 使用原则:
l always和initial块中:无内嵌初始化使用静态变量;有内嵌初始化使用动态变量
l 若task/function是可重入的,则应设为自动的(除非需记录task/func被调用的次数)
l 非可重入的,用来描述硬件独立部分的task/function:静态
变量
1.7. 变量初始化的确定性
l Verilog中内嵌初始化顺序不确定
l SV中内嵌初始化先于仿真时刻0执行的事件,不引发仿真事件
Eg.
logic resetN = 0; // declare & initialize reset
always @(posedge clock, negedge resetN)
if (!resetN) count <= 0; // active low reset
else count <= count + 1;
如果是Verilog,有可能resetN未初始化时先执行always,这样在仿真0时刻,resetN初始化的时候会触发always块。
如果是SV,resetN在仿真开始前已完成内嵌初始化,因此仿真开始时,always只有在resetN的值发生跳变的时候才被触发。
v testbench应将变量初始化为无效状态
1.8. 强制类型转换
l 静态转换(编译时转换,不会检查结果的有效性)(可综合)
² 数据类型强制转换:<type>’(<expression>)
Eg. 7+ int’(2.0 * 3.0);//将6.0强制转换成int然后加7
² 向量宽度强制转换:<size>’(<expression>)
Eg. logic [15:0] a, b, y; y = a + b**16'(2); //将文本值2强转为16位宽
² 符号强制转换:<sign>’(<expression>)
Eg. shortint a, b;int y; y = y - signed'({a,b}); //将拼接结果强转为有符号数
l 动态转换(运行时进行待转换数值的检查)(不可综合)
$cast系统函数:$cast( dest_var, source_exp );强制转换source_exp的结果为dest_var的类型
用$cast转换失败时,源变量不变。$cast可返回状态标志,标识是否转换成功。
$cast的主要用途:将表达式的结果赋给enum类型变量。
1.9. 常数
l Verilog常数类型:
parameter,specparam,localparam,只能在module,static task/function中声明
l SV可通过const在任何地方将任何变量声明为常数
一个const常数实际上是一个只能被初始化的常量。
SystemVerilog for design 笔记(二)的更多相关文章
- Systemverilog for design 笔记(七)
转载请标明出处 第一章 接口(interface) 1.1. 接口的概念 接口允许许多信号合成一组由一个端口表示. 1.2. 接口声明 //接口定义 Interface main_bus ...
- Systemverilog for design 笔记(六)
转载请标明出处 第一章 有限状态机建模(FSM,finite state machine) 1.1. 使用枚举类型建立状态机模型 l 三过程块建模风格:三个过程块分别实现: a.状态转换(al ...
- Systemverilog for design 笔记(五)
转载请标明出处 第一章 System Verilog过程块.任务和函数 1.1. verilog通用目的always过程块(procedural block)(可综合) always过程块的综合 ...
- Systemverilog for design 笔记(四)
转载请标明出处 数组.结构体和联合体 1. 结构体(struct) 1.1. 结构体声明 结构体默认是变量,也可以声明为线网 var struct { // 通过var进行结构体变量声明 logic ...
- Systemverilog for design 笔记(三)
转载请标明出处 用户自定义和枚举数据类型 1. 用户自定义类型(typedef) 局部typedef定义:只用于设计的特定部分时,typedef的定义可在module或interface中 共享typ ...
- Systemverilog for design 笔记(一)
转载请标明出处 一. System Verilog 声明的位置 1. 包(packages) Verilog要求局部声明: variables, nets, tasks and f ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
随机推荐
- CentOS6.5_x64卸载系统原有MySQL
1.查看系统是否存在MySQL的版本 rpm -qa | grep mysql 2.删除老版本的开头文件和库(rpm -e --nodeps XXX) rpm -e --nodeps mysql-5. ...
- 使用docker踩过的坑
最近需要使用docker,但是win10电脑的系统不是docker windows适用版本,没法在windows上安装 于是就上centos虚拟机里面装了一个docker docker pull文件的 ...
- Java 判断五子棋五子相连
#开始 最近在忙着做一个基于酷Q的QQ机器人,想到了做游戏,第一个想到的霸气点的游戏就是五子棋啊 ` _>` 因为没有图形界面的原因 所有核心就是判断是否在棋盘上出现了五个棋子连在一起的情况 ...
- Tiny-shell
Tiny-shell:一个模仿bash的极简shell (一) 概述 通过构建一个简单的shell,能够对shell的工作原理进行一些了解.主要有: 重定向 流水线 前台信号处理 进程组 后台进程 作 ...
- PHP扩展安装之phpize
phpize命令是准备php扩展安装的编译环境的.用于手动编译安装php扩展. 一般使用pecl来安装php扩展. 如果pecl没法安装,比如在防火墙后面,或要安装的扩展在pecl还没有兼容包.则使用 ...
- js下false情况
//为false的情况 false null NaN undefined "" 0
- C语言:把分数最低的学生数据放入数组b所指的数组中,-从键盘输入若干字符串,写入文件myfile4中,用-1作字符输入结束的标志,
//学生记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组中,fun函数:把分数最低的学生数据放入数组b所指的数组中,分数最低的学生可能不止一个.人数返回. #include <st ...
- Strategic game POJ - 1463
题目链接 依旧是树形dp啦,一样的找根节点然后自下而上更新即可 设\(dp_{i,0}\)表示第i个不设,\(dp_{i,1}\)表示第i个设一个,容易得到其状态转移 \(dp_{i,0} = \su ...
- agc026F Lotus Leaves
题目链接 题目大意 一个n*m的网格上有一些点,一个点可以跳到与其同一行或同一列的点上.给定起点和终点. 求要使起点不能跳到终点,最少撤走几个点. \(n,m\leq 100\) 解题思路 考虑将能够 ...
- cglib用法
CGLib动态代理的介绍及用法(单回调.多回调.不处理.固定值.懒加载) 参照: https://blog.csdn.net/difffate/article/details/70552056 前面介 ...