转载请标明出处

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

其中,signedunsigned在类型关键字后使用:int unsigned u; // SV定义

1.6. 静态和自动变量

Verilog中自动task和function中的变量都是动态的。

SV中通过staticautomatic声明变量是静态还是动态。

(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. 使用原则:

alwaysinitial块中:无内嵌初始化使用静态变量;有内嵌初始化使用动态变量

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 笔记(二)的更多相关文章

  1. Systemverilog for design 笔记(七)

    转载请标明出处 第一章 接口(interface) 1.1.    接口的概念 接口允许许多信号合成一组由一个端口表示. 1.2.    接口声明 //接口定义 Interface main_bus ...

  2. Systemverilog for design 笔记(六)

    转载请标明出处 第一章 有限状态机建模(FSM,finite state machine) 1.1.    使用枚举类型建立状态机模型 l  三过程块建模风格:三个过程块分别实现: a.状态转换(al ...

  3. Systemverilog for design 笔记(五)

    转载请标明出处 第一章 System Verilog过程块.任务和函数 1.1.    verilog通用目的always过程块(procedural block)(可综合) always过程块的综合 ...

  4. Systemverilog for design 笔记(四)

    转载请标明出处 数组.结构体和联合体 1. 结构体(struct) 1.1. 结构体声明 结构体默认是变量,也可以声明为线网 var struct { // 通过var进行结构体变量声明 logic ...

  5. Systemverilog for design 笔记(三)

    转载请标明出处 用户自定义和枚举数据类型 1. 用户自定义类型(typedef) 局部typedef定义:只用于设计的特定部分时,typedef的定义可在module或interface中 共享typ ...

  6. Systemverilog for design 笔记(一)

    转载请标明出处 一.     System Verilog 声明的位置 1.       包(packages) Verilog要求局部声明: variables, nets, tasks and f ...

  7. Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer

    作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...

  8. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  9. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

随机推荐

  1. Re(正则表达式)库入门

    一.正则表达式的概念 正则表达式 "一行胜千言" regular expression regex RE 是用来简洁表达一组字符串的表达式. 'PN' 'PYN' 'PYTN' & ...

  2. 安装Anaconda3时出现conda不是内部或者外部命令

    在win10,64位,python版本为3.7的环境下安装anaconda3的时候,无法在命令行执行conda命令,一直提示conda不是内部或者外部命令,参考网上的修改环境变量,修改完后还是没有用, ...

  3. IDEA Tomcat配置 VM Option

    -server -XX:PermSize=512M -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8

  4. 基于SILVACO ATLAS的a-IGZO薄膜晶体管二维器件仿真(04)

    在eetop上有好多好东西啊: Silvaco_TCAD_中文教程1 不过这个教程里是Linux系统的,而且工艺仿真占了比较大的篇幅. defect region=1 nta=5e17 wta=0.1 ...

  5. flex布局构建大屏框架并支持翻页动画、滚动表格功能

      本文将利用flex属性构建大屏可视化界面.界面主要分标题栏.工具栏.数据可视化窗口.其中,翻页动画以及滚动表格功能分别分布在数据可视化界面两侧. 鼠标点击标题,可看到左侧窗口翻转动画: 整体布局效 ...

  6. 解决IDEA快捷键 Alt+Insert 失效的问题

    现象 IDEA快捷键 Alt+Inser 失效,单击右键也不出现[Generate]. 这个问题经常出现在重新安装IDEA后. 原因 缺少2个插件 解决办法 在setting中启用这2个插件即可.这2 ...

  7. Fluent_Python_Part4面向对象,11-iface-abc,协议(接口),抽象基类

    第四部分第11章,接口:从协议到抽象基类(重点讲抽象基类) 接口就是实现特定角色的方法集合. 严格来说,协议是非正式的接口(只由文档约束),正式接口会施加限制(抽象基类对接口一致性的强制). 在Pyt ...

  8. 4_3 救济金发放(UVa133)<子过程/函数设计>

    为了缩短领救济品的队伍,NNGLRP决定了以下策略:每天所有来申请救济品的人会被放在一个大圆圈,面朝里面.标明一个人为编号1号,其他的就从那个人开始逆时针开始编号直到N.一个官员一开始逆时针数,数k个 ...

  9. BeanUtils学习笔记

    一. 简介 BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行简化操作处理.一个JavaBean通常包含了大量的属性,很多情况下,对JavaB ...

  10. BGP前缀过滤(正则表达式)

    BGP的正则表达式一般用在as-path中,常用的如下: .(点):表示匹配任意一个字符,包括空格. *:表示匹配零个或多个模式的出现.即前一个字符出现0次或多次. +:表示匹配一个或多个模式的出现. ...