这一篇笔记主要记录Procedural,Process,Task and function,Interface和Communication中值得注意的点。

1.Procedural

写testbench的时候,除了tb与硬件交互的地方使用非阻塞赋值,tb里面其他地方一律用阻塞赋值,OK

 logic [:]        d0,d1;
initial begin
d0 <= ;
$display("d0 value %0d",d0); //d0=x;logic在未被初始化的时候是x
d1 = ;
$display("d1 value %0d d0 value %0d",d1); //d1=4,d0=x;注意这个时候d0依然是x
#
$display("d1 value %0d d0 value %0d",d1); //d1=4,d0=3;只有#1往前走了之后,<=才会赋值生效
end

Loop循环中的foreach,是专门针对数组轮询时候用的。对二维数组遍历,如下代码:

 int data[][];
initial
foreach(data[]) begin
foreach(data[i][j]) begin
</**/>
end
</**/>
end
end

在两个for循环中,可以在里面直接定义index,例如for(int i; i<10; i++) 这样,如果有两个for里面都定义了int i,这两个index i是相互不影响的。

哪些地方可以加label? Module...endmodule; begin...end; task...endtask; fork...join; interface...endinterface; 加标签的主要好处是增加代码的可读性,例如下面的代码:

 module test();
begin: b0
<...>
begin: b1
<...>
end: b1
end: b0 begin: b2
<...>
end: b2
endmodule:test

Final Blocks。这个块在Verilog中没有,当遇到$finish的时候,会进入到final块中。一般用在打印一些信息,注意final块中是不能加延迟#操作的,不然会报错。

2.Process

initial块和always块都会产生进程Process。在SV中,可以使用fork来动态地产生子进程。fork有三种形式:fork...join  fork...join_any  fork...join_none 。使用fork...join_none时,不等待子进程执行,直接先执行主进程,就是fork...join_none外面的代码,但是fork...join_none里面的代码在后台也在执行,注意执行的先后顺序。如下代码:

 fork: fork
begin
#;
end
begin
#;
end
join
$dispaly($time); // time is 2ns
fork: fork
begin
#;
end
begin
#;
end
join_any
$dispaly($time); // time is 1ns
fork: fork
begin
#;
end
begin
#;
end
join_none
$dispaly($time); // time is 0ns

使用wait fork来等待所有的进程执行完,如下代码,只有exec1(), exec2(), exec3(), exec4()都执行完了,task才会结束。

 task mytask;
fork: fork1
exec1();
exec2();
join_any
fork: fork2
exec3();
exec4();
join_none wait fork;
endtask

使用disable fork,可以停止后台挂起的进程。在fork...join_any中disable fork使用的较多,用来检测程序,当fork...join_any中的任何一个监测进程执行OK后,就会使用disable fork来杀死fork中剩余的其他监测进程。

为了对Process更精细控制,SV中内建有Class,在UVM中使用到。(遇到再更新吧~.~)

3. task and function

 task mytask(a, int b, output logic [:]u, v)
// a没有定方向和类型,默认input logic;
// b默认是input方向
// v的方向和类型会继承前一个参数,所以v也是output logic [15:0]
<...>
endtask

task和function也可以加标签,如下代码:

 task mytask(a = , int b, output logic [:]u, v);
// a的默认值是3,如果传参没有传,就会使用默认值
<...>
endtask: mytask
function my_func (a, int b, output logic [:]u, v);
<...>
endfunction: my_func

C语言有数值传参和指针传参,SV也有,在定义task的时候使用ref关键字去修饰形参,还可以加const,参考C语言的用法。

task中可以有时间消耗,function中不能有时间消耗。task可以调用function,反过来不可以。

4. Interface

使用interface...endinterface来定义,用来解决模块之间的连接,模块和硬件件的连接问题。可以像理解module一样去理解interface,如下代码:

 // 定义一个interface类型
interface bus_A (input clk); //定义interface时可以像module一样有端口
logic req;
logic [:] addr,data;
logic start,rdy;
endinterface
// 使用这个interface,在module中例化
module tb_top;
logic clk = ;
bus_A sb_intf(clk); //例化
memMode u_inst_mem1(clk,sb_intf); //把memMode模块,通过名字相同的线与sb_intf连接起来
endmodule

在定义interface的里面,使用modport来对一些信号接口做子集分类,这样在外层module中,例化一个模块,模块可以只连接interface其中的一个子集。

interface可以像module一样,用#(AWIDTH=8,BWIDTH=9)来定义参数,在传递的过程中来改变值。

interface里面还可以使用clock块,在实际项目中遇到了再总结吧(~.~)!

在calss中使用interface,必须使用关键字virtual interface

5. 同步和通信

    同步和通信有三种:Semaphone, Event, Mailbox。最后一个是用来传递数据的。

5.1 Semaphones

  解决进程资源间共享问题,提供四个函数:new, put, get, try_get。其中get相当于一个task,里面有延迟,会阻塞其他的get拿到钥匙,try_get相当于一个function,立即执行,不会产生阻塞。下面代码示例:

 semaphone sem0 = new();    //钥匙数量为1
initial begin:process
#10ns
void'(sem0.try_get()) //不会阻塞,拿不到钥匙直接执行下面的语句;拿到钥匙返回值为1
sem0.get(); //不会拿到钥匙,会一直阻塞在这里,直到下面的进程100ns之后把钥匙还了
sem0.put(); //还钥匙
end:process initial begin:process
sem0.get();
#100ns
sem0.put(); //还钥匙,key number 为1
end:process

5.2 Event

用来触发事件,使用->;用来等待事件使用@或者wait。那么@和wait有什么区别呢?看下面的代码:

 event a;    //使用关键字event来声明一个事件a
initial begin
#;
->a;
end
initial begin
#;
@a; //第一个进程在1ns后触发了事件a,那么第二个进程在1ns的时候等待a,有可能等的到,有可能等不到,产生竞争
end
initial begin
#;
wait(a.triggered); //使用wait来等待事件a,这种方式是一定可以等到a的,这是和使用@来等待的区别
end

wait像是增强版的@,用来解决同一时刻的竞争冒险问题。

5.3 Mailbox

可以理解为能存储任意数据类型的队列。先挖坑,以后遇到了再做笔记(~.~)!

System Verilog基础(二)的更多相关文章

  1. System Verilog基础(一)

    学习文本值和基本数据类型的笔记. 1.常量(Literal Value) 1.1.整型常量 例如:8‘b0 32'd0 '0 '1 'x 'z 省略位宽则意味着全位宽都被赋值. 例如: :] sig1 ...

  2. 【第一季】CH05_FPGA设计Verilog基础(二)Enter a post title

    [第一季]CH05_FPGA设计Verilog基础(二) 5.1状态机设计 状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路.通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机当前状态 ...

  3. 【转】uvm 与 system verilog的理解

    http://www.cnblogs.com/loves6036/p/5779691.html 数字芯片和FPGA的验证.主要是其中的功能仿真和时序仿真. 验证中通常要搭建一个完整的测试平台和写所需要 ...

  4. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  5. Bootstrap<基础二> 网格系统

    Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 什么是网格(Grid)? 摘自维基百科: 在平面设计中,网格 ...

  6. jdbc基础 (二) 通过properties配置文件连接数据库

    csdn博文地址:jdbc基础 (二) 通过properties配置文件连接数据库 上一篇描述了对mysql数据库的简单操作,下面来看一下开发中应该如何灵活应用. 因为jdbc对数据库的驱动加载.连接 ...

  7. 将 Shiro 作为应用的权限基础 二:shiro 认证

    认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的“实体/凭证”组合便是“用户名/密码”组合. 一. ...

  8. 【.Net基础二】浅谈引用类型、值类型和装箱、拆箱

    目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 引 ...

  9. (转)新手学习System Verilog & UVM指南

    从刚接触System Verilog以及后来的VMM,OVM,UVM已经有很多年了,随着电子工业的逐步发展,国内对验证人才的需求也会急剧增加,这从各大招聘网站贴出的职位上也可以看出来,不少朋友可能想尽 ...

随机推荐

  1. kaggle-泰坦尼克号Titanic-1

    大家都熟悉的『Jack and Rose』的故事,豪华游艇倒了,大家都惊恐逃生,可是救生艇的数量有限,无法人人都有,副船长发话了『lady and kid first!』,所以是否获救其实并非随机,而 ...

  2. 用Swift实现一款天气预报APP(二)

    这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) 上篇中主要讲了界面的一些内容,这篇主要讨论网络请求,获得 ...

  3. LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS

    最强GAN图像生成器,真假难辨 论文地址: https://openreview.net/pdf?id=B1xsqj09Fm 更多样本地址: https://drive.google.com/driv ...

  4. 软件工程:java实现wordcount基本功能

    github链接:https://github.com/Nancy0611/wc 一:项目相关要求 该项目能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功 ...

  5. FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG

    发现FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG,提交的表名大小写是敏感的. 只要有一个表名字母的大小写不匹配,ORACLE就会认为是一个不认 ...

  6. rpm包的安装,查询,卸载,升级,校验,数据库重建,验证数据包

    rpm命名: 包:组成部分 主包:bind-9.7.1-1.i586.e15.rpm 子包:bind-lib-9.7.1-1.i586.e15.rpm bind-utils-9.7.1-1.i586. ...

  7. WP8.1StoreApp(WP8.1RT)---第三方启动

    8.1的协议和wp8是相互通用的 被启动: 相比较wp8而言,基本变化不大,但添加方式更直观了 1:打开Package.appxmanifest 2:切换到"声明"选项卡 3:左侧 ...

  8. TestNG参数化之@Parameters传参

    通过TestNG实现参数话常用两种方式,一种是借助 @Parameters读取testng.xml中参数,一种是使用@DataProvider注解传参. 此次主要讲解XML传参,语法:在java类中定 ...

  9. css如何去掉select原始样式

    css代码: select { /*将默认的select选择框样式清除*/ appearance: none; -moz-appearance: none; -webkit-appearance: n ...

  10. LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)

    题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...