所用Linux系统为openSUSE64位,软件为VCS2012
在Linux下对verilogHDL进行功能仿真时非常必要的,下面提供两种常见方式。
1.脚本方式
1)建立工作文件夹pre_sim,并将tb文件和所有.v文件复制进入此文件夹
mkdir pre_sim
2)修改testbench文件
为输出波形文件,在testbench文件中加入如下语句
initial begin
$dumpfile("counter.vcd"); //待输出的波形文件名,可更改
$dumpvars(0,u0); //u0为testbench中实例化的顶层文件名称,注意根据实际情况修改该名字
end
initial #1000 $finish; //仿真电路的时间
保存文件
本次所用文件如下
testbench.v(实际文件名为tb_gao.v)
module counter_testbench () ;
wire [3:0] out;
reg clk;
reg reset;
counter u0 (
.out (out[3:0]),
.reset (reset),
.clk (clk)
);
initial begin
clk = 1'b0;
forever #10 clk = ~clk;
end
initial begin
reset = 1'b0;
#4 reset = 1'b1;
#4 reset = 1'b0;
end
initial begin
$dumpfile("counter.vcd");
$dumpvars(0,u0);
end
initial #1000 $finish;
endmodule
counter.v
module counter ( out, clk, reset ) ;
input clk, reset;
output [3:0] out;
reg [3:0] out;
always @(posedge clk or posedge reset) begin
if (reset) begin
// reset
out <= 4'b0;
end
else begin
out <= out + 1'b1;
end
end
wire clk_out;
clk_half u0(
.clk_in(clk)
,.rst(reset)
,.clk_out(clk_out)
);
endmodule
clk_half.v
module clk_half(
clk_in
,rst
,clk_out
);
input clk_in;
input rst;
output reg clk_out;
always @(posedge clk_in or posedge rst) begin
if (rst) begin
// reset
clk_out <= 0;
end
else begin
clk_out <= !clk_out;
end
end
endmodule
3)在vcs.scr文件中写入如下内容
vcs -R tb_gao.v counter.v clk_half.v +v2k +define+RTL_SAIF
其中tb_gao.v为testbench文件,counter.v、clk_half.v为工程文件,注意要把所有的工程.v文件都添加进去
保存文件
4)在终端运行vcs.scr脚本文件
在终端中输入
source vcs.scr
等待程序编译,如有报错则按照位置修改错误,直至仿真完成
5)查看波形
在终端中输入
dve
打开波形文件,File->open database,打开.vcd文件
在Hierarchy界面中选择要查看的信号,右键New Wave View即可
2.命令行方式
1)新建工作文件夹vcs_test,将所有的工程文件与tb文件复制入
testbench中可以没有在脚本文件中添加的函数,一般的tb文件就可以
2)运行vcs
在终端中输入
vcs -V -R tb_gao.v counter.v clk_half.v -o simv -gui -debug_pp
-V:Verbose模式,打印vcs在运行的过程中执行的C Compiler汇编器和链接器的指令
3)观察波形
图形界面此时应该已经打开,按照如下操作