IC前端工程师编译仿真使用工具(VCS+Verdi)

本文详细介绍了Synopsys的VCS编译器的使用,涉及makefile配置、编译过程、仿真参数设置,如fsdb波形生成、saif文件生成用于综合分析,以及如何在Verdi工具中进行波形查看和调试。
摘要由CSDN通过智能技术生成

VCS的使用

是Synoposys家的编译型Verilog模拟器,可编译 C、C++、Verilog、SystemVerilog 等文件,编译后生成 simv 可执行文件进行仿真。

1 VCS(Verilog Compiler Simulator)的makefile文件

VCS 仿真过程:编译(vcs_compile) + 仿真(vcs_simulate)。

#! /bin/csh 
.PHONY: vcs cmp run clean verdi
top = tb_filter_top
cmp:
        vcs -full64 \
    +notimingchecks \
    -sverilog \
    -debug_access \
    -f ./testbench.f \
    -f ./vcs_files.f \
    -l bitlet.log \
    -top $(top) \
        -fsdb \
        -R        
vcs:
        ./simv +vcs+lic+wait -l bitlet.simv.log

clean:
        @-rm -rf *.log *.fsdb simv csrc ucli.key *.conf *.saif verdiLog simv* stack*

verdi:
        verdi -sv +systemverilogext+sv -f vcs_files.f -f testbench.f -top $(top) -ssf $(top).fsdb
#-rcFile ~/novas.rc&

run: cmp vcs

解释:

  1. .PHONY后面跟的目标都被称为伪目标,也就是说我们 make 命令后面跟的参数如果出现在.PHONY 定义的伪目标中,那就直接在Makefile中就执行伪目标的依赖和命令。不管Makefile同级目录下是否有该伪目标同名的文件,即使有也不会产生冲突。另一个就是提高执行makefile时的效率。

  2. cmp 是vcs的编译参数设置,testbench.f和vcs_files.f里放的是与编译相关的所有文件,包括testbench文件,top就是testbench文件的顶层名字

VCS常用编译参数说明:

-full64

在 64-bit 模式下编译、仿真,用于 64 位操作系统

-notice

详细的显示编译信息

-debug_all

仿真时可以使用 UCLI 接口,可以设置 value、time 断点。可以输出 fsdb/vpd 波形,可以使用 Verdi 和 DVE 波形查看工具。可以被下列参数选项替代:-debug_acc+all

-j8

指定编译器可并行编译的进程数为 8

-timescale=1ns/1ps

指定仿真时间单位与精度,RTL 设计中没有指定 timescale 时,使用此设置

+plusarg_save

使能传参功能。simv 仿真时可将具体数值传递给设计中的相关变量

+libext+.v+.V+.sv+.svh

识别 .v、.sv 等多种格式的设计文件

-sverilog

支持 SystemVerilog 编译

+memcbk

使能多维数组变量 (Memory 类型) 的回调。配合 UCLI 接口,设置波形打印的信号范围时,指定 "+all" 选项,可以查看多维数组变量的波形

-P <path/novas.tab> \<path/pli.a>

指定使用的 PLI 表文件与库文件 pli.a 。其中 .tab 文件可以理解为 PLI 接口说明,pli.a 可以理解为系统函数库。当然也可以指定用户自定义的 table 文件和自定义的函数库。

-cpp /usr/bin/g++-4.4

指定 VCS 可识别的 g++ 版本

-cc /usr/bin/gcc-4.4

指定 VCS 可识别的 gcc 版本

-f

指定包含所有设计文件列表的文件名,文件中可包括源代码文件的路径名称,和编译选项参数等。

-top test

设置顶层模块为 test。因为仿真包括 testbench,所以要设置最顶层的 testbench 为 top design。

-l vcs_com.log

输出 VCS 编译的 log 至文件 vcs_com.log 中

2 testbench文件需要加入的部分

2.1 产生fsdb波形文件

对于用于仿真的testbench,需要额外建立一个 initial 块,调用产生有关 fsdb 格式的波形文件:

  • 首先调用 fsdbDumpfile 函数,产生一个叫 .fsdb 的波形文件

  • 然后调用 fsdbDumpvars 函数,声明需要保存那些信号的波形,括号内不加任何参数,则默认全部保存。

`define FSDB
module tb_filter_top;
`ifdef FSDB
initial begin
    $fsdbDumpfile("tb_filter_top.fsdb");
    $fsdbDumpvars(0,tb_filter_top);
    $fsdbDumpMDA();
end
`endif
2.1.1 fsdbDumpvars 函数的使用(https://blog.csdn.net/weixin_45270982/article/details/114155823)

1. $fsdbDumpfile

指定波形文件名,第二个参数可选择用来限制波形的大小(MB)。

其中文件名可能被$fsdbDumpvars覆盖,所以这俩最好设置为同一个名字

$fsdbDumpfile(fsdb_name[,limit_size])
$fsdbDumpfile(“tb_top.fsdb”,10240);

2. $fsdbDumpvars

$fsdbDumpvars([depth, instance][, “option”])
$fsdbDumpvars(0,tb_filter_top);

含义: depth表示要加载波形的层次;0表示当前instance下的所有变量以及其它module实例的波形,1表示当前instance中的变量的波形,不包括当前instance中的其它module实例的波形,2表示包含当前instance以及其中的第一级子instance的波形;以此类推。 instance指定要加载波形的module名。 option加载波形的选项,如: +IO_Only – 只加载IO port信号; +Reg_Only – 只加载reg类型信号; +mda – 加载memory和MDA信号; +packedmda – 加载packed MDA; +struct – 加载structs; +parameter – 加载parameter; +fsdbfile+filename – 指定fsdb文件名字。

3. $fsdbDumpon/$fsdbDumpoff

$fsdbDumpon/$fsdbDumpoff([“option”])

含义: 控制波形加载的开始和结束; $fsdbDumpoff之后,将停止记录信号值的变化,直到$fsdbDumpon,从当前时刻开始记录信号值的变化。 option—选项,如: +fsdbfile+filename – 指定将特定文件的波形加载打开与关闭,如果不指定,则默认指当前仿真所有的波形文件;

4. $fsdbDumpMDA

fsdb dump波形时会记录二维数组2D array signal的值,便于在verdi中debug查memory内部信号。

$fsdbDumpMDA()

5. $fsdbAutoSwitchDumpfile

$fsdbAutoSwitchDumpfile(file_size, “fsdb_name”, number_of_files[, “log_file_name”,“+fsdb+no_overwrite”])

含义: 当波形的大小达到限制后自动以一个新的波形文件起始加载波形; 在所有的波形文件加载完成后,会创建一个virtual FSDB文件,查看波形时只需要加载此文件就可以合并所有的波形文件。 file_size—波形文件大小限制,单位为MB,最小为10M,若值小于10M则默认10M; file_name—波形文件的名字,在实际加载波形时,文件名为file_name_000.fsdb file_name_001.fsdb…; number_of_files—最多可以加载多少个file_size这么大的波形文件,如果写为0,则默认没有限制; log_file_name—指定log文件的名字; +fsdb+no_overwrite—当number_of_files限制的个数达到时停止dump波形;

6. $fsdbDumpflush

在仿真过程中强制将信号值加载到波形中,便于在仿真过程中查看波形;

$fsdbDumpflush()

7. $fsdbDumpFinish

在仿真过程中调用,停止dump波形;

$fsdbDumpFinish()

8. $fsdbSwitchDumpfile

$fsdbSwitchDumpfile(“new_file_name”[, “+fsdbfile+src_file”])

关闭现有的波形文件,以一个新的文件名开始加载波形; new_file_name—创建一个新的波形文件,将波形加载到这个文件中; +fsdbfile+src_file—指定要停止加载并关闭的波形文件, 这个参数不指定时,将默认使用当前正在加载的波形文件;

9. $fsdbDumpvarsByFile

$fsdbDumpvarsByFile(“text_file_name”[, “option”])

类似于$fsdbDumpvars,这个方法支持将需要加载波形的instance写在文件中。 text_file_name—文本文件,指定要dump波形的instance; option—同$fsdbDumpvars中的option参数;

$fsdbDumpvarsByFile("xxx.xxx.dump.vh"); +all 1 tb_top +all 0 tb_top.xxx

2.1.2 产生saif文件用于综合分析功耗

参考文章:https://blog.csdn.net/l471094842/article/details/103631265

RTL backward SAIF文件的生成

用vcs生成,在testbench文件中需要添加以下话语

always @(posedge clk)begin
    if(input_counter==TEST_NUMBER) begin
        $display("simulation completed!");
        $toggle_stop();
        $toggle_report("tb_filter_top.saif", 1.0e-9, "tb_filter_top");
        $finish;
    end
end
initial
begin

    $set_toggle_region(tb_filter_top.u_preprocessing_top);
    $toggle_start();
    rst_n <= 1'b0;  
    #(30*clock_freq);
    #5;
    rst_n <= 1'b1; 
    #(1000000*clock_freq);
    #(1000000*clock_freq);
    #(1000000*clock_freq);
    $finish;
                
end        

$set_toggle_region(tb_filter_top.u_preprocessing_top);即为产生到对应子模块的saif文件

·首先是PLI。使用VCS产生SAIF文件,需要用到程序设计语言接口(programming language interface,PLI)。通过PLI监测节点的翻转,得到节点的翻转率。主要需要下面的系统任务:

    $set_gate_level_monitoring ( on|off|rtl_on);

    $set_toggle_region (obj);

    $read_ rtl_ saif(rtl_saif_file_name,tb_pathname);

    $read_ lib_ saif(lib_saif_file_name);

    $toggle_start;

    $toggle_stop;

    $toggle_reset();

    $toggle_report(file_name,type,unit);

  · RTL.v就是设计源文件了,然后RTL forward SAIF文件在前面也讲过了,这里就从略。

  · 最后是testbench。testbench中调用RTL设计、调用一下上述的PLI系统函数、调用RTL forward SAIF文件等。一个简单的示例testbench文件如下所示:

module testbench;

top instl (a, b, c,s);//例化顶层设计

initial begin

$read_rtl_saif ("myrtl.saif")

$set_toggle_region (u1);

$toggle_start;

#120 a=0;

#STEP in_a=temp_in_a;

······

$toggle_stop;

$toggle_report("rtl.saif",1.0e-9,"top");

end

endmodule

上面的测试平台中,用了系统任务程序$read_rtl_saif ("myrtl. saif"),该命令读入综合不变物体文件——RTL forward SAIF。因此,仿真时,仿真器仅仅监视这些综合不变物体的开关行为。向量中$set_toggle_region (u1)命令选择要监视的模块。$toggle_start$toggle_stop命令用于控制监视的起始和终止时间。$toggle_report("rtl. saif",1. 0e-9,"top")命令输出SAIF信息到指定的文件。

  一起都准备就绪了,下面就可以使用VCS运行仿真:

    vcs -R rtl. v testbench. v

注意,这里我们进行的是RTL设计文件的仿真,仿真完成后,就可以得到rtl.saif 文件,这个文件就是RTL backward SAIF文件。

Verdi常用快捷键

参考:https://www.cnblogs.com/wt-seu/p/10422967.html

1 Verdi代码界面的基本操作小结

1.1 添加波形

在vedi左侧层次浏览器窗格按g,可以进行选择添加波形

ctrl+A可以全选当前模块下的所有信号

点击Apply即可完成添加

1.2 快速定位某个模块

在vedi左侧层次浏览器窗格鼠标右键 -> Show Search/Filter(CTRL+F) -> 输入字符串搜索(例如*ircu*)-> 回车(多按几次)

1.3 搜索源代码

在源代码框按

  • Find Scope(Shift+S) #搜索模块的名字

  • Find Signal/Instance/instport (Shift+A) #搜索模块中的信号

  • find string(/)

1.4 Makefile中的启动verdi时指定波形和rc

top = tb_filter_top
verdi:
        verdi -sv +systemverilogext+sv -f vcs_files.f -f testbench.f -top $(top) -ssf $(top).fsdb

verdi参数

-ssf 指定波形FSDB文件

-sswr 指定波形restore文件,可以将已保存的信号恢复

2 Verdi看波形的基本操作小结

2.1 快捷键:(大写字母=Shift+小写)

g get, signlas添加信号,显示波形 n next, Search Forward选定信号按指定的值(上升沿,下降沿,both,指定Value)向前跳转 N 与n功能相同,方向向后 c color,调整所选信号的波形显示颜色,线的粗细和类型,非常方便Debug f full, Zoom All波形全部显示 z Zoom Out波形缩小,一般配合鼠标放大非常方便 Z Zoom In 波形放大 l last view,上次波形位置,相当于Vim里的``或'' L 重新加载波形或设计文件,这个很方便,在新一次仿真完成之后Roload即可 b begin移动Cursor到波形开头 e end移动Cursor到波形结尾 r restore signals 保存波形信号列表 h hierarchy显示信号的绝对路径 H Highlight(开关)是否高亮显示所选信号 m move将信号移动到左边信号列表的黄线位置 Delete 删除所选信号 Ctrl+Right Arrow 向右移动半屏 Ctrl+Left Arrow 向左移动半屏

鼠标中键选择位置+鼠标左键选择信号+m键 移动信号

2.2 鼠标:

左键:用于选择信号 右键:调出菜单 中间:单击移动黄线,拖动信号可移动位置排列顺序 滑轮:上下滚屏,按住shift键可实现左右滚屏 左键圈定波形范围:按选定缩放 双击信号波形: 跳转到代码,并用绿色高亮该信号 双击信号:按位展开(expand),Struct展开下一层。再双击折叠(collapse) 右键信号名->Bus Operations->Expand as Sub-bus->可以按指定位宽展开,比如512bits的信号分成4个128的,方便查看

菜单栏中的By:可以选择Search不同的值:Any Change, Rising Edge, Falling Edge, Bus Value等

信号可以分组,组合信号都可以Rename 右键 Add Blank 可以让信号分组看起来更清晰

定位signal的值进行训练,可以用waveform的Set Search Value和Set Search Constraint

2.3 波形属性调整:

改变波形进制:十进制,按住ALT,再依次按 W+R+D;二进制,按住ALT,再依次按 W+R+B

改变波形无符号和有符号: 无符号,按住ALT,再依次按W+N+U;有符号2的补码,按住ALT,再按W+N+2

  • 12
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanberwer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值