转载请标明出处

第一章 System Verilog过程块、任务和函数

1.1.    verilog通用目的always过程块(procedural block)(可综合)

always过程块的综合指导方针:

  • 组合逻辑

1.关键词always后必须跟一个边沿敏感的事件控制(@符号)

2.事件控制的敏感表中不能包含posedge和negedge限定词

3.敏感表必须列出过程块的所有输入,所谓输入是指在该块读入并且在块外赋值的信号

4.过程块中不能包括其他的事件控制

5.所有在过程块中赋值的变量必须随所有可能的输入组合变化而更新

6.所有在此过程块赋值的变量不能在其他任何过程块再次赋值

  • 锁存逻辑

1.关键词always后必须跟一个边沿敏感的事件控制(@符号)

2.事件控制的敏感表中不能包含posedge和negedge限定词

3.敏感表必须列出过程块的所有输入,所谓输入是指在该块读入并且在块外赋值的信号

4.过程块中不能包括其他的事件控制

5.*过程块中赋值的变量至少有一个不能被某些输入条件更新

6.所有在此过程块赋值的变量不能在其他任何过程块再次赋值

  • 时序逻辑

1.关键词always后必须跟一个边沿敏感的事件控制(@符号)

2.事件控制的敏感表中必须包含posedge和negedge限定词

3.该过程块不能包含其他的事件控制

4.所有在过程块中赋值的变量不能在其他任何过程块再次赋值

1.2.    system verilog特有的过程块(可综合)

通过always_comb,always_latch,always_ff过程块相对于always可以更明确的反映设计意图

1.2.1.      组合逻辑过程块(always_comb)

Eg. always_comb

If(!mode)          //mode在敏感list中

Y=a+b;  //a,b在敏感list中

Else

Y=a-b;

可以看出,always_comb块的后面不需要指明敏感列表。因为敏感表默认为所有被过程块读取(读取:出现在表达式右边或者作为条件语句的条件表达式中)并在块外赋值的信号。

Always_comb过程块在所有initial和always过程块启动时,无论敏感变量是否发生变化,均会在仿真的0时刻自动触发

Always_comb与always@*的区别:

always@*对过程块调用的函数中读取的信号不能推断为敏感变量

而always_comb的敏感列表包含函数读取的信号

1.2.2.      锁存逻辑过程块(always_latch)

Always_latch过程块表示过程块描述的是基于锁存器的逻辑

Always_latch.的推断敏感list的规则与Always_comb相同,且在仿真0时刻也会执行一次

1.2.3.      时序逻辑过程块(always_ff)

Always_ff的敏感列表必须明确列出,一般为posedge或negedge

1.3.    SV对任务和函数的改进

l  SV中task和function中若有多条语句,可以不用像verilog一样使用begin...end打包

l  verilog中函数通过赋值与函数名相同的变量来提供返回值。SV可以使用return关键词

l  SV可以通过return提前结束任务或函数

l  SV提供了显示声明void空函数的功能

l  SV中函数的形式参数增加了output和inout,可以传送调用函数产生的变化

有output或inout参数的函数不能在以下情况中调用:

1.事件表达式。 2.使用过程持续赋值的表达式。  3.不在过程语句中的表达式

l  在可综合模块中可用空函数代替任务,除了不能包含事件控制,啥都能干

l  SV使用参数名传递参数值eg.result <= devide(.denomibator(b),.numerator(a)) //显示传递

l  verilog中函数必须至少有一个输入参数,SV中可以没有形式参数(input/output/inout)

l  SV中缺省方向的形式参数默认为input,且类型为logic,且可定义形参的缺省值

l  形参可以是数组、结构体或联合体

l  自动任务和函数可以通过使用ref取代input/output来达到引用参数的目的(共用存储区)

使用ref的好处是,任务中该参数对变化敏感(因为不是只是复制单时刻的值)且可以立即传播变化

有output/inout/ref参数的函数不能被以下情况中调用:

1.事件表达式。 2.使用过程持续赋值的表达式。  3.不在过程语句中的表达式

4.持续赋值中的表达式

l  当使用const ref声明形参时,任务和函数只能对参数进行只读操作

l  SV中使用endtask endfunction指明任务或函数结尾名称

第二章 过程语句(procedural statements)

2.1.    新操作符

l  递增/递减操作符(++/—) (属于阻塞赋值) (作为独立语句时可综合)

后加:j=i++;//j=i,然后i+1. 先加:j=++i;//i+1然后赋给j

l  赋值操作符(+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,<<<=,>>>=)

(属于阻塞赋值,独立语句可综合,都是=左边作为主操作数,最后赋值给=左边)

l  有无关通配符的相等操作符(==,===,==?)       (右边操作数为常数时可综合)

(==?中右边操作数中x/z看作通配符,与任意数值匹配)

l  设置成员操作符(inside)eg.if(a inside {3’b001,3’b010}); //即if((a==3’b001)||(a==3’b010));

2.2.    操作数改进

l  增加类型强制转换符(<type>’(expression))

l  增加尺寸强制转换符(<size>’(expression))

l  增加符号强制转换符(<signed>’(expression).   <unsigned>’(expression))

2.3.    改进的for循环(可综合)

l  for循环内部声明(循环内定义的变量)的变量是自动变量

(每个循环的内部循环变量互不影响)

l  如果要在循环外饮用一个变量,该变量需在循环外声明。

l  循环内的局部变量不能层次化引用,但是外部声明的变量可以层次化引用

2.4.    底部检测的do...while循环(静态确定循环次数时可综合)

l  while语句在循环开始检测循环控制;do...while在在循环结尾检测,保证至少执行一次

l  语法:     do<语句或语句块>

While(<条件>);

2.5.    foreach数组循环结构

见4.4

2.6.    新的跳转语句——break、continue、return(可综合)

l  verilog:task中使用disable语句使语句序列执行流跳转或作为返回语句

l  SV中跳转语句(break、continue、return)只对当前执行流有效

  • continue语句

跳转到循环的结尾然后重新回到开头执行循环控制

  • break语句

中止循环的执行(整个循环结束,彻底,完全,结束)

  • return语句

从非空函数返回或者从空函数或任务重跳出。

2.7.    改进的块名

Begin:<block_name>

...

End:<block_name>

2.8.    语句标号(statement label)

<label>:<statement >可用来识别单条语句

begin:block1          //named block                                             block2:begin//带label的块

...                                                                                                                      ...

End:block1.                                                                                                  end

一个语句块不能同时有label和block name

2.9.    改进的case语句

l  verilog中case语句默认带有优先级(由前至后)

l  SV为case,casez,casex的判定提供了修饰符unique和priority,均需指明所有条件

n  unique case               等效于同时使用verilog中的full_case及parallel_case附注

该语句指定:必须有且只有一个条件选项与条件表达式匹配

unique case(<case_expression>)

...//条件选项

endcase

n  priority case              等效于verilog中的full_case附注

该语句指定:

至少有一个条件选项与条件表达式相符

若存在多个条件选项的值与条件表达式匹配,则必须执行第一个匹配分支

priority case(<case_expression>)

...//条件选项

endcase

2.10.        改进的if...else判断语句(可综合)

unique if...else

取消判断顺序优先级

Priority if...else

表示分支的次序时重要的,需按照原有次序进行优先级编码

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 笔记(四)

    转载请标明出处 数组.结构体和联合体 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. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  8. 《MFC游戏开发》笔记五 定时器和简单动画

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

  9. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

随机推荐

  1. php 基础 二维数组以某个重复值累加

    $arr = array( array('id' => 123, 'name' => '张三', 'amount'=>'1'), array('id' => 123, 'nam ...

  2. API接收数据反序列化失败问题查找

    C# API接收到数据后,反序列化后直接返回null,而不会给出错误提示,所以不好排查错误. 通过在api中直接进行反序列化,能够得到错误明细: 没有报错的时候,request会直接为null,不会报 ...

  3. NIO的理解

    一.缓冲区(Buffer):在java NIO中负责数据的存取,实际上就是数组,用于存储不用数据类型的数据,根据数据类型不同(boolean除外),提供了相应类型的缓冲区(ByteBuffer,Cha ...

  4. Java IO流详解(六)——转换流

    转换流也是一种处理流,它提供了字节流和字符流之间的转换.在Java IO流中提供了两个转换流:InputStreamReader 和 OutputStreamWriter,这两个类都属于字符流.其中I ...

  5. 剑指offer系列——62.二叉搜索树的第k个结点

    Q:给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. T: 中序遍历,递归: int count = 0; public ...

  6. C语言:使用递归解决汉诺塔问题。

    //汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...

  7. websocket 无法查看Data

    websocket 是浏览器新的信息传输协议,记录一些遇到的问题: 调试相关: websocket 连接以后可以在Chrome tools 中的network下看到,如图 要查看通信内容可以选中点击f ...

  8. oracle学习笔记(十四) 数据库对象 索引 视图 序列 同义词

    数据库对象 用户模式:指数据库用户所创建和存储数据对象的统称.在访问其它用户模式的数据库对象时需加上用户模式. 如:scott.emp, scott.dept等. 数据库对象包括:表.视图.索引.序列 ...

  9. pytest-conftest.py作用范围

    1.conftest.py解释 conftest.py是pytest框架里面一个很重要的东西,它可以在这个文件里面编写fixture,而这个fixture的作用就相当于我们unittest框架里面的s ...

  10. CSS水平垂直居中常见方法总结2

    1.文本水平居中line-height,text-align:center(文字)元素水平居中 margin:0 auo 方案1:position 元素已知宽度 父元素设置为:position: re ...