1 VCS+Verdi联合仿真

部分转自(https://blog.csdn.net/qq_40829605/article/details/85384233)

VCS+Verdi 联合仿真

1. 开发文件夹结构

  1. 二分频模块
    half.v
  2. tb
    testbench.v
  3. 计数器
    counter.v
  4. 生成filelist
find -name "*.v" > file.list

–file.list

3. 仿真方式

vcs+verdi

vcs -full64 -f file.list -fsdb -debug_all -l test.log
./simv
verdi -f file.list -ssf test.fsdb

其他常用VCS命令:

-cm line|cond|fsm|tgl|obc|path  设定coverage的方式
+define+macro=value+      预编译宏定义
-f filename             RTL文件列表
+incdir+directory+         添加include 文件夹
-I                 进入交互界面
-l                 logfile文件名
-P pli.tab              定义PLI的列表(Tab)文件
+v2k                使用推荐的标准
-y  [path] +libext+.v          定义verilog的库
-notice               显示详尽的诊断信息
-o                  指定输出的可执行文件的名字,缺省是simv
+ nospecify            不对SPECIFY 模块进行时序检查和路径延时计算
+ notimingcheck           不进行时序检查;但是还是把path延时加入仿真中
-R                                                                     跑完仿真直接运行 ./simv

2. 文件内容

  1. 二分频模块
    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

  1. tb
    testbench.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.vad");
//    $dumpvars(0,u0);
//end
//`ifdef  DUMP_FSDB
    initial begin
        $fsdbDumpfile("test.fsdb");
        $fsdbDumpvars;
    end
//`endif

initial #1000 $finish;
endmodule

  1. 计数器
    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

  1. Makefile 文件用于编写vcs、verdi、clean等命令
    –Makefile
    下面内容仅供测试。
    我的Makefile内容,可根据需要自由更改。
vcs:
    vcs \
    -full64 \ #vcs以64位运行
    -f filelist.f \ #如不使用-f参数,可以替换成每个文件的路径。filelist.f也就是将所有的需要仿真文件集合。但仿真文件一定要放在第一个位置
    -debug_all \    #不加此参数, 在生成fsdb波形文件时可能会出错。
    +define+DUMP_FSDB \ #定义宏,也可在仿真文件中添加,用于生成fsdb波形文件
    -P /home/chenqw/synopsys/verdi_2016.06-1/share/PLI/VCS/LINUXAMD64/novas.tab \   #用于生成fsdb波形文件,修改成自己的路径
    /home/chenqw/synopsys/verdi_2016.06-1/share/PLI/VCS/LINUXAMD64/pli.a \  #用于生成fsdb波形文件,修改成自己的路径
    | tee vcs.log   #输出仿真信息,并保存到vcs.log文件
    ./simv      #最终生成fsdb 文件。

verdi:
    verdi \
    +v2k \
    -sverilog \
    -f filist.f \
    -ssf test.fsdb  &   #仿真文件产生的波形文件

clean:
    rm -rf `ls | grep -v "Makefile"|grep -v "filelist.f" | grep -v "\.v"`   #清除仿真过程文件


clean_all:
    rm -rf `ls | grep -v "Makefile"|grep -v "filelist.f"`       #清除仿真过程文件和设计文件.v

其他的功能

1 ucli debug

用于debug 使用,感觉并不常用

2 $monitor

用于打印仿真相关信息,非常实用。

initial
if (!$test$plusargs("monitoroff"))
    $monitor ($time, "  clk: %h, reset : %h, out : %d", clk,reset,out);

3 $test$plusargs

1 `ifdef 也能实现类似的功能, 但是一旦设置了,会在整个仿真过程中一直生效,想取消只能重新编译,比较耗费时间。

`ifdef  DUMP_FSDB
    initial begin
        $fsdbDumpfile("test.fsdb");
        $fsdbDumpvars;
    end
`endif

2 $test$plusargs则可可以随时改变:

initial
if (!$test$plusargs("monitoroff"))
    $monitor ($time, "  clk: %h, reset : %h, out : %d", clk,reset,out);
./simv +monitoroff  ###关掉monitor
./simv                         ###monitor生效

3 $value$plusargs(这个我还没有用过,用来传递参数数值)
参考[https://blog.csdn.net/limanjihe/article/details/52325930]
$value$plusargs可以讲运行命令(run-options)中的参数值传递给指定的信号或者字符,其语法格式如下:

Integer=$value$plusargs(“string”,signalname);

你可能感兴趣的:(1 VCS+Verdi联合仿真)