如何检查Verilog仿真结果
打印log显示数值信息:方便直观显示结果,知道仿真是否通过。多用于大规模仿真检查结果
$display
%d:十进制
%h:十六进制
%o:二进制
%f:十进制浮点
%t:时间格式
%s:字符串格式
%m:当前模块层次
`timescale 1ns/1ps
module testbench();
reg in1,in2;
wire out;
initial begin
#5;
$display("test display function:%d,%t",in1,$time);
end
endmodule
波形方式:方便Debug定位问题
FSDB波形
系统任务:
以下最好单独写在一个initial块中
$fsdbDumpfile(“file.fsdb”); 指定波形的文件名
$fsdbDumpvars(num,instance); 选择要保存的波形
fsdbDumpvars用法:
fsdbDumpvars(level,scope);
默认不加参数保存所有信号波形
fsdbDumpvars(0,top_module); //保存top_module下所有波形
fsdbDumpvars(2,top_module.dut); //保存dut后两个层次的波形
在仿真前必须先指定要观测的波形,才能看到信号完整的变化过程
简单地跑下流程:
mkdir lab:创建一个文件夹
gvim adder.v:写加法器代码
module adder(plus_a,plus_b,sum_out);
input [9:0] plus_a,plus_b;
output [10:0] sum_out;
assign sum_out=plus_a+plus_b;
endmodule
gvim main.v:写tb代码
module main();
reg [9:0] in1,in2;
wire [10:0] out;
adder DUT(.plus_a(in1),.plus_b(in2),.sum_out(out));
initial begin
#10;//This code is necessary
in1=10'd30;
in2=10'd27;
$display("#################lesson 4 example################ ");
$display("plus_a is%d;plus_b is%d;sum_out is%d", in1,in2,out);
#20;
in1=10'd1000;
in2=10'd900;
$display("plus_a is %d;plus_b is %d;sum_out is %d", in1,in2,out);
$display("#################################################");
#10;
$finish;
end
initial begin
$fsdbDumpfile("adder_tb.fsdb"); //记住这个文件名
$fsdbDumpvars();
end
endmodule
单独写个timescale.v
`timescale 1ns/1ps
gvim flist.f:写file list 文件,把.v吃进去
./timescale.v
./adder.v
./main.v
创建一个sh文件写脚本:gvim run_vcs.sh
//此脚本使用 /bin/bash 来解释执行
#!/bin/bash
echo "####### start running VCS ##############"
//-R 编译后直接执行
//-fsdb 使工具可识别fsdb指令
//-f flist.f 吃进flist文件
vcs -R -full64 -fsdb -f flist.f
echo "########### finish VCS #################"
给这个sh权限:
//可读可写可执行
chmod 777 ./run_vcs.sh
运行vcs:
./run_vcs.sh
如果有error会提示,然后debug。vcs运行完后打开verdi
//最后的文件名就是fsdbDumpfile中的名字
verdi -f flist.f -ssf adder_tb.fsdb