Upload
vankiet
View
231
Download
1
Embed Size (px)
Citation preview
UML-SystemC 先睹為快
2.1 UML-SystemC 先睹為快
2.2 Memory 晶片設計
2.3 組裝可重用的設計
CHAPTER
2-2 UML-SystemC 晶片設計實務
2.1 UML-SystemC 先睹為快
UML-SystemC的絕妙搭配,形成一股新式的晶片設計風潮,且讓我
們先睹為快。由於,每一款 UML圖所呈現的設計角度各有不同,因此可
以將原先晶片其複雜的軟硬整合設計,透過單一但多樣的設計圖,先是
依據各圖款化複雜為單一,然後再組合多款的 UML圖重現晶片其複雜的
設計。
我們馬上來看 UML活動圖 2-1的設計,透過活動圖可以呈現出進程
(Process)的內部設計。在圖 2-1中,我們突顯了 Record進程一開始便進
入接收事件的情況,並且在等待接收到 Record Start(錄音開始)事件之
後,才會進入 Recording(錄音行動)。且於錄音結束之後,發送了 Record
Stop(錄音結束)事件,然後再度進入接收事件,再度等待 Record Start(錄
音開始)事件的發生。
Record Stop Record Start Recording
圖 2-1 Record進程的活動圖
圖 2-1展示了 UML活動圖的設計角度,它適用於呈現進程內部的活
動流程、事件接收或發送的細節。接著,我們再來看另一款通訊圖,它
將呈現出不同的設計觀點,如圖 2-2所示。
CHAPTER 02 UML-SystemC 先睹為快 2-3
: Memory
: DAC
Playback<<Thread>>
Input<<Thread>>
chOp<<sc_fifo>>
chData<<sc_fifo>>
+sc_fifo_out_if +poDataOut
+piOp
+sc_fifo_in_if
+sc_fifo_in_if
+piDataIn
1 : ePlayStart 2 : write()
3 : read()
4 : write()
5 : read()
6 : ePlayStop
圖 2-2 Playback的通訊圖
在 SystemC模擬期間,晶片物件內部會誕生更小的晶片物件、通道
物件和進程等,而且晶片內部的這一群物件之間會發生傳送事件或者呼
叫函數等等的通訊動作,合作提供整合性的服務。此時,我們可以使用
通訊圖來呈現物件之間的通訊情況。在圖 2-2 的通訊圖中,可以看到
Recorder晶片物件內部的一群物件,模擬 Playback(播放)功能時,彼此間
傳遞重要訊息的通訊狀況。
如果,我們只是繪製 UML圖來呈現晶片設計,那就像是一碗好吃的
牛肉湯麵,碗裡只有湯麵沒有牛肉,令人可惜。幸運的是,UML 圖與
SystemC 程式碼之間的對應明確又直接,就像牛肉湯麵碰上新鮮牛肉般
絕配。
譬如,UML 的類別圖適合表達晶片內部諸如資料、端口和進程等等
的重要組成,恰好可以直接對應到.h的 SytemC程式碼,如圖 2-3及程式
2-1所示。或者,搭配如圖 2-4的組合結構圖,可以進一步呈現 ADC晶片
物件內部數個小部件(Part)之間的關係,而且還可以直接對應到如程式 2-2
的.cpp程式碼。類別圖和組合結構圖中標示的數字,對應著程式碼的行號。
2-4 UML-SystemC 晶片設計實務
sc_fifo_in_if
sc_fifo_out_if
sc_signal_in_if
ADC
-chDataOut: sc_fifo-chAudioIn: sc_fifo+piOpCode: sc_port<sc_signal_in_if<int> >+xpiAudioIn: sc_export<sc_fifo_out_if<sc_bv<8> > >+xpoDataOut: sc_export<sc_fifo_in_if<sc_bv<8> > >
<<Thread>>+Convert()
piOpCode xpoDataOut xpiAudioIn
sc_fifo_out_if
12
7 9 8
15 14
圖 2-3 ADC晶片的類別圖(請參照 ADC.h)
//// SystemC Code
1. // ADC.h
2. //
3. #pragma once
4. class ADC : public sc_module
5. {
6. public:
7. sc_port<sc_signal_in_if<int> > piOpCode;
8. sc_export<sc_fifo_out_if<sc_bv<8> > > xpiAudioIn;
9. sc_export<sc_fifo_in_if<sc_bv<8> > > xpoDataOut;
10. SC_HAS_PROCESS(ADC);
11. ADC(sc_module_name mn);
12. void Convert(void);
13. private:
14. sc_fifo<sc_bv<8> > chAudioIn;
15. sc_fifo<sc_bv<8> > chDataOut;
16. };
//// SystemC Code
程式 2-1 ADC.h
CHAPTER 02 UML-SystemC 先睹為快 2-5
ADC
xpoDataOut
Convert<<Thread>>
chDataOut<<sc_fifo>>
piOpCode
chAudioIn<<sc_fifo>>
xpiAudioIn
sc_fifo_in_if
sc_signal_in_if
sc_fifo_out_if8
9
圖 2-4 ADC晶片物件的組合結構圖(請參照 ADC.cpp)
//// SystemC Code
1. // ADC.cpp
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "ADC.h"
6. ADC::ADC(sc_module_name mn) : sc_module(mn)
7. {
8. xpiAudioIn(chAudioIn);
9. xpoDataOut(chDataOut);
10. SC_THREAD(Convert);
11. };
12.
13. void ADC::Convert(void)
14. {};
//// SystemC Code
程式 2-2 ADC.cpp
2-6 UML-SystemC 晶片設計實務
無論是 SystemC 原始程式,或是各款 UML 圖,都需要花精力和腦
力去編寫或繪製;這些產出都是智慧結晶,也是日後可以重複使用的資
產。然而,可以重複使用的智財必須兼顧內外;於內,必須具備高品質,
於外,必須方便使用。品質,多加練習,定能提升;便利,較為簡單,
透過使用案例,可以讓我們組織相關的設計圖文,如圖 2-5所示。
Controller
DACADC
Memory
Recorder
-myMemory
1
1..2 -myController1
-myDAC 1-myADC
1
1
Recorder
-chOpCode: sc_signal+xpiOpCode: sc_export<sc_signal_out_if<int> >+xpiAudioIn: sc_export<sc_fifo_out_if<sc_bv<8> > >+xpoAudioOut: sc_export<sc_fifo_in_if<sc_bv<8> > >
xpiOpCode xpiAudioIn xpoAudioOut
sc_signal_out_if sc_fifo_out_if sc_fifo_in_if
Recorder
xpiAudioIn
xpiOpCodechOpCode
<<sc_signal>>
xpoAudioOut
Memory
piOpCode
piSampleIn poSampleOut
Controller
piOpCodexpiAudioIn
xpiDataIn
xpoAudioOut
xpoDataOut
sc_fifo_out_if
sc_fifo_in_if
sc_signal_out_if
sc_signal_in_if
sc_signal_in_if
sc_fifo_out_ifsc_fifo_in_if
: Memory
: DAC
Playback<<Thread>>
Input<<Thread>>
chOp<<sc_fifo>>
chData<<sc_fifo>>
+sc_fifo_out_if +poDataOut
+piOp
+sc_fifo_in_if
+sc_fifo_in_if
+piDataIn
1 : ePlayStart 2 : write()
3 : read()
4 : write()
5 : read()
6 : ePlayStop
user播播
錄錄
使用案例圖及敘述
類別圖 組合結構圖
通訊圖 活動圖
SystemC 程式
圖 2-5 使用案例組織相關文件
由於,使用案例組織了各式的設計圖文,日後開發其它晶片時,就
可以迅速重用這些設計,裝組整合出嶄新的設計。此處的圖 2-6是Memory
晶片的使用案例圖,兩項重要的使用案例分別為:儲存資料和取出資料。
再者,我們還需要編寫使用案例敘述,使用文字描述 User與 Memory晶
片互動取得服務的過程。
CHAPTER 02 UML-SystemC 先睹為快 2-7
User取取取取
儲儲取取
Memory 晶片
圖 2-6 Memory晶片的使用案例圖
系統名稱 Memory 晶片
UC名稱 儲存資料
UC 編號 UC001
UC簡述 Memory模組可以讀入並保存 8位元資料。
執行畫面
主要流程 1. User經由 piOpCode端口,輸入操作代碼 1。
2. User經由 piSampleIn端口寫入 8位元資料。
3. 模擬執行結束之後,User可 xpoReadStatus端口讀取狀態值。
4. 如果,狀態值為 1,代表模擬執行成功,螢幕將秀出“儲存正確”
的字串。
5. 若模擬執行失敗,則螢幕將秀出“儲存錯誤”的字串。
2-8 UML-SystemC 晶片設計實務
系統名稱 Memory 晶片
參考文件 1. Memory模組的使用案例圖。
2. Memory模組的個體類別圖。
3. 儲存資料 UC之活動圖。
4. Memory模組程式碼 Memory.h及 Memory.cpp。
5. 測試用的 UC程式碼 StoreDataUC.cpp。
廢話少說,在接下來的小節裡,我們會展示兩個例子,讓您立即嘗
鮮,試試 UML-SystemC兩者搭配一起,所帶來的新式設計方法。
2.2 Memory 晶片設計
這是個 Memory 晶片設計的範例。一開始,外界會透過 piOpCode
端口,傳送操作代碼給 Memory 模組物件;操作代碼 1 是模擬儲存資料
的功能,2是模擬取出資料的功能。模擬儲存資料的功能一經啟動,將執
行 Memory 模組物件的 ReadIn 進程,將外界的四組 8 位元字串
“00000000”、“00000001”、“00000010”、“00000011”,透過 piSampleIn
端口寫進 Memory模組物件內部的 bvSample[4]陣列裡。
在誕生 Memory 模組物件的同時,我們先預存了四組 8 位元字串
“11111111”、“11111110”、“11111101”、“11111100” 到 bvSample[4]陣
列裡;一旦執行模擬取出資料的功能後,將會從外界寫進“00000000”、
“00000001”、“00000010”、“00000011”字串取代預存字串。這樣一來,
如果取出動作有誤的話,執行畫面的儲存數字就會跟取出數字不一致。
圖 2-7~10是 UML設計圖;圖 2-11是模擬儲存和取出的執行畫面;
至於 SystemC的程式碼則分置於程式 2-3~5。首先,我們看到圖 2-7的類
別圖,以及圖 2-8 的組合結構圖。這兩款設計圖,前者呈現 Memory 晶
片內部所設置的端口、資料或進程,後者則呈現出執行期間,Memory
晶片物件內部重要部件(Part)之間的關聯。最後,在圖 2-9~10 的活動圖
中,則特別突顯進程受操作代碼(opCode)輸入事件而驅動。
CHAPTER 02 UML-SystemC 先睹為快 2-9
Memory
-bvSample: sc_bv<8>+piOpCode: sc_port<sc_signal_in_if<int> >+poSampleOut: sc_port<sc_fifo_out_if<sc_bv<8> > >+piSampleIn: sc_port<sc_fifo_in_if<sc_bv<8> > >
<<Thread>>+WriteOut()<<Thread>>+ReadIn()
piOpCodepiSampleIn poSampleOut
sc_fifo_in_if sc_signal_in_ifsc_fifo_out_if
圖 2-7 Memory晶片的個體類別圖
Memory
piSampleIn
ReadIn<<Thread>>
bvSample<<Data>>
WriteOut<<Thread>>
piOpCode
poSampleOut
sc_fifo_in_if sc_signal_in_if
sc_fifo_out_if
圖 2-8 Memory晶片物件的組合結構圖
2-10 UML-SystemC 晶片設計實務
read opCode changed[ opCode=1 ]
圖 2-9 Memory晶片的 ReadIn活動圖
write opCode changed[ opCode=2 ]
圖 2-10 Memory晶片的 WriteOut活動圖
圖 2-11 執行畫面
CHAPTER 02 UML-SystemC 先睹為快 2-11
//// EX02_01
1. // main.cpp : Defines the entry point for the console application.
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "Memory.h"
6. int sc_main(int argc, char* argv[])
7. {
8. Memory *myMemory = new Memory("myMemory");
9. sc_signal<int> chOpCode;
10. sc_fifo<sc_bv<8> > chSampleIn;
11. sc_fifo<sc_bv<8> > chSampleOut;
12. myMemory->piOpCode(chOpCode);
13. myMemory->piSampleIn(chSampleIn);
14. myMemory->poSampleOut(chSampleOut);
15. cout << "儲存模擬開始..." << endl;
16. chOpCode.write(1);
17. chSampleIn.write("00000000");
18. cout << "00000000" << endl;
19. chSampleIn.write("00000001");
20. cout << "00000001" << endl;
21. chSampleIn.write("00000010");
22. cout << "00000010" << endl;
23. chSampleIn.write("00000011");
24. cout << "00000011" << endl;
25. sc_start();
26. cout << "儲存模擬結束..." << endl << endl;
27. cout << "取出模擬開始..." << endl;
28. chOpCode.write(2);
29. sc_start();
30. for(int i=0; i<4; i++)
31. {
32. if(chSampleOut.num_available()==0)
33. wait(chSampleOut.data_written_event());
34. cout << chSampleOut.read() << endl;
35. } //end for
36. cout << "取出模擬結束..." << endl << endl;
37. system("PAUSE");
38. return 0;
2-12 UML-SystemC 晶片設計實務
39. }
//// EX02_01
程式 2-3 main.cpp
//// EX02_01
1. // Memory.h
2. //
3. #pragma once
4. class Memory : public sc_module
5. {
6. public:
7. sc_port<sc_signal_in_if<int> > piOpCode;
8. sc_port<sc_fifo_in_if<sc_bv<8> > > piSampleIn;
9. sc_port<sc_fifo_out_if<sc_bv<8> > > poSampleOut;
10. SC_HAS_PROCESS(Memory);
11. Memory(sc_module_name mn);
12. void ReadIn(void);
13. void WriteOut(void);
14. private:
15. sc_bv<8> bvSample[4];
16. };
//// EX02_01
程式 2-4 Memory.h
//// EX02_01
1. // Memory.cpp
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "Memory.h"
6. Memory::Memory(sc_module_name mn) : sc_module(mn)
7. {
8. bvSample[0]="11111111";
9. bvSample[1]="11111110";
10. bvSample[2]="11111101";
11. bvSample[3]="11111100";
CHAPTER 02 UML-SystemC 先睹為快 2-13
12. SC_THREAD(ReadIn);
13. SC_THREAD(WriteOut);
14. };
15. void Memory::ReadIn(void)
16. {
17. for(;;)
18. {
19. if(piOpCode->read()==1)
20. {
21. for(int i=0; i<4; i++)
22. {
23. if(piSampleIn->num_available()==0)
24. wait(piSampleIn->data_written_event());
25. bvSample[i]=piSampleIn->read();
26. } //end for
27. } //end if
28. wait(piOpCode->value_changed_event());
29. } //end for
30. };
31. void Memory::WriteOut(void)
32. {
33. for(;;)
34. {
35. if(piOpCode->read()==2)
36. {
37. for(int i=0; i<4; i++)
38. {
39. poSampleOut->write(bvSample[i]);
40. } //end for
41. } //end if
42. wait(piOpCode->value_changed_event());
43. } //end for
44. };
//// EX02_01
程式 2-5 Memory.cpp
2-14 UML-SystemC 晶片設計實務
2.3 組裝可重用的設計
單一晶片功能有限,組裝現成的晶片,才能迅速推出新的產品。所
以,在這個範例裡,我們會透過 UML設計圖來呈現模組間的組裝結構,
同時編寫出 SystemC程式碼。
想像一下,我們現在要開發一個 Recorder晶片,將來可以安置於有
錄音功能的數位產品中。為了搶得市場先機,以及節省開發成本,我們
決定組裝現成的三個晶片,分別為:Memory、ADC和 DAC晶片。Memory
晶片做為儲存資料之用;ADC 晶片用來將類比音訊轉成數位音訊;而
DAC則可以將數位音訊轉成類比音訊,支援 Recorder晶片的播放功能。
於是乎,我們透過圖 2-12的整體類別圖,來呈現出晶片之間的組合
關係。這樣還不夠,我們還得繪製圖 2-13來呈現 Recorder晶片的細部;
更重要的是圖 2-14的組合結構圖,可以清楚呈現出 Recorder晶片內部的
組裝情況。
Recorder
Memory DACADC
圖 2-12 整體類別圖
CHAPTER 02 UML-SystemC 先睹為快 2-15
Recorder
-chOpCode: sc_signal+xpiOpCode: sc_export<sc_signal_out_if<int> >+xpiAudioIn: sc_export<sc_fifo_out_if<sc_bv<8> > >+xpoAudioOut: sc_export<sc_fifo_in_if<sc_bv<8> > >
xpiOpCode xpiAudioIn xpoAudioOut
sc_signal_out_if sc_fifo_out_if sc_fifo_in_if
圖 2-13 Recorder晶片的個體類別圖
Recorder
chOpCode: sc_signalxpiOpCode
xpiAudioIn
xpoAudioOut
ADC
xpoDataOut
xpiAudioIn
piOpCode
Memory
piSampleIn
poSampleOut
piOpCode
sc_fifo_in_if
DAC
xpiDataIn
xpoAudioOutpiOpCode
sc_signal_in_if
sc_signal_in_ifsc_signal_out_if
sc_fifo_out_if
sc_fifo_in_if
sc_fifo_out_if
sc_signal_in_if
圖 2-14 Recorder晶片物件的組合結構圖
2-16 UML-SystemC 晶片設計實務
至於,圖 2-15~20是 ADC和 DAC晶片的 UML設計圖;圖 2-21是
模擬錄音和播放的執行畫面,SystemC 的程式碼則分置於程式 2-6~12;
至於,重用 Memory的部份,請您回頭參考圖 2-7~10的 UML設計圖,
以及程式 2-4~5中的 SystemC程式碼。
sc_fifo_in_if
sc_fifo_out_if
sc_signal_in_if
ADC
-chDataOut: sc_fifo-chAudioIn: sc_fifo+piOpCode: sc_port<sc_signal_in_if<int> >+xpiAudioIn: sc_export<sc_fifo_out_if<sc_bv<8> > >+xpoDataOut: sc_export<sc_fifo_in_if<sc_bv<8> > >
<<Thread>>+Convert()
piOpCode xpoDataOut xpiAudioIn
sc_fifo_out_if
圖 2-15 ADC晶片的個體類別圖
ADC
xpoDataOut
Convert<<Thread>>
chDataOut<<sc_fifo>>
piOpCode
chAudioIn<<sc_fifo>>
xpiAudioIn
sc_fifo_in_if
sc_signal_in_if
sc_fifo_out_if
圖 2-16 ADC晶片物件的組合結構圖
CHAPTER 02 UML-SystemC 先睹為快 2-17
convert opCode changed[ opCode=1 ]
圖 2-17 ADC晶片的 Conver活動圖
DAC
-chDataIn: sc_fifo-chAudioOut: sc_fifo+xpiDataIn: sc_export<sc_fifo_out_if<sc_bv<8> > >+xpoAudioOut: sc_export<sc_fifo_in_if<sc_bv<8> > >+piOpCode: sc_port<sc_signal_in_if<int> >
<<Thread>>+Convert()
xpiDataInxpoAudioOutpiOpCode
sc_fifo_in_if sc_fifo_out_ifsc_signal_in_if
圖 2-18 DAC晶片的個體類別圖
DAC
piOpCode
xpiDataIn
xpoAudioOut
Convert<<Thread>>
chDataIn<<sc_fifo>>
chAudioOut<<sc_fifo>>
sc_fifo_in_if
sc_fifo_out_if
sc_signal_in_if
圖 2-19 DAC晶片物件的組合結構圖
2-18 UML-SystemC 晶片設計實務
convert opCode changed[ opCode=2 ]
圖 2-20 DAC晶片的 Conver活動圖
圖 2-21 執行畫面
//// EX02_02
1. // main.cpp : Defines the entry point for the console application.
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "Recorder.h"
6. int sc_main(int argc, char* argv[])
7. {
CHAPTER 02 UML-SystemC 先睹為快 2-19
8. Recorder *myRecorder = new Recorder("myRecorder");
9. cout << "錄音模擬開始..." << endl;
10. myRecorder->xpiOpCode->write(1);
11. myRecorder->xpiAudioIn->write("00000000");
12. cout << "00000000" << endl;
13. myRecorder->xpiAudioIn->write("00000001");
14. cout << "00000001" << endl;
15. myRecorder->xpiAudioIn->write("00000010");
16. cout << "00000010" << endl;
17. myRecorder->xpiAudioIn->write("00000011");
18. cout << "00000011" << endl;
19. sc_start();
20. cout << "錄音模擬結束..." << endl << endl;
21. cout << "播放模擬開始..." << endl;
22. myRecorder->xpiOpCode->write(2);
23. sc_start();
24. for(int i=0; i<4; i++)
25. {
26. if(myRecorder->xpoAudioOut->num_available()==0)
27. wait(myRecorder->xpoAudioOut->data_written_event());
28. cout << myRecorder->xpoAudioOut->read() << endl;
29. } //end for
30. cout << "播放模擬結束..." << endl << endl;
31. system("PAUSE");
32. return 0;
33. }
//// EX02_02
程式 2-6 main.cpp
//// EX02_02
1. // Recorder.h
2. //
3. #pragma once
4. #include "Memory.h"
5. #include "ADC.h"
6. #include "DAC.h"
7. class Recorder : public sc_module
8. {
9. public:
2-20 UML-SystemC 晶片設計實務
10. sc_export<sc_signal_out_if<int> > xpiOpCode;
11. sc_export<sc_fifo_out_if<sc_bv<8> > > xpiAudioIn;
12. sc_export<sc_fifo_in_if<sc_bv<8> > > xpoAudioOut;
13. SC_HAS_PROCESS(Recorder);
14. Recorder(sc_module_name mn);
15. private:
16. Memory* myMemory;
17. ADC* myADC;
18. DAC* myDAC;
19. sc_signal<int> chOpCode;
20. };
//// EX02_02
程式 2-7 Recorder.h
//// EX02_02
1. // Recorder.cpp
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "Recorder.h"
6. Recorder::Recorder(sc_module_name mn) : sc_module(mn)
7. {
8. myMemory = new Memory("myMemory");
9. myADC = new ADC("myADC");
10. myDAC = new DAC("myDAC");
11. xpiOpCode(chOpCode);
12. myADC->piOpCode(chOpCode);
13. xpiAudioIn(myADC->xpiAudioIn);
14. myDAC->piOpCode(chOpCode);
15. xpoAudioOut(myDAC->xpoAudioOut);
16. myMemory->piOpCode(chOpCode);
17. myMemory->piSampleIn(myADC->xpoDataOut);
18. myMemory->poSampleOut(myDAC->xpiDataIn);
19. };
//// EX02_02
程式 2-8 Recorder.cpp
CHAPTER 02 UML-SystemC 先睹為快 2-21
//// EX02_02
1. // ADC.h
2. //
3. #pragma once
4. class ADC : public sc_module
5. {
6. public:
7. sc_port<sc_signal_in_if<int> > piOpCode;
8. sc_export<sc_fifo_out_if<sc_bv<8> > > xpiAudioIn;
9. sc_export<sc_fifo_in_if<sc_bv<8> > > xpoDataOut;
10. SC_HAS_PROCESS(ADC);
11. ADC(sc_module_name mn);
12. void Convert(void);
13. private:
14. sc_fifo<sc_bv<8> > chAudioIn;
15. sc_fifo<sc_bv<8> > chDataOut;
16. };
//// EX02_02
程式 2-9 ADC.h
//// EX02_02
1. // ADC.cpp
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "ADC.h"
6. ADC::ADC(sc_module_name mn) : sc_module(mn)
7. {
8. xpiAudioIn(chAudioIn);
9. xpoDataOut(chDataOut);
10. SC_THREAD(Convert);
11. };
12. void ADC::Convert(void)
13. {
14. for(;;)
15. {
2-22 UML-SystemC 晶片設計實務
16. if(piOpCode->read()==1)
17. {
18. for(int i=0; i<4; i++)
19. {
20. if(chAudioIn.num_available()==0)
21. wait(chAudioIn.data_written_event());
22. chDataOut.write(chAudioIn.read());
23. } //end for
24. } //end if
25. wait(piOpCode->value_changed_event());
26. }
27. };
//// EX02_02
程式 2-10 ADC.cpp
//// EX02_02
1. // DAC.h
2. //
3. #pragma once
4. class DAC : public sc_module
5. {
6. public:
7. sc_port<sc_signal_in_if<int> > piOpCode;
8. sc_export<sc_fifo_out_if<sc_bv<8> > > xpiDataIn;
9. sc_export<sc_fifo_in_if<sc_bv<8> > > xpoAudioOut;
10. SC_HAS_PROCESS(DAC);
11. DAC(sc_module_name mn);
12. void Convert(void);
13. private:
14. sc_fifo<sc_bv<8> > chDataIn;
15. sc_fifo<sc_bv<8> > chAudioOut;
16. };
//// EX02_02
程式 2-11 DAC.h
CHAPTER 02 UML-SystemC 先睹為快 2-23
//// EX02_02
1. // DAC.cpp
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "DAC.h"
6. DAC::DAC(sc_module_name mn) : sc_module(mn)
7. {
8. xpiDataIn(chDataIn);
9. xpoAudioOut(chAudioOut);
10. SC_THREAD(Convert);
11. };
12. void DAC::Convert(void)
13. {
14. for(;;)
15. {
16. if(piOpCode->read()==2)
17. {
18. for(int i=0; i<4; i++)
19. {
20. if(chDataIn.num_available()==0)
21. wait(chDataIn.data_written_event());
22. chAudioOut.write(chDataIn.read());
23. } //end for
24. } //end if
25. wait(piOpCode->value_changed_event());
26. }
27. };
//// EX02_02
程式 2-12 DAC.cpp
2-24 UML-SystemC 晶片設計實務