2020年10月14日水曜日

Vivado_HLSのcsimは動作するけどcosimが終了しない場合の原因信号の見つけ方

前回の対処方法の対象となる信号を見つけるための方法について記載する。
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 件のコメント:

コメントを投稿