前回の対処方法の対象となる信号を見つけるための方法について記載する。
RTLシミュレーションの信号追うだけなので、内容としてはあまり大したことない。
結論
以下のようにwave_debug有効にして、$finishに至るまでの信号線をチェックしていけば良い。
$finishはsim/verilog/xxx.autotb.vにあるのでここから辿っていき、all_finishを阻害している信号線をさがしていけば見つけることが可能。
一応、今回問題となっていたのは以下の部分でbread_num_o_V_read_data_finishが1とならないことであった。 DUTが対応する信号を出力するパスを通らなかったことが原因。
sim/verilog/AESL_axi_slave_AXILiteS.v
always @(reset or posedge clk) begin
if (reset == 0) begin
bread_num_o_V_read_data_finish <= 0;
read_bread_num_o_V_run_flag <= 0;
read_bread_num_o_V_count = 0;
count_operate_depth_by_bitwidth_and_depth (bread_num_o_V_c_bitwidth, bread_num_o_V_DEPTH, bread_num_o_V_OPERATE_DEPTH);
end
else begin
if (TRAN_AXILiteS_start_in === 1) begin
read_bread_num_o_V_run_flag = 1;
end
if (TRAN_AXILiteS_transaction_done_in === 1) begin
bread_num_o_V_read_data_finish <= 0;
read_bread_num_o_V_count = 0;
end
if (read_one_bread_num_o_V_data_done === 1) begin
read_bread_num_o_V_count = read_bread_num_o_V_count + 1;
if (read_bread_num_o_V_count == bread_num_o_V_OPERATE_DEPTH) begin
read_bread_num_o_V_run_flag <= 0;
bread_num_o_V_read_data_finish <= 1;
end
end
end
end
以下役に立たないおまけ。
RTL simまで動いている場合は問題としては大したことがなさそうという感触が得られた。
それと、WrapCを実行するとC言語からRTL向けのテストベクター生成できそうという感触も得たけど、 当座はこれをやることは無いかな。
cosimの構成
cosimは以下の3段階で進むらしい。(UG902より)
(1)WrapC sim => (2)RTL sim => (3)Post-Checking
全体制御はsolution/sim/verilog/run_sim.tclっぽい。
# ==============================================================
# Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC v2019.2 (64-bit)
# Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
# ==============================================================
set ::env(LD_LIBRARY_PATH) /opt/Xilinx/Vivado/2019.2/lnx64/tools/fpo_v7_0:$::env(LD_LIBRARY_PATH)
set ::env(LD_LIBRARY_PATH) /opt/Xilinx/Vivado/2019.2/lnx64/tools/opencv:$::env(LD_LIBRARY_PATH)
set ::env(LD_LIBRARY_PATH) /opt/Xilinx/Vivado/2019.2/lnx64/tools/fft_v9_1:$::env(LD_LIBRARY_PATH)
set ::env(LD_LIBRARY_PATH) /opt/Xilinx/Vivado/2019.2/lnx64/tools/fir_v7_0:$::env(LD_LIBRARY_PATH)
set ::env(LD_LIBRARY_PATH) /opt/Xilinx/Vivado/2019.2/lnx64/tools/dds_v6_0:$::env(LD_LIBRARY_PATH)
set ::env(LD_LIBRARY_PATH) /usr/lib/x86_64-linux-gnu:$::env(LD_LIBRARY_PATH)
source check_sim.tcl
# --> test vector generation
::AP::printMsg INFO COSIM 302 COSIM_302_998
cd ../wrapc
file delete -force "err.log"
if {![file exists cosim.tv.exe]} {
::AP::printMsg ERR COSIM 321 COSIM_321_999
return -code error -errorcode $::errorCode
}
set ret [catch {eval exec ./cosim.tv.exe | tee temp0.log >&@ stdout} err]
if {$ret == 1} {
::AP::printMsg ERR COSIM 320 COSIM_320_1000
return -code error -errorcode $::errorCode
}
if {[file isfile zeppeli.autotvin.dat]} {
file delete -force zeppeli.autotvin.dat
}
if {[file isfile zeppeli.autotvout.dat]} {
file delete -force zeppeli.autotvout.dat
}
sc_sim_check $ret $err "temp0.log"
cd ../tv/cdatafile
set ret [check_tvin_file]
if {$ret == 1} {
::AP::printMsg ERR COSIM 344 COSIM_344_1005
return -code error -errorcode $::errorCode
}
cd ../
# --> verilog simulation
::AP::printMsg INFO COSIM 323 COSIM_323_1007
::AP::printMsg INFO COSIM 15 COSIM_15_1011
cd ../verilog
file delete -force ".exit.err"
file delete -force ".aesl_error"
file delete -force "err.log"
if {[file isfile run_xsim.sh]} {
set ret [catch {eval exec "sh ./run_xsim.sh | tee temp2.log" >&@ stdout} err]
}
cd ../tv/rtldatafile
set ret [check_tvout_file]
if {$ret == 1} {
::AP::printMsg ERR COSIM 344 COSIM_344_1020
return -code error -errorcode $::errorCode
}
cd ../../wrapc_pc
::AP::printMsg INFO COSIM 316 COSIM_316_1021
if {![file exists cosim.pc.exe]} {
::AP::printMsg ERR COSIM 320 COSIM_320_1022
return -code error -errorcode $::errorCode
}
set ret [catch {eval exec ./cosim.pc.exe | tee temp0.log >&@ stdout} err]
sc_sim_check $ret $err "temp3.log"
UG902にも書いてあるけど、
(1)は以下のメッセージからfinishまでで、cosim用にテストベクターを生成している。
(上記ファイルの# --> test vector generation以降が該当)
solution/sim配下のwrapcの中の話と思われる。
[SIM-14] Instrumenting C test bench (wrapc)
[SIM-302] Generating test vectors(wrapc)
(2)は以下のメッセージからfinishまでで、いわゆるRTLシミュレーションを行っている。
(# --> verilog simulation以降が該当)
動作させている間は通常のシミュレータ使う感覚でデバッグができる。
[SIM-333] Generating C post check test bench
[SIM-12] Generating RTL test bench
[SIM-323] Starting Verilog simulation (Issued when Verilog is the RTL
verified)
[SIM-322] Starting VHDL simulation (Issued when VHDL is the RTL verified)
(3)は以下のメッセージからfinishまでで、最終出力のチェックを行っている。
(上記ファイルのcd ../../wrapc_pc以降が該当)
ここはよく見ていない。
[SIM-316] Starting C post checking
[SIM-1000] C/RTL co-simulation finished: PASS (If test bench returns a 0)
[SIM-4] C/RTL co-simulation finished: FAIL (If the test bench returns non-
zero)
solution配下のsimディレクトリ構成は以下の通り。
sim
├── autowrap
│ ├── systemc
│ │ ├── apatb_zeppeli.cpp
│ │ └── apatb_zeppeli.h
│ └── testbench
│ ├── tb.status.tcl
│ ├── tb_zeppeli.cpp_pre.cpp
│ ├── tb_zeppeli.cpp_pre.cpp.tb.cpp
│ ├── zeppeli.cpp_pre.cpp
│ └── zeppeli.cpp_pre.cpp.tb.cpp
├── tv
│ ├── cdatafile
│ │ ├── c.zeppeli.autotvin_bread_i_V.dat
│ │ ├── c.zeppeli.autotvout_bread_num_o_V.dat
│ │ └── ref.tcl
│ └── rtldatafile
│ └── rtl.zeppeli.autotvout_bread_num_o_V.dat
├── verilog
│ ├── AESL_axi_slave_AXILiteS.v
│ ├── check_sim.tcl
│ ├── glbl.v
│ ├── run_sim.tcl
│ ├── run_xsim.sh
│ ├── sim.sh
│ ├── webtalk_25187.backup.jou
│ ├── webtalk_25187.backup.log
│ ├── webtalk.jou
│ ├── webtalk.log
│ ├── xelab.log
│ ├── xelab.pb
│ ├── xsim.dir
│ │ ├── work
│ │ │ ├── glbl.sdb
│ │ │ └── work.rlx
│ │ ├── xil_defaultlib
│ │ │ ├── @a@e@s@l_axi_slave_@a@x@i@lite@s.sdb
│ │ │ ├── apatb_zeppeli_top.sdb
│ │ │ ├── xil_defaultlib.rlx
│ │ │ ├── zeppeli_@a@x@i@lite@s_s_axi.sdb
│ │ │ └── zeppeli.sdb
│ │ └── zeppeli
│ │ ├── Compile_Options.txt
│ │ ├── TempBreakPointFile.txt
│ │ ├── webtalk
│ │ │ ├── usage_statistics_ext_xsim.html
│ │ │ └── usage_statistics_ext_xsim.xml
│ │ ├── xsimcrash.log
│ │ ├── xsim.dbg
│ │ ├── xsimk
│ │ ├── xsimkernel.log
│ │ ├── xsim.mem
│ │ ├── xsim.reloc
│ │ ├── xsim.rtti
│ │ ├── xsim_script.tcl
│ │ ├── xsimSettings.ini
│ │ ├── xsim.svtype
│ │ ├── xsim.type
│ │ └── xsim.xdbg
│ ├── xsim.jou
│ ├── xsim.log
│ ├── zeppeli.autotb.v
│ ├── zeppeli_AXILiteS_s_axi.v
│ ├── zeppeli_dataflow_ana.wcfg
│ ├── zeppeli.performance.result.transaction.xml
│ ├── zeppeli.prj
│ ├── zeppeli.protoinst
│ ├── zeppeli.result.lat.rb
│ ├── zeppeli.tcl
│ └── zeppeli.v
├── wrapc
│ ├── AESL_pkg.h
│ ├── apatb_zeppeli.cpp
│ ├── apatb_zeppeli.h
│ ├── cosim.tv.exe
│ ├── cosim.tv.mk
│ ├── Makefile.rules
│ ├── obj
│ │ ├── apatb_zeppeli.d
│ │ ├── apatb_zeppeli.o
│ │ ├── tb_zeppeli.cpp_pre.cpp.tb.o
│ │ └── zeppeli.cpp_pre.cpp.tb.o
│ ├── sc0.log
│ ├── tb_zeppeli.cpp_pre.cpp.tb.cpp
│ └── zeppeli.cpp_pre.cpp.tb.cpp
└── wrapc_pc
├── AESL_pkg.h
├── apatb_zeppeli.cpp
├── apatb_zeppeli.h
├── cosim.pc.exe
├── cosim.pc.mk
├── Makefile.rules
├── run_xsim.log
├── tb_zeppeli.cpp_pre.cpp.tb.cpp
└── zeppeli.cpp_pre.cpp.tb.cpp
0 件のコメント:
コメントを投稿