6.2 结构设计
之前,我们看到的案例都是单一模块的设计,模块内部主要含有信道或进程,并未包含其他更小的模块,这可归类为单层级(Hierarchy)的模块设计。对于小型单纯的案例可以采用单一层级的设计,可是面对真实的系统,通常规模都比较大型且复杂,届时就需要采用多层级的设计方式了。
所谓的多层级的模块设计,意味着大模块内部含有数个小模块,而小模块的内部还可能包含更小的模块,形成多层级的组合结构。举例来说,图6-2的Recorder模块设计中,其内部含有次层级的Microcontroller、Memory和Keypad三个子模块,而其中的Mircocontroller子模块内部又含有次次层级更小的子模块。
![]() |
| 图6-2 对象层级(组合结构图) |
真实的SoC结构就如Recorder模块一般,层层叠叠,组装整合着许多特殊功能的芯片,以便提供整合性的多样功能。同样地,对于Recorder模块的结构设计,我们可以用UML的类图呈现出另一种层级关系的空间感,如图6-3所示。
在本章中,我们的重点摆在组合结构图。在稍后的章节里才会为您详细介绍类图。所以看完图6-3的展示之后,让我们再回到组合结构图的主题吧!
现在,我们来示范一个简单的多层级模块设计,说明它的SystemC程序语法以及组合结构图的图标。在这个案例里,最顶层的Recorder模块内部含有两个子模块,分别名为DAC与Memory。我们计划用DAC子模块来仿真数字音频转模拟音频的芯片,以及用Memory子模块来仿真存储音频数据的内存。因此,我们绘制了图6-4的组合结构图,用来呈现Recorder模块的结构设计。
|
| 图6-3 类层级(类图) |
在组合结构图中,我们用来代表最顶层模块的图标称为“结构类”(Structured Classifier),内部的小模块或其他的小对象则称为“部件”(Part)。在SystemC的应用中,比较特别的是,我们会用部件来表达进程,同时也会用部件来表达通道。这么做的原因在于,模块内部的进程或信道都会跟子模块沟通,而且它们也是模块内部相当重要的组成对象。
|
| 图6-4 类与部件 |
以封装特性而言,DAC或Memory子模块的内部结构具有封装性,也就是除了该设计者外,其余的用户恐怕无法窥见其内部的设计,那是可卖钱的关键啊!所以,Recorder模块的设计者通常仅能见到子模块对外沟通的端口,并且获知子模块能够提供的功能。关于端口与通道的设计,更为复杂些,所以我们留待下一小节才细谈。
因此,此处图6-5的子模块组合结构图中,我们用一个简单的Convert进程仿真DAC芯片的音频转换功能,以及用WriteOut进程仿真Memory芯片的取出音频数据的功能。在这个案例中,我们的重点在说明Recorder模块内含两个子模块的情形,因此简化了进程的设计,仅在屏幕上显示进程名称,如图6-6所示。
|
| 图6-5 子模块的组合结构图 |
![]() |
| 图6-6 执行画面 |
接着,我们来看SystemC程序的文件结构,不同于之前章节的文件结构。在之前的章节中,我们将所有的代码摆在同一个文件中;但是现在,代码越来越多了,为了方便理解与管理,我们打算按照C++程序的惯例,将代码分置于数个不同功能的文件里面。简述如下:
• main.cpp—主要放置sc_main()函数,其内的代码主要在处理、创建顶层模块的对象,并且启动SystemC引擎来执行仿真事务。请看程序清单6-1的行号8,这是Recorder对象的声明与创建;行号9的sc_start()函数则用来启动SystemC引擎,以便进行仿真。特别注意行号5,必须把Recorder.h包含进来,main.cpp文件才能使用Recorder模块。
• Recorder.h—主要放置Recorder模块的声明,像是其内部的建构式、析构式和进程,以及数据、事件、信道、端口和子模块,等等,皆于此处声明之。特别注意到程序清单6-2的行号4~5,此处将DAC.h和Memory.h包含进来,以便在行号13~14可以使用DAC与Memory子模块。
• Recorder.cpp—主要放置Record模块的建构式、析构式和进程的代码。特别注意到程序清单6-3的行号8~9,创建了DAC与Memory子模块的对象;而且别忘了行号5,把Recorder.h包含进来,才能使用到.h所声明的内容。
• Memory.h—主要放置Memory子模块的声明,此处主要声明了一个名为WriteOut的进程,如程序清单6-4的行号9所示。
• Memory.cpp—主要放置Memory模块的建构式、析构式和进程的代码。特别注意到程序清单6-5的行号5,把Memory.h包含进来,才能使用到.h所声明的内容。
• DAC.h—主要放置DAC子模块的声明,此处主要声明了一个名为Convert的进程,如程序清单6-6的行号9所示。
• DAC.cpp—主要放置DAC模块的建构式、析构式和进程的代码。特别注意到程序清单6-7的行号5,把DAC.h包含进来,才能使用到.h所声明的内容。
程序清单6-1 main.cpp
//// EX06_01
48. // main.cpp : Defines the entry point for the console application.
49. //
50. #include "stdafx.h"
51. #include "systemc.h"
52. #include "Recorder.h"
53. int sc_main(int argc, char* argv[])
54. {
55. Recorder *myRecorder = new Recorder("myRecorder");
56. sc_start();
57. system("PAUSE");
58. return 0;
59. }
//// EX06_01
程序清单6-2 Recorder.h
//// EX06_01
102. // Recorder.h
103. //
104. #pragma once
105. #include "Memory.h"
106. #include "DAC.h"
107. class Recorder : public sc_module
108. {
109. public:
110. SC_HAS_PROCESS(Recorder);
111. Recorder(sc_module_name mn);
112. void Playback(void);
113. private:
114. Memory* myMemory;
115. DAC* myDAC;
116. };
//// EX06_01
程序清单6-3 Recorder.cpp
//// EX06_01
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. SC_THREAD(Playback);
11. };
12. void Recorder::Playback(void)
13. {
14. cout << "I'm Recorder::Playback" << endl;
15. };
//// EX06_01
程序清单6-4 Memory.h
//// EX06_01
1. // Memory.h
2. //
3. #pragma once
4. class Memory : public sc_module
5. {
6. public:
7. SC_HAS_PROCESS(Memory);
8. Memory(sc_module_name mn);
9. void WriteOut(void);
10. };
//// EX06_01
程序清单6-5 Memory.cpp
//// EX06_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. SC_THREAD(WriteOut);
9. };
10. void Memory::WriteOut(void)
11. {
12. cout << "I'm Memory::WriteOut" << endl;
13. };
//// EX06_01
程序清单6-6 DAC.h
//// EX06_01
1. // DAC.h
2. //
3. #pragma once
4. class DAC : public sc_module
5. {
6. public:
7. SC_HAS_PROCESS(DAC);
8. DAC(sc_module_name mn);
9. void Convert(void);
10. };
//// EX06_01
程序清单6-7 DAC.cpp
//// EX06_01
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. cout << "I'm DAC::Convert" << endl;
13. };
//// EX06_01
| 回书目 上一节 下一节 |
|
· 系统分析师自测获奖名.. · 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应用面面俱到 · 反垃圾邮件技术应用 |
|||