sv_labs学习笔记——sv_lab1(System Verilog)

  • 概述
  • lab1
    • 功能简述
    • 代码分析
      • 仿真精度
      • 理解repeat(15) @(rtr_io.cb);
      • 理解$timeformat
      • 理解Input and output skews
      • 代码
    • 编译仿真注意事项
      • .do文件的书写
      • 添加时间精度
      • dve编译的时候遇见的问题

概述

首先明确实验的DUT(Design Under Test)的大致功能,然后我们再进一步进行下面的实验内容。如下图是DUT的一个基本的示意图。带仿真的是一个router(路由器),接口相关的信息图下所示。通过发送激励来观察输出是否与预期保持一致。看起来接口命名还是很清楚的,后续有需要再对DUT进行进一步的解释(因为验证我们并不一定要非常清楚这个模块的功能,但是我们需要明白接口的基本协议,也就是接口的时序,我们会在后续有关lab中给出时序图)。基本功能就是将任意一个输入口的数据送到任意一路的输出。对于该笔记,则重点放在对于相关学习过程中的容易疏漏的知识点以及相关的延申。

//router的接口信息
module router(reset_n, clock, frame_n, valid_n, din, dout, busy_n, valido_n, frameo_n);
input reset_n, clock;
input [15:0] din, frame_n, valid_n;
output [15:0] dout, valido_n, busy_n, frameo_n;

本系类所有的测试都是如下图所示的实现逻辑。

因此对于测试环境的修改只需要修改测试环境即可。


lab1

功能简述

该部分的lab就是搭建一个简单的环境,对于DUT进行一次复位操作。编写了三个.sv文件,其中有接口,测试程序以及顶层测试文件。router_test_top作为测试顶层,例化了待测试模块,接口模块,测试模块。
这里展示我们该lab需要去实现的内容以及框图。

我们知道,实现一个sv的测试平台,简单来讲需要产生激励,然后发送激励到接口,接口连接DUT与测试平台,最后在收集数据进行比较。我们这里第一步完成接口(router_io.sv)的创建,一个简单的测试程序(test.sv)的编写,以及测试环境顶层(router_test_top.sv)的搭建。该测试程序完成了对待测试模块的复位。

代码分析

仿真精度

`timescale 1ns/100ps 仿真时间单位/时间精度
这个可以理解为尺子。尺子可以量的最小的1cm,但是精度是1mm。

理解repeat(15) @(rtr_io.cb);

首先是概念的理解。这里给出一个实例

clocking dram @(posedge phi1);
inout data;
output negedge #1 address;
endclocking

时钟的上升沿表示为
@(dram); 等于 @(posedge phi1)
测试平台可以使用@rtr_io.cb来等待时钟,而省略了时钟的边沿。这里其实可以理解@rtr_io.cb的作用为向前推进仿真时间到一个时钟的上升沿。
我们可以进行下面几个测试实例来理解该功能。这里的系统时钟周期为100ns,时间单位为1ns,时钟无shew,默认时钟起始电平为低
测试程序首先修改为如下,先将仿真时间向前推进五个时钟周期,然后对相关变量进行赋值,注意这里的赋值方式。对于异步,进行阻塞赋值,同步的信号,或者是想要进行同步的信号,使用非阻塞赋值。
文件test.sv如下

/`timescale 1ns/100ps
program automatic test(router_io.TB rtr_io);initial begin//$vcdpluson; //don't need in questasim enviromentreset();end
task reset();repeat(5) @(rtr_io.cb);rtr_io.reset_n = 1'b0;rtr_io.cb.frame_n <= '1;rtr_io.cb.valid_n <= '1;#95 rtr_io.cb.reset_n <= 1'b1;repeat(5) @(rtr_io.cb);//将仿真时间向前推进一个时钟上升沿。这里重复十次
endtask: reset
endprogram: test


分析波形来看,首先时钟推进了5个上升沿。这之前所有接口的变量均为X态。信号都是logic类型,它是4值变量,初始态为x。当第五个上升沿到来之后,开始对信号进行赋值。执行rtr_io.reset_n = 1'b0;由于恰好是上沿,执行rtr_io.cb.frame_n <= '1;rtr_io.cb.valid_n <= '1;然后延时45ns,由于这时不是上升沿,不会执行赋值,然后仿真再向前推进5个时钟周期,在第一个上升沿对reset_n进行拉高操作。一共有十个上升沿。
接下来将赋值延时时间修改为105ns
得到的仿真图如下

可以看到,reset_n如我们所预期的,并没有在第六个上升沿拉高,而是在第七个,这时候一共有11个上升沿。
据此可以得到,在仿真进行的时候,@(rtr_io.cb)用来推进仿真的时间,推进方式为上升沿推进。若是在次期间有信号需要在边沿操作,则会等待,在上升沿进行执行。
注意将顶层代码时钟的初始电平改变,可能得到的波形会不同。

理解$timeformat

$timeformat(-9, 1, “ns”, 10);
$timeformat的语法如下:

$timeformat(units_number, precision_number, suffix_string, minimum_field_wdith);
  • units_number 是 0 到-15 之间的整数值,表示打印的时间值的单位:0 表示秒,-3 表示毫秒,-6 表示微秒,-9 表示纳秒, -12 表示皮秒, -15 表示飞秒;中间值也可以使用:例如-10表示以100ps为单位。其默认值为`timescalse所设置的仿真时间单位。
  • precision_number 是在打印时间值时,小数点后保留的位数。其默认值为0。
  • suffix_string 是在时间值后面打印的一个后缀字符串。其默认值为空字符串。
  • MinFieldWidth 是时间值字符串与后缀字符串合起来的这部分字符串的最小长度,若这部分字符串不足这个长度,则在这部分字符串之前补空格。其默认值为20。

$timeformat不会更改`timescale设置的的时间单位与精度,它只是更改了$write、$display、$strobe、$monitor、$fwrite、$fdisplay、$fstrobe、$fmonitor等任务在%t格式下显示时间的方式。

理解Input and output skews

lab1中添加了输入输出延时default input #1ns output #1ns;

根据博文 IC验证培训——实战SV验证学习(lab1),路桑 的解释为

input  #1ns 指的是采样时间相对时钟上升沿提前1ns,但不在波形上显示。用来模拟真实电路中的建立时间。
output #1ns指的是驱动时间相对时钟上升沿推后1ns,会在波形上显示出来。用来模拟真实电路中的传播延时。

在添加后执行sim.do文件,我们发现reset_n相对时钟上升沿推后1ns,得到的仿真图如下

代码

给出顶层代码
文件router_test_top.sv

module router_test_top;parameter simulation_cycle = 100;bit SystemClock; router_io top_io(SystemClock);test t(top_io);router dut(.reset_n   (top_io.reset_n),.clock     (top_io.clock),.din     (top_io.din),.frame_n   (top_io.frame_n),.valid_n   (top_io.valid_n),.dout      (top_io.dout),.valido_n (top_io.valido_n),.busy_n       (top_io.busy_n),.frameo_n   (top_io.frameo_n));initial begin$timeformat(-9, 1, "ns", 10);SystemClock = 0;forever begin#(simulation_cycle/2)SystemClock = ~SystemClock;endend

给出接口部分代码
文件router_io.sv

`timescale 1ns/100ps
interface router_io(input bit clock);logic      reset_n;logic [15:0]    din;logic [15:0]    frame_n;logic [15:0]    valid_n;logic [15:0]    dout;logic [15:0]   valido_n;logic [15:0]   busy_n;logic [15:0] frameo_n;clocking cb @(posedge clock);default input #1ns output #1ns;output reset_n;output din;output frame_n;output valid_n;input  dout;input  valido_n;input  frameo_n;input  busy_n;endclocking: cbmodport TB(clocking cb, output reset_n);
endinterface: router_io

test.sv文件测试代码test.sv

/`timescale 1ns/100ps
program automatic test(router_io.TB rtr_io);initial begin//$vcdpluson; //don't need in questasim enviromentreset();end
task reset();repeat(5) @(rtr_io.cb);rtr_io.reset_n = 1'b0;rtr_io.cb.frame_n <= '1;rtr_io.cb.valid_n <= '1;#95 rtr_io.cb.reset_n <= 1'b1;repeat(5) @(rtr_io.cb);//将仿真时间向前推进一个时钟上升沿。这里重复十次
endtask: reset
endprogram: test

编译仿真注意事项

.do文件的书写

使用.do文件可以批量执行命令。使得我们在修改了代码之后,不需要再使用鼠标点击的方式重新编译,仿真,添加信号等操作。
使用是将需要仿真的文件.v,.sv放在当前工程目录下即可。将其保存为sim.do,执行是使用命令do sim.do 即可省去繁琐的鼠标点击

set rtl *.v
set svtb *.sv
set testbench_name router_test_top
set sim_time 2000ns
#quietly set m_width 1920
#quietly set m_height 1080
#quietly set m_width 2560
#quietly set m_height 1660vlib work
vmap work work
vlog $rtl
vlog $svtb
vsim -t ns -novopt +notimingchecks work.$testbench_name
add wave sim:/router_test_top/top_io/*
run $sim_time
#view -undock wave -x 0 -y 0 -width $m_width -height $m_height

添加时间精度

需要加上时间精度,在test.sv以及router_io.sv文件内。否则questasim会报出如下的问题。

# ** Error (suppressible): (vsim-3009) [TSCALE] - Module 'test' does not have a timeunit/timeprecision specification in effect, but other modules do.
#Time: 0 ns  Iteration: 0  Instance: /router_test_top/t File: test.sv
# ** Error (suppressible): (vsim-3009) [TSCALE] - Module 'router_io' does not have a timeunit/timeprecision specification in effect, but other modules do.
#Time: 0 ns  Iteration: 0  Instance: /router_test_top/top_io File: router_io.sv

dve编译的时候遇见的问题

在直接make test时候,dve报错如下:

Error-[VCS_COM_UNE] Cannot find VCS compilerVCS compiler not found. Environment variable VCS_HOME (/opt/Synopsys/VCS2018/vcs/O-2018.09-SP2/linux) is selecting a directory in which there isn't a compiler '/opt/Synopsys/VCS2018/vcs/O-2018.09-SP2/linux/bin/vcs1' for a machine of this type 'linux'.Please check whether 'VCS_HOME' is incorrect; if not, see below.Perhaps vcs hasn't been installed for machine of type "linux".Or the installation has been damaged.

使用安装的时候是64位,需要在命令行加上-full64才可以

compile: vcs -l vcs.log -sverilog -full64 -debug_all $(SVTB) $(RTL)

sv_labs学习笔记——sv_lab1(System Verilog)相关推荐

  1. sv_labs学习笔记——sv_lab4(System Verilog)

    sv_labs学习笔记--sv_lab4(System Verilog) lab4 OOP encapsulation 实验概述 任务代码解析 Packat实现与理解 语法点解析 randomize( ...

  2. sv_labs学习笔记——sv_lab3(System Verilog)

    这里我们在前两个lab的基础上继续完善,搭建一个数据接受的功能.在lab2 中我们实现了相关发送信息的打印,选择发送接受的端口,完善发送时序,在这一小节中将实现对端口发送数据的回收,然后进行比较发送的 ...

  3. sv_labs学习笔记——sv_lab2(System Verilog)

    该博文在lab1的基础上,根据说明以及solution里的文件,实现了接口发送时序.简单对代码进行分析.分析的内容在文章的注释区中.对于不是很清楚的语法进行解释.最后在原文件的基础上给出增加了相关打印 ...

  4. sv_labs学习笔记 专栏说明博文目录

    栏目说明 专栏主要提供sv_labs学习过程中笔者认为比较重要的点以及相关延申.本文假设读者已经具有相关语言的背景.不会过分纠结语言本身,但会重点对于一些语言进行理解.语言的理解见笔者的另外一个专栏S ...

  5. sv_labs学习笔记——sv_lab5_下(System Verilog)

    本文延续前一篇sv_labs学习笔记--sv_lab5_上(System Verilog),进一步学习完善lab5的内容 sv_labs学习笔记--sv_lab5_下(System Verilog) ...

  6. sv_labs学习笔记——sv_lab5_上(System Verilog)

    本节将介绍lab5的第一部分,主要总结一般设计学习与思考的方式与需要着重学习的点,同时以lab5作为参考,分析数据流流向,验证组件的通信与抽象化,实现的整体思路. sv_labs学习笔记--sv_la ...

  7. 【芯片验证学习纪实】System Verilog语法(1)

    [芯片验证学习纪实]System Verilog语法(1) 继学习了FPGA设计之后,学习IC验证也有一段时间了,学习过程中参考了很多互联网上的优秀资源,在此感谢各位前辈们的无私分享!现在,利用闲暇之 ...

  8. b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一...

    1.一个完整版实例 上一次Verilog学习笔记中,我通过几个小例子,较为直观的对Verilog编程有了一些了解.这次笔记,我开始着重的系统学习Verilog编程语法基础.在我系统学习语法之前,我先用 ...

  9. 【学习笔记-FPGA】verilog语言中assign的使用

    个人笔记. assign在verilog语言中一般用于连接两个变量,将一个变量的值不断赋值给另一个变量,比如在顶层模块中调用另一模块的变量. 例: ///二级模块 module compile( in ...

最新文章

  1. 如何使得按确定和取消按纽转到两个不同的页面!
  2. 线程:volatile关键字
  3. MATLAB概率密度函数估计
  4. bash 判断 os 版本_鸿蒙OS手机将至,华为手机用户提问,老款机器能升级吗?
  5. 深入理解Kafka(4)-主题与分区
  6. 电机驱动TB6612FNG全网断货,可替代方案来了,文末送模块!
  7. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务
  8. linux测试手柄,Linux Joystick 介绍
  9. 网易游戏java_2019秋招|网易游戏一面面经(Java开发)
  10. 监管大屏系统_“警视”警务情指一体大屏可视化决策系统
  11. android倒计时的正确释放,Android 计时器和handler的正确使用方式
  12. 计算机组成原理白中英课后习题题答案
  13. Tornado IOStream
  14. html中加图片边框的,用HTML代码给图片添加边框方法
  15. Linux命令之杀掉被占用的端口号
  16. AireOS WLC配置AP Group
  17. 手机电池容量的一些基础知识
  18. html5网页宠物窝,11款融进家装的宠物窝设计 简直萌翻了!!
  19. C# Winform平台下实现自由拖拽控件
  20. php提示Notice: Undefined index解决方法

热门文章

  1. 树莓派开箱点亮(无屏幕)
  2. layui之layer根据分辨率调整全屏(js判断分辨率)
  3. 机器学习自动化 要学习什么_自动化机器学习的现状
  4. 织梦php开发tags功能开发,织梦全网最新联动筛选功能的实现(单选和多选)可显示分类的文章...
  5. 利用AXIS开发Webservice(三) —— 如何传递JavaBean和你的对象
  6. 解决VS Community“无法刷新此账户的凭证”和“无法添加此账户”的问题
  7. 入手评测:i9 11900K和r9 5900x 区别 i911900K和r95900x选哪个
  8. 2019考研上海交通大学823计算机通信网真题回忆
  9. dell服务器510系统,dellr510服务器上安系统.docx
  10. C语言多文件编译的精神内核-讲透多文件编译攻略