# 回應同學DCS Lab01常見的問題 ###### tags: `DCS` `SystemC` ###### 撰寫時間 : 2024/03/08 - 2024/03/09 [TOC] ## 分數與繳交規定 ### 問題1 : Lab01分數怎麼算? 如前天上課所述,當天3/07(三) 11:59 PM以前(包含)繳交都100分,午夜12點過後繳交,每隔一天扣20分。 只有這次Lab分數是這樣算,之後Lab不一定是這樣算,不過每個禮拜上課時都會先跟同學說明評分方式。 ### 問題2 : 上課給助教demo過,也登記過帳號了,還需要繳交到E3平台上嗎? 不需要。如果上課有給助教demo過,而且也有登記過,就不需要再繳交到E3平台。 之後Lab上課期間完成後,找助教demo並報自己server的帳號登記即可。 ### 問題3 : 成績會公布在哪?為什麼我在E3上交了檔案還是沒有成績? 1. server帳號、教室分配表、所有成績都會公布在同一個Google試算表。 2. 如果在E3上繳交後還是沒有成績,請同學耐心等候,我們助教會盡快更新。 ## 環境建置 ### 問題4 : 缺乏依賴檔案,無法執行executable二進位檔 ``` ./hello: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./hello) ./hello: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /RAID2/COURSE/DCS/DCSTA01/systemc-2.3.3/lib-linux64/libsystemc-2.3.3.so) ./hello: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /RAID2/COURSE/DCS/DCSTA01/systemc-2.3.3/lib-linux64/libsystemc-2.3.3.so) ./hello: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /RAID2/COURSE/DCS/DCSTA01/systemc-2.3.3/lib-linux64/libsystemc-2.3.3.so) ``` 因為EDA tool的環境變數會與SystemC的環境變數發生衝突。 ![](https://hackmd.io/_uploads/r1-JWKwaT.png)<br> 如果要執行SystemC時,請在一開始登入server輸入`layout`關鍵字。 ### 問題5 : 可以使用VSCode遠端ssh嗎? 可以,流程如下 1. 下載VSCode與"Remote Development"套件。 2. 在VSCode中輸入快捷鍵`Ctrl+Shift+P`開啟命令列,輸入並選擇`Remote-SSH: Open Configuration File`。 3. 打開設定檔,輸入 ``` Host DCS001 HostName ee21.iee.nycu.edu.tw # host from [ee21-ee30] User DCS001 # username Port 415 #port ``` 4. 設定好後點選左下角圖示`><` -> 點`Connect to Host` -> 點剛剛的設定檔,輸入密碼後就能登入。 5. 在VSCode中輸入快捷鍵Ctrl+\`就可開啟terminal。 6. File -> Open Folder,選擇想進入的資料夾,同樣輸入密碼後登入。 - 缺點1 : 有時候會登不進去,或是登入時間過長,我也不知道問題出在哪。 - 缺點2 : 是沒辦法terminal開啟遠端GUI視窗,如果要開啟遠端GUI視窗還是需要MobaXterm。 詳細流程請參閱[使用VSCode Remote透過 SSH 進行遠端開發](https://hackmd.io/@brick9450/vscode-remote)。 ### 問題6 : MaCOS無法下載server上的檔案 - 解法1 - 在terminal輸入`scp`指令 ``` scp -r account@host:file_path local_path ``` - 解法2 - 下載[FileZilla](https://filezilla-project.org/)軟體,GUI操作。 詳細流請參閱[如何下載/上傳工作站上的檔案 - Mac](https://hackmd.io/@dppa1008/cad_download_upload_mac) ### 問題7 : 助教給的指令前面的`$`要輸入嗎 請不要輸入`$`。符號`%`或是`$`是terminal常見的命令提示字元(prompt),提示使用者接在命令提示字元後面的這段文字是指令。 ## C/C++語法問題 ### 問題8 : 編譯時發生`segmentation fault(core dumped)`,但找不出問題在哪程式第幾行 如同寫C/C\+\+一樣,Segmentation fault (core dumped)是程式存取到非法的記憶體位址,所以可以先檢查程式碼 1. 是否越界存取到不存在的數組。 3. pointer是否指向錯誤。 可以使用GDB這個好用的debugger 1. 使用GDB打開編譯後的executable二進位檔案 ``` gdb ./NN ``` 2. 從頭再執行程式 ``` (gdb) run ``` 3. 有設置中斷點、單步執行、印出變數內容、顯示程式呼叫的stack frame等功能,詳細教學請參見[C語言工具使用,GDB個人學習筆記](https://ithelp.ithome.com.tw/articles/10257294)。 ### 問題9 : 不熟悉class裡面有哪些member function 在使用訊號線,可以先看訊號線是如何定義 ```cpp sc_signal<typename T> object_name ``` 是一個class template (class template是將data type參數化的class),這時應該要去查`sc_signal`這個class - 預設的constructor是什麼?有哪些member functions可以使用?這些member functions的parameter與return value的data type是什麼? 有3種查詢方式 1. 翻閱老師上課投影片 2. 上網google,去[網站](https://www.learnsystemc.com/basic/signal_readwrite)上查。 3. (如果在本地端有裝SystemC的話) 在VSCode上,將游標移動到要查詢的變數、函式上,按`F12`或是`Ctrl + Enter`跳至定義處。 ![Screenshot 2024-03-09 173124](https://hackmd.io/_uploads/rk730jYTp.png) 要從`sc_signal`這個class讀取訊號,有兩種方法,可以call member function`T& read()`或是運算子重載`()`。 ```cpp sc_signal<int> s; // method 1 - member function std::cout << s.read(); // method 2 - operator overloading std::cout << (s); ``` 同理,要從`sc_signal`這個class寫入訊號,有兩種方法,可以call member function`void write(const T&)`或是運算子重載`=`。 ```cpp sc_signal<int> s; // method 1 - member function s.write(5); // method 2 - operator overloading s = 5; ``` 需要注意的是 - 除非確定這個class內部有做運算子重載(operator overloading),否則class無法直接做`+, -, *, \, <<, ++, --`等運算,compiler會不知道要怎麼計算而報錯。 ### 問題10 : 怎麼分這麼多檔案,`*.h`檔和`*.cpp`檔案差在哪裡? 當然可以寫在一起,不過如果程式碼很多,分開寫會比較清楚。 - `*h`是header file,放的是class與其變數與member function的宣告,通常會在開頭加上[include guard](https://en.wikipedia.org/wiki/Include_guard),以避免library重複引入。 - `*.cpp`放的是member function的具體實現內容。 以Lab01來說,在`Neuron.cpp`就需要實現 - 在`Neuron.h`所宣告`Neuron`這個class的member function `neuron()`。 ```cpp void Neuron::neuron(); ``` ### 問題11 : `Neural_Network.h`要怎麼寫? 首先會在`Neural_Network.h`去inlcude自定義header file,讓compiler知道有`Neuron`這個class可以使用。 ```cpp #include "Neuron.h" ``` 2. 宣告pointer,而pointer所指向的data type是`Neuron`這個class。 ```cpp Neuron *N1; ``` 3. 在`systemc.h`提供的constructor`SC_CTOR`裡面動態配置記憶體,從記憶體的heap區配置一段連續的空間以存放`Neuron`這個class新增名為`"N1"`的object,並將其位址存在`N1`這個pointer。 ```cpp N1 = new Neuron("N1"); ``` 4. 使用`Neuron`這個class裡面的member function時,首先要把pointer做解引用(dereference),得到pointer所指向的object,用點`.`去使用其member function。(因為這個class的member function是`public`才可以在class外面存取) ```cpp sc_in < float > input1, input2; sc_signal < float > out_temp; (*N1).input1(input1); // equal to : N1->input1(input1); (*N1).input2(input2); // equal to : N1->input2(input2); (*N1).output(out_emp); // equal to : N1->output(out_emp); ``` 5. 在constructor要加上[sensitivity](https://www.learnsystemc.com/basic/sensitivity),代表在`input1, input2`改變時就會trigger process。 ```cpp sensitive << input1 << input2; ``` 類似於Verilog語法 ```verilog always @ (sensitivity_list) begin // Verilog code to be executed end ``` 6. 最後新增destructor使用`delete`關鍵字,歸還從heap區申請的記憶體空間。 ```cpp ~Neural_Network() { delete N1; delete N2; delete N3; } ``` ## 學習資料與網站 - [Learn SystemC by examples](https://www.learnsystemc.com/basic/hello_world) - 老師上課講義 - 點進`system.h`的library查看source code