部分轉自(https://blog.csdn.net/qq_40829605/article/details/85384233)
VCS+Verdi 聯合仿真
1. 開發(fā)文件夾結構
- 二分頻模塊
half.v - tb
testbench.v - 計數器
counter.v - 生成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 指定輸出的可執(zhí)行文件的名字,缺省是simv
+ nospecify 不對SPECIFY 模塊進行時序檢查和路徑延時計算
+ notimingcheck 不進行時序檢查烹笔;但是還是把path延時加入仿真中
-R 跑完仿真直接運行 ./simv
2. 文件內容
- 二分頻模塊
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
- 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
- 計數器
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
- 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);