6.3 端口与通道
如果子模块之间无法沟通,就无法整合在一起,也就无法提供更强大且有价值的功能了。在SystemC的程序中,子模块之间的沟通必须通过端口及通道;除此之外,进程与子模块间的沟通,以及进程之间的沟通,也都需要通道作为沟通的桥梁。
在本小节中,我们会说明子模块之间如何通过端口和通道进行沟通;下一小节中,将进一步谈到进程与子模块之间的沟通;进程之间的沟通,我们在之前的章节中已经说明过了。
外界无法直接接触模块内部的进程或其他部件,同样地,模块内部的进程或其他部件也不能直接接触外界,组模内外的沟通仅能通过模块对外提供的端口。所以,只有模块的设计者可以决定是否设置端口,以便能够与外界进行沟通。无论是顶层的模块还是内部的子模块,亦或是子模块内部更小的模块,都是一样的,都需要设置端口,才能与外界沟通。
在组合结构图中,端口的图示是一个小方型,放置于模块或部件的框线上,如图6-7所示。从图中所见可知,DAC模块设置了一个名为piDataIn的输入端口,而Memory模块则设置了一个名为poDataOut的输出端口。
![]() |
| 图6-7 端口 |
在设置端口时,通常会指定端口将作为输入(In)或输出(Out)之用。例如,在PC的主机上头,也会区分该端口是接喇叭端子(音频输出),还是接麦克风端子(音频输入)。因为,端口的图示上并未特别标示出输出或输入,所以我们特别以pi(port in,输入)或po(port out,输出)作为端口的名称开头,便于指定端口方向。
一旦模块内部通过端口与外界取得联系之后,便可以通过输出端口写出数据到外部信道,或者也可以通过输入端口从信道读入数据。而且,端口并不直接连接信道,而是通过信道所提供的接口,与信道联系。接口就像是约定好的服务窗口,客人可以在不知服务者为谁的情况下,获得事先约定好的服务。例如邮局有提供储汇服务的窗口,也有提供邮政服务的窗口,我们根本不需要知道柜台后面是哪位银行员工,只要走对服务窗口,就能够获得约定好的服务项目。
由于端口与通道之间并无直接连接,所以当日后必需替换不同种类的信道时,只要新信道有支持原先的旧接口,那就不会影响到端口的设计了。这么一来,不仅原有的端口和模块不需要支出额外的费用,就可以立即享有新通道所带来的益处,而且通道的设计者也可以在不需要担心影响其他部件的情况下,安然地开发新种类的通道。
请先回头看图6-7,在组合结构图中,接口采用小圆图标,实线连接实际提供服务的对象。以sc_fifo信道为例,我们最常使用信道来做输出输入数据的动作,所以SystemC已经预先设计了sc_fifo_out_if接口约定,经由sc_fifo通道的实现之后,模块可以调用write()函数来将数据推进信道。而且,模块也可以通过sc_fifo_in_if接口,调用sc_fifo信道实现的read()函数,以便从信道拉出数据。
再接着看图6-8,端口连接上接口之后,图形就会变成像是一只伸出去的小手在抓取服务小球一般。所以,从这张组合结构图来看,我们可以得知Memory子模块通过poDataOut端口输出数据,并且通过chData信道所提供的sc_fifo_out_if接口,将数据推进sc_fifo信道。随后,DAC子模块通过piDataIn输入端口,经由sc_fifo_in_if接口从信道拉出数据。
![]() |
| 图6-8 接口 |
最后,我们来看一个SystemC程序案例,说明子模块之间如何通过自身的端口,连接信道所提供的接口,以便传递彼此的数据。延续上一小节的Recorder模块,我们修改SystemC代码,让DAC与Memory子模块之间可以通过chData信道传递数据;仿真Memory芯片将数据推进信道,而DAC芯片从信道拉出数据,并转换成模拟音频的运作情况。
简化程序的做法是,我们直接在Memory模块的WriteOut进程里,写出四组8位的数据,仿真保存在内存内的数字音频。这四组8位数据依序为00000000、00000001、00000010、108 SOC设计UML实务手册00000011。当Memory模块将数据写进信道之后,SystemC会通知DAC模块的Convert进程,去信道读出数据。不过,我们当然没有真的转换成模拟音频,取而代之的是,让DAC模块的Convert进程直接将取回的四组8位数据显示到屏幕上,执行画面如图6-9所示。
![]() |
| 图6-9 执行画面 |
图6-10~图6-12则分别是Recorder、Memory和DAC模块的组合结构图。
![]() |
| 图6-10 Recorder模块的组合结构图 |
![]() |
| 图6-11 Memory模块的组合结构图 |
程序清单6-8~6-14为SystemC的源代码,特别需要注意之处,如下所述:
• Recorder.h—特别注意到程序清单6-9的行号15,此处声明了一个名为chData的sc_fifo信道,该信道可存取的数据结构为sc_bv<8>,也就是8位(bit)数据。还有要注意,两个右角键号之间要留一个空格,否则会产出编译错误。
![]() |
| 图6-12 DAC模块的组合结构图 |
• Recorder.cpp—在程序清单6-10的行号10~11中,指定Memory子模块的poDataOut端口连接chData通道,同样地,DAC子模块的piDataIn端口也连到了相同的信道,所以两子模块之间就可以通过共同的信道传递数据了。
• Memory.h—在程序清单6-11的行号7,声明了一个sc_port,而且指定为sc_fifo_out_if接口,同时也指定了传递的数据类型为sc_bv<8>,通过这个sc_fifo_out_if接口可以将数据推进sc_fifo信道中。
• Memory.cpp—在程序清单6-12的行号12~15中,通过poDataOut端口连到sc_fifo_out_if接口,并且调用write()函数,将数据推进chData信道。
• DAC.h—在程序清单6-13的行号7,声明了一个sc_port,而且指定为sc_fifo_in_if接口,同时也指定了传递的数据类型为sc_bv<8>,通过这个sc_fifo_in_if接口可以从sc_fifo信道拉出数据。
• DAC.cpp—如果sc_fifo信道中没有数据(可用数目为0)的话,Convert进程会先暂停执行,等待接收到数据已写入的事件,如程序清单6-14的行号14~15所示。否则Convert进程会调用read()函数,从信道拉出数据,并且显示到屏幕上,如行号16所示。
程序清单6-8 main.cpp
//// EX06_02
7. // main.cpp : Defines the entry point for the console application.
8. //
9. #include "stdafx.h"
10. #include "systemc.h"
11. #include "Recorder.h"
12. int sc_main(int argc, char* argv[])
13. {
14. Recorder *myRecorder = new Recorder("myRecorder");
15. sc_start();
16. system("PAUSE");
17. return 0;
18. }
//// EX06_02
程序清单6-9 Recorder.h
//// EX06_02
18. // Recorder.h
19. //
20. #pragma once
21. #include "Memory.h"
22. #include "DAC.h"
23. class Recorder : public sc_module
24. {
25. public:
26. SC_HAS_PROCESS(Recorder);
27. Recorder(sc_module_name mn);
28. void Playback(void);
29. private:
30. Memory* myMemory;
31. DAC* myDAC;
32. sc_fifo<sc_bv<8> > chData;
33. };
//// EX06_02
程序清单6-10 Recorder.cpp
//// EX06_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. myDAC = new DAC("myDAC");
10. myMemory->poDataOut(chData);
11. myDAC->piDataIn(chData);
12. SC_THREAD(Playback);
13. };
14. void Recorder::Playback(void)
15. {
16. cout << "I'm Recorder::Playback" << endl;
17. };
//// EX06_02
程序清单6-11 Memory.h
//// EX06_02
17. // Memory.h
18. //
19. #pragma once
20. class Memory : public sc_module
21. {
22. public:
23. sc_port<sc_fifo_out_if<sc_bv<8> > > poDataOut;
24. SC_HAS_PROCESS(Memory);
25. Memory(sc_module_name mn);
26. void WriteOut(void);
27. };
//// EX06_02
程序清单6-12 Memory.cpp
//// EX06_02
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. SC_THREAD(WriteOut);
9. };
10. void Memory::WriteOut(void)
11. {
12. poDataOut->write("00000000");
13. poDataOut->write("00000001");
14. poDataOut->write("00000010");
15. poDataOut->write("00000011");
16. };
//// EX06_02
程序清单6-13 DAC.h
//// EX06_02
22. // DAC.h
23. //
24. #pragma once
25. class DAC : public sc_module
26. {
27. public:
28. sc_port<sc_fifo_in_if<sc_bv<8> > > piDataIn;
29. SC_HAS_PROCESS(DAC);
30. DAC(sc_module_name mn);
31. void Convert(void);
32. };
//// EX06_02
程序清单6-14 DAC.cpp
//// EX06_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. SC_THREAD(Convert);
9. };
10. void DAC::Convert(void)
11. {
12. for(;;)
13. {
14. if (piDataIn->num_available()==0)
15. wait(piDataIn->data_written_event());
16. cout << piDataIn->read() << endl;
17. } //end for
18. };
//// EX06_02
| 回书目 上一节 下一节 |
|
· 系统分析师自测获奖名.. · Linux结课考试自测获奖.. · 上周Linux系统命令的使.. · 上周真题冲刺测试获奖.. · 全国计算机等考四级模.. · 08年3月各大网上书店及.. |
· 网络工程师模拟测试获.. · 全国计算机软考考试指.. · 3月24日WCF聊天活动 积.. · 全国计算机等级考试四.. · 软件项目估计:第2版 · 系统分析师基础知识自.. |
|
||||
| · 微软出价446亿美元收购.. · 网络故障排除宝典 · Vista SP1对决XP SP3 · 2008年上半年全国软考.. · AIX操作系统管理应用(.. · 华为员工自杀频频拷问.. · 三层交换技术专题 · ARP攻击防范与解决方案 |
· 隐私保护技术探讨 · 反垃圾邮件技术应用 · 龙芯要做中国的“奔腾” · Windows Server 2008专.. · AMD Phenom三核处理器.. · 路由器设置与口令恢复 · 微软Forefront企业安全.. · 企业数据恢复指南 |
|||
|
||||
| · SQL Server 2008/2005.. · SOA 面向服务架构 · SQL Server 2008/2005.. · iSCSI应用与发展 · RAID——磁盘阵列基础 · Apache技术专题 · 中间件应用技术专题 · 三层交换技术专题 |
· SQL Server入门到精通 · Apache技术专题 · 国际文档格式标准开战 · 路由器设置与口令恢复 · 打造安全服务器 · PHP开发应用手册 · SOA 面向服务架构 · 企业数据恢复指南 |
|||
|
||||
| · iSCSI应用与发展 · 中间件应用技术专题 · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · iSCSI应用与发展 · 三层交换技术专题 |
· Apache技术专题 · 企业数据恢复指南 · RAID——磁盘阵列基础 · 路由器设置与口令恢复 · SOA 面向服务架构 · ADSL应用面面俱到 · ADSL应用面面俱到 · 反垃圾邮件技术应用 |
|||