24
UML-SystemC 先睹為快 2.1 UML-SystemC 先睹為快 2.2 Memory 晶片設計 2.3 組裝可重用的設計 CHAPTER

UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

  • Upload
    vankiet

  • View
    231

  • Download
    1

Embed Size (px)

Citation preview

Page 1: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

UML-SystemC 先睹為快

2.1 UML-SystemC 先睹為快

2.2 Memory 晶片設計

2.3 組裝可重用的設計

CHAPTER

Page 2: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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所示。

Page 3: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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程式碼。類別圖和組合結構圖中標示的數字,對應著程式碼的行號。

Page 4: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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

Page 5: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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

Page 6: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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晶

片互動取得服務的過程。

Page 7: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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. 若模擬執行失敗,則螢幕將秀出“儲存錯誤”的字串。

Page 8: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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)輸入事件而驅動。

Page 9: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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晶片物件的組合結構圖

Page 10: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

2-10 UML-SystemC 晶片設計實務

read opCode changed[ opCode=1 ]

圖 2-9 Memory晶片的 ReadIn活動圖

write opCode changed[ opCode=2 ]

圖 2-10 Memory晶片的 WriteOut活動圖

圖 2-11 執行畫面

Page 11: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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;

Page 12: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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";

Page 13: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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

Page 14: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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 整體類別圖

Page 15: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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晶片物件的組合結構圖

Page 16: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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晶片物件的組合結構圖

Page 17: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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晶片物件的組合結構圖

Page 18: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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. {

Page 19: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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:

Page 20: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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

Page 21: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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. {

Page 22: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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

Page 23: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

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

Page 24: UML-SystemC 先睹為快epaper.gotop.com.tw/pdf/ACL024200.pdf · 2-2 UML-SystemC 晶片設計實務 2.1 UML-SystemC先睹為快 UML-SystemC 的絕妙搭配,形成一股新式的晶片設計風潮,且讓我

2-24 UML-SystemC 晶片設計實務