Synopsys软件基本使用方法
- [1 文件说明](#1 文件说明)
- [2 编译流程](#2 编译流程)
- [3 查看波形](#3 查看波形)
- [4 联合仿真](#4 联合仿真)
本文主要介绍Synopsys软件vcs、verdi的基本使用方法,相关文件可从 GitHub下载。
1 文件说明
-
创建verilog源文件add.v、mult.v、top.v
module add ( input signed [31:0] dina, input signed [31:0] dinb, output signed [31:0] dout ); assign dout = dina + dinb; endmodule module mult ( input signed [31:0] dina, input signed [31:0] dinb, output signed [31:0] dout ); assign dout = dina * dinb; endmodule module top ( input clk, input rstn, input signed [31:0] dina, input signed [31:0] dinb, output signed [31:0] dout ); wire signed [31:0] add_dout; wire signed [31:0] mult_dout; add add_i( .dina(dina), .dinb(dinb), .dout(add_dout) ); mult mult_i( .dina(dina), .dinb(dinb), .dout(mult_dout) ); reg signed [31:0] add_inv; reg signed [31:0] mult_inv; always @(posedge clk) begin if (!rstn) begin add_inv <= 0; mult_inv <= 0; end else begin add_inv <= -add_dout; mult_inv <= -mult_dout; end end assign dout = add_inv + mult_inv; endmodule
-
创建仿真文件tb.v
`timescale 1ns/1ns module tb; reg clk; reg rstn; reg signed [31:0] dina; reg signed [31:0] dinb; wire signed [31:0] dout; initial begin #0 begin clk = 1; rstn = 0; end #4 begin rstn = 1; end end always #2 clk = !clk; initial begin #0 begin dina <= 3; dinb <= 4; end #4 begin dina <= -5; dinb <= 16; end #8; $finish; end top top_i( .clk (clk), .rstn(rstn), .dina(dina), .dinb(dinb), .dout(dout) ); initial begin // 指定文件名称和限制文件大小(单位MB) $fsdbDumpfile("./rtl.fsdb", 32); // 导出的信号 // $fsdbDumpvars; //所有信号 $fsdbDumpvars(0, top_i); //top_i下的所有信号,包括子模块的信号 // $fsdbDumpvars(1, top_i); //top_i下的所有信号,不包括子模块的信号 // $fsdbDumpvars(2, top_i); //top_i和下一层子模块add_i和mult_i下的所有信号 end endmodule
-
创建文件流表file.list
tb.v top.v add.v mult.v
-
创建编译脚本Makefile
.PHONY: vcs sim verdi clean vcs: vcs -full64 -sverilog -debug_access+all -f file.list -timescale=1ns/1ns \ -kdb -lca -cpp g++-4.8 -cc gcc-4.8 -LDFLAGS -Wl,--no-as-needed # -full64:64位的系统需要添加 # -sverilog:识别systemverilog的语法 # -debug_access+all:生成debug所需文件 # -f file.list:将file.list中所有.v文件进行编译 # -timescale=1ns/1ns:设置仿真精度 # -kdb:生成KDB文件,仿真时生成verdi的库文件simv.daidir # -lca:支持动态数据类型 # -cpp g++-4.8 -cc gcc-4.8 -LDFLAGS -Wl,--no-as-needed:指定编译选项 sim: ./simv -verdi # -l run.log:记录终端打印信息 # -verdi:打开verdi进行动态调试 # +fsdb+functions:抓取function和task内部信号 verdi: verdi -ssf rtl.fsdb # -ssf rtl.fsdb:打开波形文件 clean: rm -rf csrc simv* *.lib *.lib++ nLint* verdi_config_file rm -rf *.log *.vpd *.fsdb* *.key *log rtl.fsdb*
2 编译流程
- 执行
make vcs
对verilog源文件进行编译,编译成功会生成simv文件 - 执行
make sim
进行仿真,仿真成功会生成rtl.fsdb文件 - 执行
make verdi
打开波形文件
3 查看波形
打开后的verdi界面如下图所示
将Instance栏中的top_i拖动到下面的波形界面添加波形信号,通过工具栏上的工具可进行缩放、移动操作,右键选择操作信号,在Set Radix可更改信号的数据显示格式,通过Set Notation可改变是否为符号数,通过Highlight可改变波形颜色。波形界面可拉出verdi界面单独显示,以此显示更多信号。
直接通过添加信号无法显示模块中的中间变量,如add_inv和mult_inv,点击菜单栏的Signal→Get Signals,选中这两个信号,点击Apply可添加到窗口中。
点击菜单栏的File→Save Signal可保存波形配置为.rc文件,关闭波形窗口后可通过工具栏重新打开一个新的窗口,点击File→Restore Signal重新加载.rc文件打开保存的配置。
4 联合仿真
如果在执行sim的参数中添加了-verdi,可进行vcs和verdi的联合调试,在完成仿真后会打开verdi窗口,可进行上述操作打开窗口并添加信号,点击工具栏的绿色箭头可开始动态仿真,再次点击绿色箭头会重置。此外,工具栏多了很多工具,可进行逐步调试。