转载请标明出处

第一章 有限状态机建模(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 笔记(六)的更多相关文章

  1. Systemverilog for design 笔记(七)

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

  2. Systemverilog for design 笔记(五)

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

  3. Systemverilog for design 笔记(四)

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

  4. Systemverilog for design 笔记(三)

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

  5. SystemVerilog for design 笔记(二)

    转载请标明出处 1. System Verilog文本值和数据类型 1.1. 增强的文本值赋值 相对于verilog,SV在文本值赋值时可以1.无需指定进制    2.赋值可以是逻辑1 用法: reg ...

  6. Systemverilog for design 笔记(一)

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

  7. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...

  8. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. vue项目用npm安装sass包遇到的问题及解决办法

    IDEA启动vue程序,浏览器访问时出现如下情况的关于node-sass的错误: 错误1: Module build failed (from ./node_modules/sass-loader/d ...

  2. linux下的apue.3e安装[Unix环境高级编程]

    近期正在看<Unix环境高级编程>一书,目前看了20多页,书中 有几个c的例程,于是想着,也让它运行一下,看看是否跟描述相符,做开发人员本应该这样,于是敲了一部分代码,然后编译,发现并不能 ...

  3. IE6下的png不透明问题

    前几天刚做完一个小需求,但是在兼容ie方面用了比较久的时间,主要是切面那边用的背景图都是png格式的,而经过查找知道,ie6对png图片透明部分渲染效果是不透明的,我看到的是淡淡的绿色,简单的处理方式 ...

  4. Mybatis 元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id*,result*,association*,collection*,discriminat

    <resultMap id="BaseResultMap" type="com.youotech.tl_cons_credit_rating.entity.TL_C ...

  5. django之关系及查询,数据类型,约束,分页

    目录 关系 数据列类型 数据类型的约束 分页 关系 1. 一对一(水平分表) 母表: UserInfo id name age 子表: private id salary sp 创建模型语句: cla ...

  6. STM32F103_外部RAM用作运存---IS62WV51216

    https://www.cnblogs.com/lilto/p/9548736.html STM32F103_外部RAM用作运存   概述 SRAM的简介 折腾过电脑的朋友都知道,当电脑运行比较卡的时 ...

  7. 对 Element UI table中数据进行二次处理

    (1)<el-table-column>标签加上 :formatter="dateFormat" <el-table-column prop="Star ...

  8. 【转】通过python调用jenkins 常用api操作

    原:https://www.cnblogs.com/L-O-N/p/11608220.html # -*- coding: utf- -*- import jenkins class TestJenk ...

  9. 使用ssh 初始化git一个空java工程

    1:进入git 目录 cd /home/git/repo/ 2:创建一个java工程名 mkdir qft-payment 3:进入工程 cd  qft-payment/ 4:初始化空工程 git - ...

  10. 计算机二级-C语言-程序填空题-190115记录-fprintf()函数和fscanf()函数的使用。

    //给定程序,函数fun的功能是:将自然数1~10以及它们的平方根写到名为myflie3.txt的文本文件中,然后再顺序读出显示在屏幕上. //重难点:fprintf()函数和fscanf()函数的使 ...