Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

BluespecのAWSteria_Infraを調べる(その3)

はじめに

の続き、

今日は、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

これは、DDRモデルが出力するログで、ここにあります。

その後に、下記のようなメッセージを表示します。コードは、ここにあります。

================================================================
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言語の関数が呼び出せるんですね。。。いいですね。