SystemVerilog Testbench学习总结(Lab2~3)

1、对于信号几种赋值方式的区别:

1 logic [15:0] frame_n;
2
3 rtr_io.cb.frame_n <= 1;//port0=1,port1~15=0
4
5 //如果想对所有的信号赋值,用下面这种方法
6 rtr_io.cb.frame_n <= ‘1;//port0~15=1
7
8 //如果只想对信号的某一位单独赋值,用下面这种赋值方法
9 rtr_io.cb.frame_n[5] <= 1‘b0;

2、随机数方法和函数

  $urandom_range()
语法:$urandom_range(int unsigned maxval,int unsigned minval = 0);
功能:返回一个在maxval和minval之间的无符号整数

Example:

1 val = $urandom_range(7,0);
2 //等价于
3 val = $urandom_range(7);//如果minval没有指定,默认为0
4
5 //如果mixval比minval小,参数列表会自动反向
6 val = $urandom_range(0,7);//等价于上面两个例子

  $urandom()
语法:$urandom[(int seed)];
功能:产生伪随机数,每次调用时返回一个32位的无符号伪随机数;
For example:

1 bit [61:1] addr;
2 bit [3:0] number;
3
4 addr[32:1] = $urandom(254);//初始化生成器,获得一个32位的随机数
5 addr = {$urandom,$urandom};//64位随机数
6 number = $urandom & 15;//4位随机数

在lab2中,使用随机数来产生地址和payload队列的值:

1 task gen();
2     sa = $urandom;
3     da = $urandom;
4     payload.delete();//clear previous data
5     repeat($urandom_range[4,2])
6         payload.push_back($urandom);
7 endtask:gen    

3、更新仿真时间
  Pay particular attention to how you advance the clock. If in one
subroutine you advance the clock upon exiting the subroutine, then
in another subroutine you advance the clock upon entering the
subroutine, erroneous timing may result.

更新仿真时间的方式,@(在tb参数列表中例化的interface名 + clocking名):

For example:

1 @(rtr_io.cb);//单次更新时钟
2
3 repeat(10) @(rtr_io.cb);//更新10次时钟

在lab2中的时钟更新:
Example 1:

 1 initial begin
 2     $vcdpluson;
 3     run_for_n_packets = 21;
 4     reset();
 5     repeat(run_for_n_packets) begin
 6         gen();
 7         send();
 8     end
 9     repeat(10) @(rtr_io.cb);//更新10个时钟周期的仿真时间,这样做可以保证输出的数据能被观察到
10 end        

Example 2:

1 task send_addrs();
2     rtr_io.cb.frame_n[sa] <= 1‘b0;
3     for(int i=0;i<4;i++) begin
4         rtr_io.cb.din[sa] <= da[i];//i‘th bit of da
5         @(rtr_io.cb);
6     end
7 endtask:send_addrs        

Example 3:

 1 task send_payload();
 2     foreach(payload[index]) begin
 3         for(int i=0;i<8;i++) begin
 4             rtr_io.cb.din[sa] <= payload[index][i];
 5             rtr_io.cb.valid[sa] <= 1‘b0;
 6         //payload初始值为空,不停的装入数据,在装满第七位时,需要将其拉高
 7             rtr_io.cb.frame_n[sa] <= ((i == 7) && (index == (payload.size()-1)));
 8         @(rtr_io.cb);//更新仿真时间
 9         end
10     end
11     rtr_io.cb.valid_n[sa] <= 1‘b1;//最后将valid_n拉高;
12 endtask:send_payload

4、看门狗,防止deadlock的产生:
  在lab3中,get_payload需要等到frameo_n的下降沿到来以后,进而进行下一步操作,
如果直接写@(negedge rtr_io.frameo_n[sa])来等待时钟边沿的到来,存在一种潜在的可能,
就是如果代码出错,可能程序永远等不到下降沿。
For example:

1 for(i = 0; i < run_for_n_packets;i++)
2     gen();
3     fork
4         begin
5             send();
6             recv();
7         end
8 join

说明:send()和recv()两个任务本来是并行执行的,但是由于编程时,错误的将其放在了
begin...end内,变成了顺序操作。此时如果使用@(negedge rtr_io.frameo_n[sa])来检测一个新的从dut输出的数据包,
仿真将会死循环。

为了有效的避免这种情况的产生,可以加入看门狗机定时器,防止子程序超时:

 1 fork
 2     begin:wd_timer_fork
 3     fork:frameo_wd_timer
 4     @(negedge rtr_io.cb.frameo_n[sa]);
 5     begin
 6         repeat(1000) @(rtr_io.cb);
 7         $display("\n%m\n[ERROR]%t Frame signal time out!\n",$realtime);
 8         $finish;
 9     end
10     join_any:frameo_wd_timer
11     disable fork
12     end:wd_timer_fork
13 join

说明:在上面代码中,fork...join中的代码是并行执行的。
也即@(negedge rtr_io.frameo_n[sa])和其下面begin...end块中的内容是并行执行的。

fork...join_any中,只要其中任何一个子程序执行,即可跳出此模块执行后续代码,
因此,如果代码出错一直等不到 frameo_n信号下降沿的到来,时钟更新1000次后,看门狗
计数器超时,报错,此时即跳出了此模块,不会进入死循环的情况。

扩展阅读:

fork...join_none模块中,任何线程都不用执行就可以执行下面的代码。

disable fork——停止多个线程,包括从当前线程衍生出来的线程。
使用时为了防止停止过多的线程,应该使用fork...join将目标代码围起来闲置disable fork的
作用范围,如上述例子中只停止fork...join中的进程。

For another example:

 1 initial begin
 2         check_trans(tr0);    //线程0
 3         //创建一个线程来限制disable fork的作用范围
 4         fork    //线程1
 5         begin
 6             check_trans(tr1);    //线程2
 7             fork    //线程3
 8             check_trans(tr2);    //线程4
 9             join
10             //停止线程1-4,单独保留线程0
11             #(TIME_OUT/2) disable fork;
12         end
13         join
14 end
15
16
17         
时间: 2024-10-10 13:13:17

SystemVerilog Testbench学习总结(Lab2~3)的相关文章

SystemVerilog Testbench学习总结(Lab1)

1.ntb_template -t router router.v 执行该命令会生成3个文件(命令中router.v是dut) a.router.if.vrh,包含信号端口的方向(相对于dut).位宽,可将此信号加上类型(logic或者bit),去掉方向,作为interface中的信号声明.将此信号去掉位宽来作为interface中clocking模块中同步信号的声明: b.router.test_top 此文件中会产生仿真时钟信号,接口例化等信号,仿真时钟可直接拷贝到Test Harness

ucore Lab2学习:Virtual Memory

我觉得这个lab最主要就是理解好Virtual memory是怎么map到physical memory的.在CSAPP里面了,通过MMU和TLB电路来实现转换.x86中是用的2级page table. 还要理解stack frame(譬如lab1的project 4.1.1):switch_to_u2k和swith_to_k2u.有2种方法.一个是通过改写stackframe的TSS.一个是直接用asm改写gate descriptor. CSAPP讲了:每一个process有一个对应的VM和

systemverilog学习(1)基础

一:认识sv 1:关键字 verification,assertion,coverage,功能验证,simulation技术,OOP属性 2:主要内容 (1)verification plan and environment,验证计划,目标 (2)sv constructs:sv的语法 (3)sv testbench 的架构 (4)Interface (5)OOP (6)randomization:随机化 (7)Threads:语句如何执行 (8)Interprocess communicati

如何学习FPGA(转)

原文来自:http://m.blog.csdn.net/k331922164/article/details/44626989 一.入门首先要掌握HDL(HDL=verilog+VHDL). 第一句话是:还没学数电的先学数电.然后你可以选择verilog或者VHDL,有C语言基础的,建议选择VHDL.因为verilog太像C了,很容易混淆,最后你会发现,你花了大量时间去区分这两种语言,而不是在学习如何使用它.当然,你思维能转得过来,也可以选verilog,毕竟在国内verilog用得比较多. 接

学习FPGA100个值得注意的要点(转载)

1.FPGA不是编程语言,而是一种可综合的硬件描述语言.2.Verilog 支持两种进程initial和always进程3.阻塞与非阻塞指的相对于进程本身而言的.4.使用进程模块的电路类型:                       组合电路-----对组合逻辑中使用的所有输入敏感                      例子:                      [email protected](a or b or sel)                      时序电路---

systemverilog之OOP

what is oop terminology an example class default methods for classes static attibute assigment and copying inheritance polymorphism why oop? 1.    helps in creating and maintaining large testbench: You can creat complex data types and tie them togeth

VHDL学习之路——工具篇——modelsim-win64-10.1c的安装和基本使用

现在好多同学的操作系统都是64位的win8或者win10系统,在学习vhdl,安装软件时可能会遇到一些问题,下面我将介绍一些软件的安装以及基本使用的知识,希望能够帮到大家~ (1)modelsim-win64-10.1c的安装 我使用的系统是win10 64位专业版,在我的机器上成功安装并运行了modelsim,下面我说一下安装方法 1        运行modelsim-win64-10.1c-se.exe,安装软件(软件和破解包下载地址:http://pan.baidu.com/s/1kUz

ucore lab0的学习: 2.6 了解 ucore 编程方法

今天开始学习ucore的lab. 按照lab0的文档,显示介绍了80386的4个工作模式:real-address mode, protected mode, SMM mode, virtual 8086 mode. ia-32-architectures-software-developer-system-programming-manual-VOL3_Feb2014中的Figure 2-3. Transitions Among the Processor's Operating Modes是

Verilog与SystemVerilog编程陷阱:如何避免101个常犯的编码错误

这篇是计算机类的优质预售推荐>>>><Verilog与SystemVerilog编程陷阱:如何避免101个常犯的编码错误> 编辑推荐 纠错式学习,从"陷阱"中学习编程,加深对语言本身的理解. 逆向式学习,从错误中学习避免错误的方法,让读者写出更好的代码. 案例式学习,将101个"陷阱"分类汇编,以针对性案例引导读者掌握编程要点. 译者序 译者序 随着电子设计自动化(Electronic Design Automation,EDA)