Systemverilog for design 笔记(六)
转载请标明出处
第一章 有限状态机建模(FSM,finite state machine)
1.1. 使用枚举类型建立状态机模型
l 三过程块建模风格:三个过程块分别实现:
a.状态转换(always_ff) b.产生下一状态(always_comb) c.产生状态输出值(always_comb)
l 使用枚举类型表示状态编码:通过定义enum类型决定状态位数;可显示指定label value
l 使用枚举类型的反向case语句:对应ont-hot编码模式,条件选项是状态编码的某一位
l 使用unique修饰case语句
l 对于未使用的状态值(由状态变量宽度遍历产生):
n Verilog:使用X作为缺省赋值,case语句中default:state = n’bxxx; SV:用unique case
n 使用专用的综合full_case附注
l 尽量使用enum list中的label,而不是具体value对枚举变量赋值
l 对于enum变量的操作:1.直接将int赋值给enum变量是非法的,要在操作后(赋值前)进行强制转换,将其转换为枚举类型。 2.可使用枚举方法,见3.2.6
1.2. 在FSM模型中使用两态数据类型
容易出现死锁。解决方法:1.使用logic显示声明enum 2.使用always_comb
1.3. 总结
unique case + logic enum大法好
第二章 层次化设计
2.1. 模块原型
SV允许用户为被实例化的模块指定一个原型。原型的定义使用关键词extern
Extern之后是模块及端口声明。 该声明只在其定义的范围内可见。
若模块有extern module声明,则模块定义时无需重复端口声明,可用 .* 替代
Eg.extern module counter #(parameter N = 15)
(output logic [N:0] cnt,
input wire [N:0] d,
input wire clock,
load,
resetN);
module counter (
.* ); //$unit中已使用原型定义,所以无需重复端口声明
… //模块内容
endmodule
2.2.
命名的结束语句
l 命名的模块结尾 eg. endmodule : <module_name>
l 命名的代码块结尾 见6.7,另外还有package...endpackage,
interface...endinterface,
task...endtask,
function...endfunction, and begin...end
2.3.
嵌套(局部)模块的声明
Eg. module
ip_core (input clock);
sub1 u1 (...); // 嵌套模块sub1实例化
module sub1
(...); // 嵌套模块定义(注意是在ip_core模块中嵌套定义,而非实例化)
sub2 u2 (); //在nested
module sub1的定义中实例化sub2
...
endmodule: sub1
module sub2; //嵌套模块定义。Sub2没有端口,但可看到其父模块源码中的标识符
sub3 u3 (...); //在nested module sub2的定义中实例化sub3
endmodule: sub2
module sub3 (...); //嵌套模块定义
...
endmodule: sub3
endmodule: ip_core
Verilog中的模块名全部是全局的
SV为解决全局模块带来的可能模块间冲突及安全问题,提出了:
嵌套(局部)模块:Nested
(local) module 在模块内声明(local)模块
允许一个模块的定义嵌套在另一个模块的定义中,该模块在声明的层次域外不可见
2.4.
简化的模块实例网表
Verilog中两种连接模块实例的代码风格:
l 使用端口顺序连接模块实例 eg.
dff d1 (out, /*not used*/, in, clock, reset);
l 使用端口名称连接模块实例
eg. dff d1 (.q(out), .qb(/*not used*/),//.<端口名>(<线网
.d(in),
.clk(clock), .rst(reset) );// 或变量名>)
SV中有三种端口连接方法:
l .name 端口连接
l .* 端口连接
l 接口(见第九章)
2.4.1.
.name端口连接
当port_name = wire_name且宽度相同时,SV中可使用.name的方式连接模块实例
相当于verilog中的.name(name)
Eg.
prom prom (
.dout(program_data),
.clk, //使用.name端口连接
.address(program_address)
);
2.4.2.
.* 端口连接
用于表示模块实例中所有名称相同的端口和线网(或变量)是自动连接在一起的。
Eg.
prom prom (
.*, //使用.*端口连接
.dout(program_data),
.address(program_address)
);
2.5.
线网别名化(alias)
SV使用alias表示两个不同名称对同一个线网的引用。
Eg.
wire clock,clk; alias clk = clock ;//clk和clock指的是同一个逻辑线网,不是赋值语句
Alias支持多重别名化:alias rst = reset = resetN
= rstN ;//一个拥有4个别名的逻辑线网
Rule:
l 进行别名化的两个线网类型及位数必须相同
l 只有线网类型可以别名化,变量不能别名化
(wire, uwire, wand, wor,
tri, triand,trior, tri0, tri1, trireg.)
2.6.
在模块端口间传递数值
Verilog对模块端口的限制:
l 只有线网类型可以用在端口的输入端
l 只有net , reg , integer ,或文本整数值可以用在模块输出端口
l 通过模块端口传递real类型不合法,要先转换成向量来传递
l 模块端口间传递任何维数的非压缩数组是不合法的
SV中解除了这些限制:
l 任何类型都可以在模块的input/output端口,包括实数值
l 任何维数的压缩或非压缩数组都可以在端口间传递
l Struct和union也可以在模块端口间传递
未解除一些限制:
u 变量只能从单个源接收数值
u 端口两边的非压缩类型在结构上完全匹配(对于struct/union要求typedef相同)
(压缩值作为向量在端口间传递)
2.7.
端口引用(ref)(不可综合)
相对于verilog的input/ouput/inout,SV增加了ref端口。
Ref端口可以在端口间却传递一个对变量的层次化引用,而不是传递该变量值。
对端口名称的任何引用都会直接引用实际的原变量。
通过引用在端口间传递变量会生成共享变量,但在硬件行为却不是如此。
2.8.
增强的端口声明
SV相对于Verilog简化了端口说明的步骤:
l SV制定了缺省的端口方向inout。
l 若port list中下一个port定义了类型,但没有指定方向,那么默认端口的方向与前一端口一致
l SV增加了两种可以带port ,interface和program的层次块,它们的端口声明同模块
l 如果第一个端口没有指定方向和类型,则其他端口也不能声明方向和类型
2.9.
参数化类型
通过parameter type声明参数化的类型
Eg.
module
adder #(parameter type ADDERTYPE =
shortint) //缺省情况下,参数类型是shortint
(input ADDERTYPE a, b, //可重定义类型
output ADDERTYPE sum, //可重定义类型
output logic carry);
ADDERTYPE temp; // 使用可重定义类型的局部变量
... // 加法器功能
endmodule
module big_chip(
... );
shortint a, b, r1;
int c, d, r2;
int unsigned e, f, r3;
wire carry1, carry2, carry3;
adder i1 (a, b, r1, carry1);//16位无符号加法器
adder #(.ADDERTYPE(int)) i2 (c, d, r2, carry2); //重新定义参数类型,32位有符号加法器
adder #(.ADDERTYPE(int unsigned)) i3 (e, f, r3, carry3); //32位有符号加法器
endmodule
Systemverilog for design 笔记(六)的更多相关文章
- 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. 用户自定义类型(typedef) 局部typedef定义:只用于设计的特定部分时,typedef的定义可在module或interface中 共享typ ...
- 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 ...
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- window下载并且安装kafka
安装zookeeper kafka运行需要有jdk+zookeeper环境才能够使用,jdk的安装和环境变量的配置就不介绍了,这里需要先安装zookeeper.可以从官网上下载 https://www ...
- casperJs的安装
自己买了vps就是爽,想装什么就装什么.就比如说casperjs 1.首先需要安装它的运行环境phantomjs *将这个git项目clone到自己的vps上[https://github.com/a ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 M. Longest subsequence(思维+序列自动机)
序列自动机跑s串 假设k为s和t相同的长度,初始时相同长度为0 取s串中大于t[i]的最左边的位置,用n-tmp+1+i-1更新答案,tmp是最左端的位置 然后去t[i]相等的位置,走到下一位,如果下 ...
- 【C语言】判断某一正整数是否为完数
什么是完数? 如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”). 例如,6的因子为1.2.3,而 6=1+2+3,因此6是“完数”. 程序框图:m 问题分析 根据完数的定义,解决本题的 ...
- tp5的输入和验证
规则和模板 好像要写一样名字,只需要引入模板
- pip install cv2 安装报错
pip install cv2 安装报错是一个常见现象: ERROR: Could not find a version that satisfies the requirement cv2 (fro ...
- python序列化及其相关模块(json,pickle,shelve,xml)详解
什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...
- Django 删除 migrations
如果想重新创建表格,可以按如下步骤进行操作: 1. 从数据库中删除表格 DROP TABLE `table_name`; 2. 删除 migrations 文件 文件在APP名称下的 migratio ...
- JS-防抖与节流
问题的由来:一些事件频繁的被触发而导致频繁的调用事件处理程序,从而造成程序不必要的开销,影响程序性能:防抖和节流就是为了解决这种情况造成的性能消耗. 场景1:使用keyup事件监听输入框的值进行请求搜 ...
- spark实验(三)--Spark和Hadoop的安装(1)
一.实验目的 (1)掌握在 Linux 虚拟机中安装 Hadoop 和 Spark 的方法: (2)熟悉 HDFS 的基本使用方法: (3)掌握使用 Spark 访问本地文件和 HDFS 文件的方法. ...