转载请标明出处

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

  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. 手码两万余字,SpringMVC 包教包会

    1. SpringMVC 简介 1.1 Spring Web MVC是什么 Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架, ...

  2. python中 使用join()方法

    使用join()方法 对各种数据类型中元的素进行合并拼接 "连接符".join(列表或元组或字符串或字典) 返回的是一个使用连接符进行拼接的字符串 如果对象是列表,元组,就是以一个 ...

  3. 封装一个漂亮的ant design form标签组件

    在ant design 的form组件中 能用于提交的组件比较少,所以我在这写了一个可以单选.多选标签提交的组件,调用非常简单. 代码: import React,{Fragment} from 'r ...

  4. VMware安装ACS5.8

    1.所需组件: VMware ACS5.8 iso 2.安装要求: 2 Core Processor 4 GB RAM 60 GB Hard drive 这些要求算是比较低的要求,不能比这个更low了 ...

  5. static静态变量使用@Value注入方式

    @Componentpublic class MyConfig { private static String env; public static String getEnv() { return ...

  6. idea如何提取变量(拆分变量赋值和声明)

    需求描述: 我们时常遇到某个在某个局部作用域声明的变量,想要用在另一个地方,此时就需要在作用域外部声明变量,在作用域中给变量赋值. 在eclipse中这个功能和提取变量在一起,我们可以方便的拆分变量的 ...

  7. openjudge(POJ)-1664 放苹果

    对于n个盘子,m个苹果,我们要么在每个盘子上都放苹果,要么至少有一个盘子不放. 一个盘子不放就是f(m,n-1),全部都放的时候苹果就变成了n-m个,但是盘子的数目是不变的,因为此时还没有产生方案数, ...

  8. PyQt5操作SQLite数据库

    1.操作SQLite数据库import sysfrom PyQt5.QtSql import QSqlDatabase,QSqlQueryfrom PyQt5.QtCore import * def ...

  9. MAC系统 - 基础知识

    一.基础操作 设置:触控板设置 - >学习具体手势 手势:MacBook Pro手势大全必学手势触控板手势有哪些 左键,右键,滑屏,切换到应用... 一指操作: 一指敲击:鼠标左键: 一指按下: ...

  10. if条件语句!

    1.if 单分支语句 if [ 条件语句 ]  then 条件操作fi 例子: [root@localhost ~]# if [ 1 -eq 0 ]                    //如果1等 ...