Systemverilog for design 笔记(三)
转载请标明出处
用户自定义和枚举数据类型
1. 用户自定义类型(typedef)
局部typedef定义:只用于设计的特定部分时,typedef的定义可在module或interface中
共享typedef定义:当在多个模型中使用时,typedef的定义可在包中进行, module,interface,program block可以通过导入包子项来使用typedef定义
Eg:
package chip_types;
`ifdef TWO_STATE
typedef bit dtype_t; //当宏定义TWO_STATE时定义dtype_t为bit类型
`else
typedef logic dtype_t;
`endif
Endpackage
import chip_types::dtype_t; // import 定义 into $unit
module counter
(output dtype_t [15:0] count,
Input dtype_t clock, resetN);
...
Endmodule
2. 枚举数据类型(enum)
想给数值一个label时,Verilog和SV会采取不同的方法:
Verilog:
用parameter/`define来定义一组常数或者宏名。
Eg:`define FETCH 3'h7 //宏定义
module controller (output reg read...);
parameter LOAD = 0; //常数定义
always @(State) begin
if (State == LOAD && instruction == `FETCH) //使用label
...
Endmodule
SV:
使用枚举enum
Eg: package chip_types;
typedef enum {FETCH, WRITE, ADD, SUB,MULT, DIV, SHIFT, NOP }instr_t;
//用户自定义枚举类型instr_t
Endpackage
import chip_types::*; //import包定义到$unit编译单元域
module controller (input instr_t instruction,...); //input instr_t类型instruction
enum {WAITE, LOAD, STORE} State, NextState; //枚举类型State, NextState,
//他俩的值只能是{}中的label
always_comb begin
if (State == LOAD && instruction == FETCH) //使用label
...
Endmodule
从包中导入enum时,只导入定义名时不会自动导入枚举值标签。所以一般用*导入整个包或者显示导入每个标签。
.2.1. 枚举类型标签序列
state |
创建单个标签state |
state[N] |
创建标签序列 state0,state1, ... stateN-1 |
state[N:M] |
创建标签序列,由stateN开始,到stateM(正反向不存在) |
2.2. 枚举类型标签作用域
enum列表中的label在其作用域内必须是唯一的(label唯一)
这里的作用域包括:$unit, modules, interfaces, programs,
begin...end blocks, fork...join blocks, tasks and functions
.2.3. 枚举类型值
枚举类型值在没有显示指定时,默认int从0自加。且label的值也要唯一(value唯一)
Eg: enum {A=1, B, C, X=24, Y, Z} list; //A=1,B=2,C=3,X=24,Y=25,Z=26
.2.4. 枚举类型的基类
枚举类型的默认基类(base type)是int,也可以对枚举类型的基类进行显示声明
Eg:
enum logic [1:0] {WAITE, LOAD, READY} state; //2位宽的枚举类型,四态基类
注意label数涉及到value的值,要与基类类型匹配。
.2.5. 自定义枚举类型
typedef enum {WAITE, LOAD, READY} states_t; //自定义枚举类型states_t
states_t state, next_state; //声明枚举state,next_state
同类型枚举变量可以互相赋值
2.6. 枚举类型的专用系统任务(system tasks)和方法(method)
方法(method):SV提供了一些能自动处理enum的内置函数
调用方式(类似C++):
<enum_variable_name>.first:返回指定变量枚举列表的第一个成员的值
<enum_variable_name>.last:返回指定变量枚举列表的最后一个成员的值
<enum_variable_name>.next(<N>):从枚举变量的当前位置算起,返回后面第N个 成员的值。如果枚举变量当前值不在枚举变量列表中,则返回列表中第一 个成员的value。<N>可缺省。缺省时返回枚举列表中下一个成员的值。
<enum_variable_name>.prev(<N>):从枚举变量的当前位置算起,返回前面第N个 成员的值。如果枚举变量当前值不在枚举变量列表中,则返回列表中最后 一个成员的value。<N>可缺省。缺省时返回枚举列表中前一个成员的值。
<enum_variable_name>.num:返回变量的枚举列表中元素个数
<enum_variable_name>.name:返回枚举变量中代表这个value的字符串
Systemverilog for design 笔记(三)的更多相关文章
- Systemverilog for design 笔记(六)
转载请标明出处 第一章 有限状态机建模(FSM,finite state machine) 1.1. 使用枚举类型建立状态机模型 l 三过程块建模风格:三个过程块分别实现: a.状态转换(al ...
- Systemverilog for design 笔记(七)
转载请标明出处 第一章 接口(interface) 1.1. 接口的概念 接口允许许多信号合成一组由一个端口表示. 1.2. 接口声明 //接口定义 Interface main_bus ...
- 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. System Verilog文本值和数据类型 1.1. 增强的文本值赋值 相对于verilog,SV在文本值赋值时可以1.无需指定进制 2.赋值可以是逻辑1 用法: reg ...
- Systemverilog for design 笔记(一)
转载请标明出处 一. System Verilog 声明的位置 1. 包(packages) Verilog要求局部声明: variables, nets, tasks and f ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- Mastering Web Application Development with AngularJS 读书笔记(三)
第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...
随机推荐
- 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程
通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...
- 安装docker并使用docker安装mysql
安装Docker 1. Docker 教程地址:https://www.runoob.com/docker/centos-docker.install.html 2.安装docker 命令:yum i ...
- Laravel 图片无法显示的问题
无法显示图片 先跳转到指定目录 mklink /d storage d:\www\dev.hanwen.com\storage\app
- django admin后台(数据库简单管理后台)
只需要简单的几行胆码就可以生成一个完整的管理后台 这个就是django魅力之一 创建超级用户 python manage.py createsuperuser ---- 之后会提示输入用慕名 ...
- Linux下查看当前文件大小的命令
1.ls -lht 列出每个文件的大小和当前目录所有文件大小总和 2.du -sh * 列出当前文件夹下的所有子文件的大小 看你需要啥样的,自己来吧
- 201771010135 杨蓉庆《面对对象程序设计(java)》第十八周学习总结
1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: ...
- acwing练习
220. 最大公约数 给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对. GCD(x,y)即求x,y的最大公约数. 输入格式 输入一个整数N 输出格式 输出 ...
- 安装pyhanlp
安装pyhanlp pyhanlp是java写的,外层封装了python. 对于新手,在使用的时候稍有难度. 1. 下载源码 https://github.com/hankcs/pyhanlp git ...
- scipy1.3.0开始被弃用的imread,imresize,如何代替
scipy1.3.0开始被弃用的imread,imresize,如何代替 SciPy最新官方文档的说明(20190730): Functions from scipy.interpolate (spl ...
- 计算机二级-C语言-对结构体数据进行求平均值。对结构体数据进行比较处理。
//函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),作为函数返回,并将大于平均值的数放在形参y所指数组中,在主函数中输出. //重难点:对结构体数据进行求平均值. #in ...