【VCS】(2)VCS调试基础(DVE)

文章介绍了VCS仿真器的调试方法,包括使用Verilog的SystemTask如$display和$monitor进行调试,以及通过DVE图形界面和Verdi进行更高级的调试。此外,还提到了UCLI命令行调试、波形文件格式如VCD和VPD,以及如何使用BusBuilderTool来查看总线信号。文中以Lab示例展示了基础的源代码和测试bench,并讲解了如何调用C程序利用DPI进行交互。
摘要由CSDN通过智能技术生成

VCS调试方法

  1. Verilog/SV 的系统函数 (如 display、moniter 语句等)
  2. VSC UCLI ( User Command Line)命令行调试模式 (不建议使用)
  3. VCS DVE (GUI) 图像化界面调试 ( Verdi 是用于调试的工具,该工具不会进行编译和仿真)
    (Verdi是一个功能强大的 debug工具,可以配合不同的仿真软件进行debug,很多企业常用的就是 VCS+Verdi 的方式进行代码的仿真与检查。Verdi使用情形主要是IC验证工程师(Debug),IC设计工程师(Review)。)

Verilog System Task for Debugging

Debug visibility:

  • $display :Prints formatted message to console
  • $strobe:Like $ display except printing is delayed until all events in the current time step have executed
  • $monitor:Monitor signals listed and prints formatted message whenever one of the listed signals changes
  • $time:Returns current simulation time as a 64bits integer
    (在VCS中,display 和 monitor 所处的仿真队列是不同的,display 输出的是变量在赋值前的值,而 moniter 输出的是变量赋值后的值)

Stopping simulation:

  • $stop:Halts simulation like a breakpoint
  • $finish:Halts simulation and terminated the simulation session

Simulation stimulus and reference:

  • $readmemh:Reads ASCII data from a disk file. Each digit is hexadecimal.
  • $readmemb:Reads ASCII data from a disk file.Each digit is binary.
    (用于RAM、ROM 或者是 FIFO,将文件中的内容读入到这些存储单元中,用作初始化数据)

在这里插入图片描述

UCLI debugger

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DVE

DVE ,Discovery Visual Environmental
在这里插入图片描述

基本界面

在这里插入图片描述

启动命令

Interactiove mode下的启动:

# Method 1
$ vcs source.v -R -gui -debug_all
# -R	Starts DVE immediately after compliation(optional)
# -gui	Enables DVE
# -debug_all	Enables command line debug including line tracing 

# Method 2
$ ./simv -gui
# -gui	Starts DVE from existing simulation executable

Post-Process Mode下的启动:

在这里插入图片描述

VCD,Value Change Dump (Dump是输出、转存的意思)是波形文件,其数据量很大,vpd 是在 vcd 的基础上进行压缩,使得波形文件占用的内存空间更小。

Verdi 使用的波形文件格式是 fsdb(Fast Singnal Database),也是一种压缩格式的波形文件。

Modelsim 的波形文件则是 WLF格式(Wave Log File)

信号比较功能

在这里插入图片描述
读入两个波形文件,然后进行比较,会显出不同的地方。

Bus Builder Tool

以总线的形式显示信号:
在这里插入图片描述
比如,一个计数器的输出是 4bit,每个 bit 一条信号线单独显示的时候,不容易判断其输出值到底是多少,这个时候就可以将其设为总线,就可以看到输出的值。

Lab示例

源文件

基础的源文件是 fsm_moore.v 和 fsm_top.v,其中后者是 testbench。

//----------------------------
//FileName	: fsm_moore.v
//Author	: JinYawei	
//Date		: 2023-07-21
//----------------------------

//`define INC_COUNTER
//`include "global_define.vh"
`timescale 1ns/1ns

module fsm_moore(
  // Inputs
  input	clk,
  input	rst_n,
  // Outputs
  output reg [3:0] dout,
  output reg [2:0] q
);

//------ Parameter define ------------
  parameter [1:0] idle = 2'd0,
		  s1   = 2'd1,
		  s2   = 2'd2,
		  s3   = 2'd3;

  reg [1:0] state,next;
//-------------------------------------

//------- State convert ---------------
  always @ (posedge clk,negedge rst_n)
  if (!rst_n) state <= idle;
  else	      state <= next;
//-------------------------------------

//------- State decode & output -------
  always @ (*) begin
    next = idle;
    dout = 4'd0;
    case (state)
	idle: begin
	  dout = 4'd0;
	  next = s1;
	end

	s1: begin
	  dout = 4'd1;
	  next = s2;
	end

	s2: begin
	  dout = 4'd2;
	  next = s3;
	end

	s3: begin
	  dout = 4'd9;
	  next = idle;
	end
    endcase
end

  // counter
  always @ (posedge clk,negedge rst_n) begin
	if (!rst_n) q <= 3'd0;
	`ifdef INC_COUNTER
	else	    q <= q + 3'd1;
	`else
	else	    q <= q - 3'd1;	
	`endif
  end
//-------------------------------------

endmodule
//---------------------------------------------
//File Name	: fsm_top.v (fsm_moore.sv)
//Data		: 2023-07-21
//---------------------------------------------
`timescale 1ns/1ns

module fsm_top;
	reg clk;
	reg rst_n;
	wire [3:0] dout;
	wire [2:0] q;

	// Define the run number with initial parameter
	integer run_num = 20;

	// Define an array
	reg [7:0] mem [0:15];
	integer i;

	// Generate clk
	initial begin
		clk = 1'b0;
		forever #5 clk = ~clk;
	end

	// Generate rst_n
	initial begin
		// if {$value$plusargs("run_num=%0d", run_num)} begin
		//    $display ("The run_num is %0d ",run_num );
		// end else begin
		//    $display(Sorry! Can not ger run_num");
		// end
		
		// Call task
		print_message(); 

		rst_n = 1'b1;
		repeat (2) @ (posedge clk);
		rst_n = 1'b0;			// After 2 posedge clk,rst_n = 0
		repeat (2) @ (posedge clk);
		rst_n = 1'b1;
		repeat (run_num) @ (posedge clk);
		
		$display("Finish Simulation @ [%0t]", $time);
		$finish;	
	end
	
	//$readmemh{} test
	//initial begin
	//	$readmemh{"./src,txt",mem}
	//
	//	for(i=0;i<10;i=i+1) begin
	//		$dislpay{"mem[%2d] = %0d",i, mem[i]}
	//	end
	//end

	// DPI test
	import "DPI" function void hello(string str);
	
	initial begin
		hello("hello SystemVerilog");
	end
	
	
	// Instance the DUT
	fsm_moore fsm_moore(
		.clk  (clk  ),
		.rst_n(rst_n),
		.dout (dout ),
		.q    (q    )
	);

	// Dump vpd file
	initial begin
	$vcdplusdeltacycleon();
	$vcdplusglitchon();
	`ifdef DUMP_ON
		$vcdpluson();
		//$vcdpluson(fsm_top,fsm_moore);
		//$vcdpluson(0,fsm_top);
		//$vcdpluson(1,fsm_top);
		//$vcdpluson(2,fsm_top);
	`endif
	end

	task automatic print_message;
		reg [3:0] a, b;
		begin
			a = 1;
			$display("a = %0d",a);
			b = 2;
			$display("b = %0d",b);
		end
	endtask
endmodule // fsm_moore

基本编译和运行

编译指令:

 vcs ./fsm_moore.v ./fsm_top.v +v2k -debug_all -gui
# -gui 表示run的时候可以使用DVE图形化界面 (Enable DVE at runtime)

仿真指令:

./simv -gui &

打开DVE,添加波形之后的界面如下:
可以看到没有波形信号,因为还没有执行仿真。

在这里插入图片描述

F5执行仿真之后得到的内容如下:
在这里插入图片描述

timescale问题

第一次编译的时候存在的一个问题:
在这里插入图片描述
在 fsm_moore 设计文件中添加了 timescale之后,就没有该问题的,这应该是和编译器本身有关,使用 Modelsim 的时候就不需要这样做。
这里如果不想再源代码中定义,也可以在编译的时候作为一个编译选项。后续基于 Makefile 的实现就将其放在了 vcs 编译指令中。

DVE界面操作

参考线

在这里插入图片描述

分组

在这里插入图片描述
在这里插入图片描述

查找信号值

在这里插入图片描述

信号比较

在这里插入图片描述

对比结果如下:

在这里插入图片描述

单步调试

在这里插入图片描述

set bus

选中信号线,然后右键 >> set bus
在这里插入图片描述
在这里插入图片描述

波形显示结果如下:
在这里插入图片描述

调用 C 程序

在VCS中,DPI(Direct Programming Interface)是一种机制,用于在Verilog和C/C++代码之间进行互操作。DPI允许从Verilog代码中直接调用C/C++函数,并允许C/C++代码直接访问Verilog模块的内部信号和状态。

DPI的主要用途是为仿真器提供更高级别的功能和控制,并将仿真器与其他软件工具进行集成。使用DPI,用户可以通过C/C++代码实现复杂的仿真和调试功能,并将其集成到仿真器中。DPI还可以用于与其他工具进行交互,例如从仿真器中调用外部库或程序,或将仿真器的结果传输到其他工具中进行分析。

在VCS中,DPI函数定义在C/C++代码中,并通过特殊的DPI导出声明与Verilog代码进行关联。这使得Verilog代码可以直接调用DPI函数,而C/C++代码可以访问Verilog模块的内部信号和状态。

PLI(Programming Language Interface)的功能和DPI一样,但是DPI是SystemVerilog中的新机制,而PLI是Verilog中的旧机制。DPI提供了更多的功能和灵活性,而PLI则比较受限制,DPI更适合于处理多个实例的仿真和调试问题。

  1. C语言函数如下:
#include<stdio.h>
#include"svdpi.h"		// 使用DPI功能必须包含的头文件

void hello(char* str)
{
	printf {"%s\n",str};
}
  1. Verilog中调用该函数:
    在这里插入图片描述
    import关键字告诉编译器通过DPI调用外部函数。

  2. 编译指令

vcs ./fsm_top.v ./hello.c ./fsm_moore.v -sverilog +v2k -debug_all

# 增加C语言的源文件
# 增加 -sverilog 选项,因为DPI是SV的功能

在这里插入图片描述

  1. 执行仿真

在这里插入图片描述

1入门 5 基本要求: 5 启用调试 5 编译时间选项 6 必要文件 6 调用DVE 7 64位技术支持平台 8 后台处理程序: 8 交互式界面 9 脚本命令(Scripts): 9 DVE的日志文件 10 在命令行运行仿真 10 DVEVCS, SystemVerilog, 和NTB (OV 和 SV) 10 VCS MX和VHDL 11 检查点还原的方法 12 C,C++,和System C代码 12 在GUI界面运行仿真 13 后台处理程序(Post-processing) 13 创建并且运行一个交互式的会话 14 运行仿真 15 工具栏的应用 16 模拟器(Simulator)菜单命令的应用 17 命令行的应用 18 保存会话或布局图 18 保存一个布局图会话 20 载入已保存的会话(session) 20 关闭数据库 20 退出DVE 21 2 图形化界面应用 22 DVE窗口属性概述 22 DVE窗格(panes) 23 管理DVE窗口 23 管理目标窗格 24 停放与移除窗口和窗格 25 拖拽和删除一个已停放的窗口 25 菜单栏和工具栏的应用 26 菜单栏参考 27 文件菜单 28 编辑菜单 29 视图查看菜单 30 仿真菜单 32 信号菜单 34 作用域菜单 36 追踪菜单 37 窗口 38 信号 39 模拟器 39 时间操作 40 扩大或缩小 41 扩大或缩小和变动记录 41 上下文记录命令菜单的应用 42 设置显示的首选项(Preferences) 42 自定义显示 42 3 使用层次数据和信号群组窗格 49 层次窗格 49 给信号赋值 50 4 使用源窗口 51 管理交互仿真中的断点 51 控制源窗口中的行断点 51 在对话框中管理断点 52 行断点 52 时间断点 53 信号断点 54 断言断点 55 任务/函数断点 56 编辑断点 57 5 运用波形窗口 58 建立目标窗口 58 设置波形窗口首选项 58 重命名信号组 60 过滤信号 60 添加信号分离器 60 设置复制信号的显示 60 创建一个用户定义基数 61 管理用户定义基数 61 导入和导出一个用户定义基数 62 运用波形窗 62 制定波形显示 63 指针和标记 64 使用指针 64 运用标记 65 移动,隐藏和删除标记 67 扩展和收缩波形信号 68 在图像窗中搜索 68 比较信号,域和组 68 建立总线并设置表达式 70 使用总线/表达式对话框 70 总线/表达式列表框 71 显示/隐藏细目表格 71 创建一个总线 72 修改总线成分 73 管理表达式列表 73 移位信号 74 8 断言与覆盖率 75 SV断言的编译 75 断言结果的观察 75 显示标准的设置 76 断言的调试 77 观察波形窗口中断言的失效 78 观察断言失效时间增量 79 源代码的定位 80 9 动态驱动和载入的跟踪 81 跟踪功能 82 支持的功能 83 不支持的功能 83 Vera的功能 83 跟踪驱动程序 84 跟踪载入 85 Vera的功能 86
VCS DVE(Version Control System Design and Verification Environment)是一个用于版本控制系统设计和验证环境的工具。以下是一些简要的使用教程: 1. 安装VCS DVE:首先,你需要从官方网站上下载并安装VCS DVE工具。根据你的操作系统选择合适的版本。 2. 创建工程:打开VCS DVE并创建一个新的工程。你可以指定工程的名称和存储位置。 3. 导入设计文件:将你的设计文件导入到VCS DVE中。这些文件可以是Verilog或SystemVerilog格式的。 4. 设计规约:在设计文件中添加适当的规约来描述设计行为。你可以使用SystemVerilog Assertions(SVA)或其他验证语言来定义规约。 5. 编写测试用例:创建测试用例来验证设计的正确性。这些测试用例应该覆盖设计的各个方面,包括各种边界条件和异常情况。 6. 运行仿真:使用VCS DVE的仿真功能来运行测试用例。你可以选择不同的仿真选项,如波形查看、代码覆盖率分析等。 7. 分析结果:分析仿真结果并检查设计是否满足规约和预期行为。你可以使用VCS DVE提供的调试工具来帮助定位问题。 8. 优化设计:如果发现设计存在问题或不满足要求,你可以进行优化或修改,然后重新运行仿真和分析。 以上仅是一个简要的使用教程,VCS DVE是一个功能强大的工具,可以在设计和验证过程中发挥重要作用。对于更详细的教程和指南,你可以参考VCS DVE的官方文档或相关教程资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值