Systemverilog for design 笔记(五)
转载请标明出处
第一章 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判断语句(可综合)
l unique if...else
取消判断顺序优先级
l Priority if...else
表示分支的次序时重要的,需按照原有次序进行优先级编码
Systemverilog for design 笔记(五)的更多相关文章
- Systemverilog for design 笔记(七)
转载请标明出处 第一章 接口(interface) 1.1. 接口的概念 接口允许许多信号合成一组由一个端口表示. 1.2. 接口声明 //接口定义 Interface main_bus ...
- Systemverilog for design 笔记(六)
转载请标明出处 第一章 有限状态机建模(FSM,finite state machine) 1.1. 使用枚举类型建立状态机模型 l 三过程块建模风格:三个过程块分别实现: a.状态转换(al ...
- 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 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- 《MFC游戏开发》笔记五 定时器和简单动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
随机推荐
- AJAX技术初级探索
一 概念 Ajax技术能够实现页面以异步方式从服务器获取信息,无需刷新页面 Ajax的核心技术是XMLHttpRequest对象(XHR) 异步实际就是请求数据的代码不会阻塞页面向下执行 二 原生Aj ...
- ubuntu mysql新增用户并开启远程连接
1.首先用root用户登录mysql mysql -u root -p 输入密码后登录成功 2.新建用户 use mysql; select host,user from user;(查看现有用户) ...
- Yii2.0 连接数据库
打开数据库配置文件common\config\main-local.php
- 【C语言】编写程序,输出以下图形
编写程序输出以下图形: * ** *** **** ***** 代码: #include <stdio.h> int main() { int i, j; ; i <= ; i++) ...
- hamming distance(汉明距离)
看knn算法时无意间发现这个算法,但是维基上有错误的示例和python代码...因为汉明距离并不是求相同长度字符串(或相同长度的整数)之间的字符(或数位)差异个数. 正确的详见:https://en. ...
- Anniversary party POJ - 2342
题目链接 经典的树形dp,最大独立集,对于每个点就有2个状态,选/不选 设\(dp_{i,0}\)表示不选第i个,\(dp_{i,1}\)表示选第i个,容易得到其状态转移 \(dp_{i,0} = \ ...
- 转载--php 7.2 安装 mcrypt 扩展
在 php 官网下载 mcrypt 包,php 扩展官网 # wget http://pecl.php.net/get/mcrypt-1.0.1.tgz # tar xf mcrypt-1.0.1.t ...
- 使用python实现归并排序、快速排序、堆排序
归并排序 使用分治法:分而治之 分: 递归地拆分数组,直到它被分成两对单个元素数组为止. 然后,将这些单个元素中的每一个与它的对合并,然后将这些对与它们的对等合并,直到整个列表按照排序顺序合并为止. ...
- put、patch与post区别
idempotent 幂等的 如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的: idempotent的意思是如果相同的操作再執行第二遍第三遍,結果還是一樣. POST方法 ...
- Python:re 模块
re模块是python内置的正则表达式模块