はじめに
の続き、
今日は、HW側(Bluespec)の中を調べていきます。
HW側(Bluespec)
HW側(Bluepsec)のコードは、ここ にあります。
トップ階層は、Platform_Sim/HW/Include_Common.mk のTOPFILEとして、Platform_Sim/HW/Top_HW_Side.bsv になります。
# ---------------- # Top-level file and module TOPFILE ?= $(AWSTERIA_INFRA_REPO)/Platform_Sim/HW/Top_HW_Side.bsv TOPMODULE ?= mkTop_HW_Side
HW側のプログラムを実行すると、下記のようなログを表示します。
$ cd TestApp/HW/build_Bluesim $ ./exe_HW_sim INFO: TOP.mkTop_HW_Side.ddr_A base 0x0000000000000000 lim 0x0000000080000000 implemented 0x0000000080000000 INFO: TOP.mkTop_HW_Side.ddr_B base 0x0000000080000000 lim 0x0000000100000000 implemented 0x0000000080000000
その後に、下記のようなメッセージを表示します。コードは、ここにあります。
================================================================ Bluespec AWSteria_Infra simulation v2.1 Copyright (c) 2020-2022 Bluespec, Inc. All Rights Reserved. ================================================================
次にHost側のプログラムと通信待ちになります。コードは、ここにあります。
INFO: Listening for connection from host-side on TCP port 30000 (2: TOP.mkTop_HW_Side.rl_listen)
Host側のプログラムと通信が確立されると、次のメッセージが表示されます。コードは、ここにあります。
INFO: Accepted connection from host-side on TCP port 30000 (23612169: TOP.mkTop_HW_Side.rl_accept)
下記の部分は、Host側のプログラム内の意図したエラーに対するメッセージだと思います。
23654216: ERROR: rl_wr_xaction_no_such_slave: m0 -> ? TOP.mkTop_HW_Side.awsteria_hw.fabric AXI4_Wr_Addr { awid: 'h0000, awaddr: 'h0000000100000000, awlen: 'h00, awsize: 'h6, awburst: 'h1, awlock: 'h0, awcache: 'h0, awprot: 'h0, awqos: 'h0, awregion: 'h0, awuser: 'h0 } 23654219: ERROR: rl_rd_xaction_no_such_slave: m0 -> ? TOP.mkTop_HW_Side.awsteria_hw.fabric AXI4_Rd_Addr { arid: 'h0000, araddr: 'h0000000100000000, arlen: 'h00, arsize: 'h6, arburst: 'h1, arlock: 'h0, arcache: 'h0, arprot: 'h0, arqos: 'h0, arregion: 'h0, aruser: 'h0 }
最後に通信が切断され、終了します。
c_host_recv2: Connection closed by remote host
Bluespec でもC言語の関数が呼べる。
Platform_Sim/HW/Top_HW_Side.bsv の中で、
import C_Imports :: *;
にて、C言語の関数を読むためのパッケージを import しています。C_Importsのコードは、C_Imports.bsv でここにあります。
Host側のプログラムとの通信部分は下記のようになっています。import "BDPI" というキーワードを使って、C言語の関数を呼び出しているっポイです。
// ================================================================ // Connect to remote host on tcp_port (host is client, we are server) import "BDPI" function Action c_host_listen (Bit #(16) tcp_port); // ================================================================ // Connect to remote host on tcp_port (host is client, we are server) import "BDPI" function ActionValue #(Bit #(8)) c_host_try_accept (Bit #(8) dummy); // ================================================================ // Disconnect from remote host. // Return fail/ok. import "BDPI" function Action c_host_disconnect (Bit #(8) dummy);
C言語の関数のコードは、C_Imports_Functions.cでここにあります。
上記の3つの関数に対応する関数が定義されています。
- void c_host_listen (const uint16_t tcp_port)
- uint8_t c_host_try_accept (uint8_t dummy)
- void c_host_disconnect (uint8_t dummy)
Bluespec用のMakefile(Include_Bluesim.mk)のsimulatorターゲットにて、C言語の関数のファイル(C_Imported_Functions.c)を使っています。
simulator: @echo "INFO: linking bsc-compiled objects into Bluesim executable" bsc -sim -parallel-sim-link 8 +RTS -K1G -RTS \ $(TMP_DIRS) \ -e $(TOPMODULE) -o ./$(SIM_EXE_FILE) \ $(BSC_C_FLAGS) \ $(AWSTERIA_INFRA_REPO)/Platform_Sim/HW/C_Imported_Functions.c @echo "INFO: linked bsc-compiled objects into Bluesim executable"
おわりに
Bluespec でもC言語の関数が呼び出せるんですね。。。いいですね。