一、数据类型

1.内建数据类型
相比于Verilog将寄存器(register)类型reg和线网(net)类型,例如wire区分地如此清楚,在SV中新引入一个数据类型logic。它们的区分和联系在于:
①Verilog作为硬件描述语言,倾向于设计自身懂得所描述的电路中哪些变量应该被实现为寄存器,而哪些变量应该被实现为线网类型。这不但有利于后端综合工具,也更便于阅读和理解。
②SV作为侧重于验证的语言,并不十分关切logic对应的逻辑应该被综合为寄存器还是线网,因为logic被使用的场景如果是验证环境,那么它只会作为单纯的变量进行赋值操作,而这些变量也只属于软件环境构建。
③logic被推出的另外一个原因也是为了方便验证人员驱动和连接硬件模块、而省去考虑究竟该使用reg还是wire的精力。这既节省了时间,也避免了出错的可能。
2.与logic相对应的是bit类型,它们均可以构建矢量类型(vector),而它们的区别在于:
①logic为四值逻辑,既可以表示0、1、X、Z。
②bit为二值逻辑,只可以表示0和1.
问题1:SV为什么已经有了四值逻辑的基础上还要在引入二值逻辑呢?
这是因为,SV在一开始设计的时候,就期望将硬件世界和软件世界分离开。在这里,硬件的世界指的就是硬件设计,所以四值逻辑属于那里,而软件的世界即验证环境,更多的是二值逻辑。
3.四值逻辑的类型和二值逻辑的类型分类:
①四值逻辑类型:integer、logic、reg、net-type(例如wire、tri)
②二值逻辑类型:byte、shortint、int、longint、bit
按照有符号和无符号的类型进行划分,那么可以将常见的变量类型划分为:
①有符号类型:byte、shortint、int、longint、integer
②无符号类型:bit、logic、reg、net-type(例如wire、tri)
4.a)在编码是一定要注意操作符左右两侧的符号类型是否一致,如果不一致,应该首先将其转换为同一类型再进行运算。
b) 转换方式:①静态转换:即需要在转换的表达式前加上单引号即可,而该方式并不会对转换值
做检查。如果转换失败,也无从得知。
②动态转换$cast(tgt,src);静态转换和动态转换均需要操作符号或系统函数介入,称之为显式转换。
5.我们在不同的数据类型进行操作时应该主义变量的:①逻辑数值类型;②符号类型;③矢量位宽
数据类型
1.软件常用类型
a)定宽数组
①数组声明
int lo_hi[0:15]; //16 ints [0]…[15]
int c_style[16]; //16 ints [0]…[15]
②多维数组声明和使用
int array2 [0:7] [0:3]; //完整声明
int array3 [8][4]; //紧凑声明
array2 [7][3]; //设置最后一个元素
③初始化和赋值
int ascend[4] = '{0,1,2,3}; //对4个元素初始化
int descend[5];
descend = '{4,3,2,1,0}; //为5个元素赋值
descend[0:2] = '{5,6,7}; //为前三个元素赋值
ascend = '{4{8}}; //四个值全部为8
descend = '{9,8,default:-1}; //{9,8,-1,-1,-1}
③存储空间考量

④基本数组操作for和foreach循环

⑤基本数组操作赋值和比较
对于赋值,可以利用赋值符号“=”直接进行数组的复制。
对于比较,在不适用循环的情况下,也可以利用“==”或者“!=”来比较数组的内容,不过结果仅限于内容相同或者不相同。

b)动态数组
①定宽数组的宽度在编译时就确定了;动态数组在程序运行再确定数组的宽度。
②动态数组最大的特点即是可以在仿真运行时灵活调节数组的大小及存储量。
③动态数组在一开始声明时,需要利用‘[ ]’来声明,而数组此时是空的,即0容量。其后,需要使用‘new[]’来分配空间,在方括号中传递数组的宽度。
④也可以再调用new[]时将数组名也一并传递,将已有数组的值赋值到新数组中。

c)队列
1.队列结合了链表和数组的优点,可以在它的任何地方添加或删除元素,并且通过索引实现对任一元素的访问。
2.
3.队列不需要new[]去创建空间,你只需要使用队列的方法为其增减元素,一开始其空间为0.
4.队列的一个简单使用即是通过自带方法push_back()和pop_front() 的结合来实现FIFO的用法。

d)关联数组
1.可以用来保存稀疏矩阵的元素。当你对一个非常大的地址空间寻址,该数组只为实际写入的元素分配空间,这种实现方法所需要的空间比定宽数组所占用的空间要小得多。

e)结构体
1.Verilog的最大缺陷之一是没有数据结构,在sv中可以使用struct语句创建结构,跟c语言类似。
2.struct是一个数据的集合,其通常使用方式是将若干相关的变量组合到一个struct结构定义中。
3.伴随typedef可以用来创建新的类型,并利用新类型来声明更多变量。

f)枚举类型
1.规范的操作码和指令例如ADD、WRITE、IDLE等有利于代码的编写和维护,它比直接使用’h10这样的常量使用起来可读性和可维护性更好。
2.枚举类型enum经常和typedef搭配使用,由此便于用户自定义枚举类型的共享使用。
3.枚举类型的出现保证了一些非期望的值的出现,降低的设计分险。

e) 字符串
1.所有与字符串相关的处理,都请使用string来保存和处理。
2.与字符串处理相关的还包括字符串的格式化函数即如何形成一个你想要的字符串句子。可以使用sv系统方法 $sformatf(),如果你只需要将它打印输出,那么就使用 $display()。

二、过程快和方法
1.硬件过程快
initial和always
a. always
为了区分硬件世界和软件世界,我们将定义的软件变量或者例化的硬件其所在的空间称之为域。module/endmoudule,interface/endinterface,可以被视为硬件世界,program/endprogram和class/endcalss可以被视为软件世界。
①always是为了描述硬件的行为,而在使用时需要注意哪种使用方式是时序电路描述,哪种使用方式是组合电路描述。
②always中的@(event)敏感列表是为了模拟硬件信号的触发行为。always过程快是用来描述硬件时序电路和组合电路的正确打开方式,因此只可以在moudule或者interface中使用。
b. initial
①initial符合软件的执行方式,即只执行一次。
②initial和always一样,无法被延期执行,即在仿真一开始它们都会同时执行,而不同initial和always之间在执行顺序上是没有顺序可言的。
③initial从其执行路径的属性来看,它不应该存在于硬件设计代码中,它本身不可综合,,对于描述电路没有任何帮助。
④由于测试需要按照时间的顺序的习惯及软件方法来完成,所以initial可以实现这个要求。
⑤initial过程块可以在moudule,interface和program中使用
2. 函数
①sv函数定义同c语言非常类似
可以在参数列表中指定输入参数(input)、输出参数(output)、输入输出参数(inout)或者引用参数(ref)。
可以返回数值或者不返回数值(void).

除此之外,function还有以下的属性
a.默认的数据类型是为logic,例如 input [7:0] addr。
b.数组可以作为形式参数传递。
c.function可以返回或者不返回结果,如果返回需要用关键词return,如果不返回则应该在声明function时采用void function()。
d.只有数据变量可以在形式参数列表中被声明为ref类型,而线网类型则不能被声明为ref类型。
e.在使用ref时,有时候是为了保护数据对象只被读取不被写入,可以通过const的方式来限定ref声明的参数。
f.在声明参数时,可以给入默认值,例如input[7:0] addr = 0,同时再调用时如果省略该参数的传递,那么默认值即会传递给function。
3.任务task
a. 任务相比于函数要更加灵活,且以下不同点:
①task无法通过return返回结果,因此只能通过output、inout或者ref的参数来返回。
②task内可以置入耗时语句,而function则不能。常见的耗时语句包括@event、wait event、
#delay等。
task mytaskl (output logic [31:0] x,input logic y);

endtask
使用方式:
在非耗时方法定义时使用function,在内置耗时语句时使用task。
function只能运用于纯粹的数字或者逻辑运算,而task则可能会被运用于耗时的信号采样或者驱动场景。
如果要调用function,则使用function和task均可对其调用;而如果要调用task,建议使用task来调用,这是因为如果被调用的task内置有耗时语句,则外部被调用的task内置有耗时语句,则外部调用它的方法类型必须为task。
4.变量生命周期
①在sv中,将数据的生命周期分为动态(automatic)和静态(static).
②局部的变量的生命周期同其所在的域共存亡,例如function/task中的临时变量,在其方法调用结束后,临时变量的生命也将终结,所以他们是动态生命周期。
③全局变量即伴随着程序执行从开始到结束一直存在,例如module中的变量默认情况下全部为全局变量,也可以理解为module中的变量由于在模拟硬件信号,所以它们是静态生命周期。
④如果数据变量被声明为automatic,那么在进入该进程/方法后,automatic变量会创建,而在离开该进程/方法后,automatic变量会被销毁。而static变量在仿真开始时即会被创建,而在进程/方法执行过程中,自身不会被销毁,且可以被多个进程和方法所共享。
--------------------------------------------------------------------------------------------------------

上面的三个function被定义在了module内,分别被声明为了automatic、static和默认类型。
对于automatic方法,其内部的所有变量默认也是automatic,即伴随automatic方法的生命周期建立和销毁。
对于static方法,其内部的所有变量默认也是static类型。
对于automatic或者static方法,用户可以对其内部定义的变量做单个申明,使其类型被显示声明为automatic与static。
对于static变量,用户在声明变量时应该对其内部做初始化,而初始化只会伴随它的生命周期发生一次,并不会随着方法调用被多次初始化。


①在module、program、interface、task和function之外声明的变量拥有静态的生命周期,即存在与整个仿真阶段,这同c定义的静态变量一致。
②在moudule、interface和program内部声明,且在task、process或者function外部声明的变量也是static,且作用域在该块中。
③在moudule、program和interface中定义的task、function默认都是static类型。
④在过程快中(task、function、process)定义的变量均跟随它的作用域,即过程快的类型。如果过程快为static,则它们默认为static,反之亦然。这些变量也可以由用户显示声明为automatic和static。
⑤为了使得在过程块中声明的变量有统一默认的声明周期,可以在定义module、progress、interface或者package时,通过限定词automatic或者static来区分。对于上述程序块默认的生命周期类型为static。
5.模块定义

模块例化
在上层例化底层模块,或者TB例化DUT时,均需要完成模块例化。例化时需要注意模块名,参数例化传递(如果有)、例化名和端口例化对应。

模块连接
①在testbench中的连接(connection)指的是有硬件模块参与作为信号驱动方(drive)或者负载方(load)
②TB中常见的连接有两个硬件模块之间的连接,例如实例A与实例B的连接,可由logic类型完成连接;如果是硬件模块与TB中发送数据激励的连接,则需要考虑数据激励一端如何正确产生数据并发送至DUT一侧,同时数据激励一端也需要对DUT反馈的信号做出正确的响应。

SystemVerilog芯片验证 SV语言部分(一)相关推荐

  1. soc验证 c语言,一种Soc芯片验证方法与流程

    本发明涉及Soc芯片设计及制造领域,特别涉及一种Soc芯片验证方法. 背景技术: 随着设计与工艺技术的不断发展,集成电路设计的规模越来越大,复杂度越来越高,为了缩短芯片的上市时间,节约开发成本,多家I ...

  2. 验证工程师,掌握Cortex-M3 MCU芯片验证真的太太太……重要啦!

    找工作的时候,你是不是也希望能够掌握公司的核心技术?成为不可或缺的人才?那你需要掌握的技能必须要足够多,对于芯片行业来说,技术决定了一切.今天我们来聊一聊芯片验证工程师的必备技能:Cortex-M3 ...

  3. 适用于芯片验证工程师的atom插件列表

    插件列表 activate-power-mode advanced-new-file atom-beautify autocomplete-json autocomplete-paths autoco ...

  4. 芯片验证漫游指南_IC验证入门资料

    这学期马上就要结束了,SV课昨天也考试了,大家大部分考的都还不错,感谢大家的支持.所以后面关于SV可能就不会更新那么多了,也有可能会从头开始,出一个关于SV从入门到自我放弃的系列.再看吧~~这主要取决 ...

  5. [FPGA] 1、Artix-7 35T Arty FPGA 评估套件学习 + SiFive risc-v 指令集芯片验证

    目录 1.简介 2.深入 3.DEMO 4.SiFive基于risc-v指令集的芯片验证 LINKS 时间 作者 版本 备注 2018-10-09 08:38 beautifulzzzz v1.0 到 ...

  6. 一场关于开源芯片生态之语言与工具链的讨论

    一场关于开源芯片生态之语言与工具链的讨论 \\\插播一条: 自己在今年整理一套单片机单片机相关论文800余篇 论文制作思维导图 原理图+源代码+开题报告+正文+外文资料 想要的同学私信找我. 一.摘要 ...

  7. 【揭秘】50K+验证工程师求职加分项——MCU芯片验证

    无论是在秋招.春招.还是社招,IC企业在招聘时,芯片验证的岗位的需求量往往都是排在前列.即便是在内卷比较严重的今年,验证工程师的需求量要是排名前三. 一款芯片从立项到流片生产需要经过层层自测和验证,否 ...

  8. 芯片验证周期——数字IC验证

    芯片的验证周期大致可以分为RTL0.RTL1.RTL2.RTL3.GLS和TO,下面详细阐述各时间节点veriifier所需要做的具体内容. 节点 内容 RTL0 芯片框架和模式功能定义完成,指定验证 ...

  9. 芯片验证自学,IC验证自学入门教程:ASIC芯片设计流程讲解

    作者:小白蒋,材料专业自学芯片验证,交流邮箱:jsujiang@yeah.net 最近在学习IC验证相关知识,整理了一下IC芯片设计流程,本人刚开始学习,不对的地方欢迎留言讨论 ASCI设计芯片流程 ...

  10. 芯片验证系列——Testpoints分解

    既然是芯片验证,那就需要明确验证芯片的哪些特性(功能.性能等).验证空间是无穷大的,验证工程师需要在有限的时间内,完成尽可能多的重要verification features的验证.Verificat ...

最新文章

  1. 【收藏】Java多线程/并发编程大合集
  2. 2019年中国智能制造发展现状及趋势分析报告
  3. pandas的reindex功能
  4. android 6.0权限封装,Android6.0------权限申请管理(单个权限和多个权限申请)
  5. C++ 复制控制之复制构造函数
  6. matlab求微分方程同届,Matlab学习——求解微分方程(组)
  7. Math 对象的扩展
  8. delete函数的动态解析
  9. 调用有密码Web Service接口
  10. C++基础:第八章 深入IO
  11. eclipse中使用maven插件的时候,运行tomcat7:run的时候报错
  12. 南阳理工acm1043高数
  13. 银行卡号与开户行对照文档
  14. Pinterest和Instagram哪个更好用?姐妹还是天敌...
  15. 爬虫---数据的提取
  16. 清华大学计算机系2015分数线,2015年清华大学录取分数线
  17. Java必会基础题,量不多,但每天进步一点也是好的
  18. 华为荣耀5C真机调试android过程遇到的问题
  19. 【学术相关】为什么鼓励你读博士?自南大毕业后,我目睹了读博的千姿百态...
  20. 中兴视觉大数据客户实践案例(部分)

热门文章

  1. latex 上标 下标怎么打
  2. 尚雯婕个唱化身宫廷芭比娃娃
  3. 前端必备:从头开始,搞懂Promise之Promise基础
  4. python扇贝每日一句api_【扇贝批量添加单词到词库】利用python调用扇贝API (oauth2)...
  5. 我花10个小时,写出了小白也能看懂的阿里数据中台分析
  6. stm32f4有重映射么_stm32f4引脚重映射
  7. 转帖自勉:一个猎头的自述
  8. 算法设计和分析 ② 分治和递归
  9. Windows或Linux中32位与64位操作系统的区别
  10. android的EditText字数检测和限制