SystemC Tutorial - Microelectronic Systems Laboratory
SystemC Tutorial - Microelectronic Systems Laboratory
SystemC Tutorial - Microelectronic Systems Laboratory
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Using <strong>SystemC</strong> for<br />
SoC modelling and design<br />
Marc Pauwels - Ates Berna<br />
Fatma Özdemir - Yves Vanderperren<br />
marc.pauwels@mie.alcatel.be<br />
15.01.2002<br />
All rights reserved<br />
© 2002 - Alcatel<br />
<strong>Microelectronic</strong>s
Outline<br />
t I. Introduction to <strong>SystemC</strong><br />
t II. The AME System Design Methodology<br />
t III. The <strong>SystemC</strong> Language and its features in practice<br />
t IV. The AME System Design Methodology in practice<br />
t V. AME’s Experience with <strong>SystemC</strong> based design<br />
t VI. Summary and Conclusions<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 2
Part I.<br />
Introduction to <strong>SystemC</strong><br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 3
Outline<br />
Part I. Introduction to <strong>SystemC</strong><br />
t<br />
t<br />
t<br />
t<br />
t<br />
What is <strong>SystemC</strong> ? Target and basic features<br />
OSCI : Open Source <strong>SystemC</strong> Initiative<br />
Roadmap and evolution<br />
The AME User perspective<br />
Summary and Conclusion<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 4
Intro to <strong>SystemC</strong><br />
( What is <strong>SystemC</strong> ? )<br />
t<br />
t<br />
t<br />
System design language for HW/SW co-design<br />
A library of C++ classes<br />
• Processes (for concurrency)<br />
• Clocks (for time)<br />
• Hardware (finite) data types [bit vectors, 4-valued 4<br />
logic, fixed-<br />
point types, arbitrary precision integers] and infinite data types<br />
• Waiting and watching (for reactivity)<br />
• Modules, ports, signals (for hierarchy)<br />
• Abstract ports and protocols (abstract communication)<br />
A light-weight simulation kernel<br />
t<br />
Allows to make an “Executable Specification”<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 5
Intro to <strong>SystemC</strong><br />
( What is <strong>SystemC</strong> ? )<br />
t<br />
<strong>SystemC</strong> enables System design and verification<br />
HW<br />
Implementation<br />
Verification &<br />
Analysis<br />
SW<br />
Implementation<br />
System<br />
System<br />
Level IP<br />
RTL<br />
Soft IP<br />
C-CompilerCompiler<br />
Physical<br />
Hard IP<br />
( Courtesy: OSCI )<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 6
Intro to <strong>SystemC</strong><br />
( What is <strong>SystemC</strong> ? )<br />
t<br />
Levels of<br />
Abstraction :<br />
<strong>SystemC</strong><br />
UTF<br />
Functional decomposition<br />
Untimed Functional<br />
• UTF<br />
• TF<br />
• BCA<br />
• CA<br />
Design Exploration<br />
Performance Analysis<br />
HW/SW partitioning<br />
TF<br />
Assign ‘execution time’<br />
Timed Functional<br />
HW / SW Partition<br />
Architectural mapping<br />
Refine communication<br />
Task Partitioning<br />
Abstr.<br />
RTOS<br />
BCA<br />
Bus Cycle Accurate<br />
Refine behavior<br />
Target RTOS/Core<br />
RTOS<br />
RTL<br />
Cycle Accurate<br />
( Courtesy: OSCI )<br />
Software<br />
Hardware<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 7
Intro to <strong>SystemC</strong><br />
( What is <strong>SystemC</strong> ? )<br />
t<br />
Gradual Refinement<br />
• Key of methodology is :<br />
design may be refined in<br />
gradual step-wise fashion,<br />
rather than one giant step.<br />
It is not “all or nothing”.<br />
UTF UTF UTF<br />
UTF UTF<br />
UTF UTF TF<br />
Simulation<br />
Simulation<br />
• UTF<br />
• TF<br />
• BCA<br />
• CA<br />
Details added<br />
to portions of<br />
the system.<br />
UTF<br />
TF<br />
TF BCA RTL<br />
UTF RTL<br />
Simulation<br />
( Courtesy: OSCI )<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 8
The OSCI<br />
( Open initiative )<br />
t<br />
<strong>SystemC</strong> is “Open Source Initiative”<br />
• Open Source License : code & usersGuide<br />
• Language and Reference Simulator : www.systemC<br />
systemC.org<br />
• Platforms : Unix ( gcc v2.95 ) - Linux - WinNT/2000<br />
t<br />
OSCI : became non-profit<br />
organization<br />
• OSCI board and steering group<br />
• OSCI working groups<br />
t language, reference implementation, dataflow, , IP<br />
integration, verification<br />
• User Discussion Forum : Q&A via www.systemC<br />
systemC.org<br />
• User Meetings<br />
t 4th ESCUG (Oct 5 2001 - Copenhagen)<br />
t www-ti<br />
ti.informatik.uni-tuebingen.de/~<br />
.de/~systemc<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 9
The OSCI<br />
( Steering Committee )<br />
t<br />
Open <strong>SystemC</strong> Initiative Steering Group<br />
( Courtesy: OSCI )<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 10
The OSCI<br />
( User Community )<br />
t<br />
<strong>SystemC</strong> User Community : Alcatel amongst the early adopters<br />
( Courtesy: OSCI )<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 11
The OSCI<br />
( User Community )<br />
t<br />
Continued Strong <strong>SystemC</strong> Adoption : Big momentum...<br />
Users/Downloads<br />
20000<br />
15000<br />
10000<br />
5000<br />
Downloads<br />
Licensed Users<br />
<strong>SystemC</strong> v1.0/1.1beta<br />
Released<br />
0<br />
sep/99<br />
nov/99<br />
jan/00<br />
mrt/00<br />
mei/00<br />
jul/00<br />
sep/00<br />
nov/00<br />
jan/01<br />
mrt/01<br />
mei/01<br />
( Courtesy: OSCI )<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 12
Roadmap<br />
( Evolution )<br />
t<br />
History and evolution of <strong>SystemC</strong><br />
Scenery<br />
Sep. 99<br />
1997 DAC Paper<br />
<strong>SystemC</strong><br />
v0.90<br />
Apr. 00<br />
Backwards<br />
Compatible<br />
Fixed Point Types<br />
<strong>SystemC</strong><br />
v1.0<br />
Jun. 00<br />
RPC<br />
Abstract<br />
Protocols -<br />
Master Slave<br />
Ports<br />
<strong>SystemC</strong><br />
v1.1<br />
Feb. 01<br />
<strong>SystemC</strong><br />
v1.2b<br />
Sep. 01<br />
<strong>SystemC</strong><br />
v2.0b2<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 13
Roadmap<br />
( Current versions )<br />
t 1.0 - Hardware Design Flow<br />
• RTL and Behavioral Hardware Modelling<br />
t 1.x - Master-Slave Communication Library<br />
• Extension to system-level<br />
Modelling and<br />
different levels of abstraction<br />
• RPC-based<br />
untimed & timed functional modelling<br />
down to RTL for bus protocol based systems<br />
t 2.0 - System Design Flow<br />
• General purpose communication and synchronization<br />
• Communication Refinement<br />
• Multiple, customizable models of computation<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 14
Roadmap<br />
( Future versions )<br />
Foreseen for the future …<br />
t 2.X - Extensions to System Design Flow<br />
• Dynamic thread creation, fork / join<br />
• Interrupt / abort for behavioral hierarchy<br />
• Performance modelling support<br />
• Timing specification and constraints<br />
t 3.X - Software Design Flow<br />
• Abstract RTOS modelling<br />
• Scheduler modelling<br />
t 4.X - Analog / Mixed Signal <strong>Systems</strong> Modelling<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 15
AME User Perspective<br />
( Used versions and aspects )<br />
t 1.0 - Hardware Design Flow<br />
t 1.x - Master-Slave Communication Library<br />
• Extension to system-level<br />
Modelling and<br />
different levels of abstraction<br />
• RPC-based<br />
untimed & timed functional modelling<br />
down to RTL for bus protocol based systems<br />
t 2.0 - System Design Flow<br />
t 2.X - Extensions to System Design Flow<br />
• Interrupt / abort for behavioral hierarchy<br />
interruptsi<br />
• Performance modelling support<br />
performance<br />
• Timing specification and constraints<br />
<strong>SystemC</strong><br />
v1.2b<br />
timing<br />
t 3.X - Software Design Flow<br />
Firmware<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 16
AME User Perspective<br />
( Design Flow )<br />
t<br />
Used Levels of<br />
Abstraction :<br />
• TF<br />
• CA<br />
<strong>SystemC</strong><br />
Matlab<br />
UTF<br />
TF<br />
Algorithmic<br />
Design and<br />
Validation<br />
System<br />
Design and<br />
Validation<br />
Function<br />
Abstr.<br />
RTOS<br />
BCA<br />
BCA<br />
RTOS<br />
CA<br />
C<br />
Software<br />
Hardware<br />
Firmware<br />
Software<br />
Design and<br />
Validation<br />
Hardware<br />
Design and<br />
Validation<br />
Firmware<br />
Design and<br />
Validation<br />
Target<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 17
Summary<br />
t<br />
From OSCI<br />
• <strong>SystemC</strong> language & ref.simulator available<br />
• Long-term Roadmap : continuity in versions<br />
t<br />
At Alcatel <strong>Microelectronic</strong>s<br />
• Early adoption of <strong>SystemC</strong> v1.1β since 2000<br />
• Started with no other tools than reference simulator (but<br />
C++…)<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 18
Conclusion<br />
t<br />
At Alcatel <strong>Microelectronic</strong>s<br />
• Language is not sufficient : one needs vision on Methodology<br />
• Used v1.2β in real life SoC design project (OWL , since<br />
Jan2001) from which Methodology was derived<br />
• Target: Executable model of system under design<br />
as reference and baseline for design phase<br />
• Tools supporting the design flow are yet to follow<br />
t<br />
<strong>SystemC</strong> and OSCI are the seed for :<br />
• System Design Methodology<br />
• Tools (simulation, co-simulation, synthesis, verification…)<br />
• Standardization ( IEEE, SpecC, , VSIA, … )<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part I - slide 19
Part II.<br />
Alcatel <strong>Microelectronic</strong>s’<br />
System Design Methodology<br />
O<br />
W<br />
L<br />
Ofdm<br />
Wireless<br />
Lan<br />
The WLAN-OWL project<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 1
Outline<br />
Part II. AME’s System Design Methodology<br />
t<br />
t<br />
t<br />
Evolution from ASICs towards SoC<br />
SoC example : AME’s OWL project<br />
AME’s System-on<br />
on-Chip Design Methodology<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 2
Evolution towards SoC<br />
( In general … )<br />
t Evolution of IC (Manufacturing) Technology :<br />
t<br />
t<br />
• getting smaller<br />
• with possibility of larger functions on the die<br />
Evolution of System Designs<br />
• get System on ChipSet or ultimately single chip ( SoC ) for reasons of<br />
t<br />
t<br />
cost saving<br />
compactibility<br />
SoC are complex and contain many components :<br />
Hw,Fw<br />
Fw,Sw…<br />
• all must inter-operate correctly and<br />
• must fit to Customer specifications<br />
• must be developed with faster-time<br />
time-to-market<br />
è Need for System-on<br />
on-Chip (SoC(<br />
SoC) ) Design Methodology<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 3
Evolution towards SoC<br />
( In general … )<br />
( Source: IMEC )<br />
http://www.imec.be/desics<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 4
Evolution towards SoC<br />
( At AME … )<br />
Example : evolution within Alcatel <strong>Microelectronic</strong>s :<br />
t 1985 : ASIC Design<br />
t 1995 : Start of ASSP<br />
Start of System design (bottom-up)<br />
• ADSL : going from “chips” … [<br />
: ic’s ]<br />
up to “boards” and ... [demonstrators : hw + fw + bom]<br />
up to “PC-drivers” … [ : sw ]<br />
Start of System conception (top-down)<br />
• WLAN-OWL Project of today<br />
t initially just ‘matlab’‘<br />
coding<br />
t introduction of ‘<strong>SystemC</strong>’‘<br />
and the ‘System Design Methodology’<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 5
The OWL Project<br />
( The product in general ... )<br />
t<br />
t<br />
t<br />
High Speed Wireless LAN: Wireless networking at speeds > 10 Mbps<br />
Applications<br />
t<br />
t<br />
home environment: wireless video and multi-medea<br />
medea (TV-set, VCR,<br />
external video link), wireless LAN, VoIP, , access to internet, ...<br />
business environment: wireless LAN, video-conferencing, multi-<br />
media,...<br />
Units and<br />
communication<br />
(DL, DiL, , UL)<br />
AP<br />
CC<br />
MT1<br />
MT2<br />
MT3<br />
MT4<br />
MAC-Frame(2ms):<br />
BC-Phase DL-Phase DiL-Phase UL-Phase RA-Phase BC-Ph ...<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 6
The OWL Project<br />
( The product in general ... )<br />
t<br />
The ETSI HiperLAN-2 2 Standard<br />
• Network Layers<br />
E.g.: Ethernet FireWire ...<br />
Core<br />
Network<br />
Core<br />
Network<br />
CL - Specific Part<br />
Network Convergence Layer<br />
CL - Common Part<br />
Data Link Control Layer<br />
[ MAC - DLC ]<br />
Physical Layer<br />
[ PHY ]<br />
HiperLAN-2<br />
Core<br />
Network<br />
• Different flavours<br />
t Business-<br />
environment<br />
t Home-<br />
environment<br />
è Hardware<br />
è Firmware<br />
è Software<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 7
t<br />
The OWL Project<br />
( AME’s view on the product ... )<br />
AME’s HiperLAN-2 SoC ( The OWL Chipset )<br />
Core<br />
Network<br />
Core<br />
Network<br />
CL - Specific Part<br />
Network Convergence Layer<br />
CL - Common Part<br />
Core<br />
Network<br />
Analog<br />
Digital<br />
Data Link Control Layer<br />
[ MAC - DLC ]<br />
RF Layer BaseBand PHY Layer MAC / DLC Layer CL Layer<br />
Physical Layer<br />
[ PHY ]<br />
HiperLAN-2<br />
RF<br />
front<br />
end<br />
PCB Board and<br />
Components<br />
Transmit Data-Path<br />
&<br />
Local Controller<br />
HardWare<br />
Receive Data-Path<br />
&<br />
Local Controller<br />
FirmWare/SoftWare<br />
Global<br />
Controller<br />
SDRAM<br />
(Fw/Sw)<br />
(E)PROM<br />
(Fw/Sw)<br />
Program<br />
CL<br />
User<br />
SAP<br />
CL<br />
Control<br />
SAP<br />
Application<br />
SoftWare<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 8
Outline<br />
Part II. AME’s System Design Methodology<br />
t<br />
t<br />
t<br />
Evolution from ASICs towards SoC<br />
SoC example : AME’s OWL project<br />
AME’s System-on<br />
on-Chip Design Methodology<br />
• Methods and tools : merging HW and SW worlds...<br />
• Iterative and model-based design<br />
• <strong>SystemC</strong> based executable model<br />
• <strong>SystemC</strong> based testbench reuse<br />
• <strong>SystemC</strong> reference for Hw and Fw/Sw<br />
design (Co-simulation)<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 9
Hw Design<br />
• Classical Design<br />
ð Vhdl Synthesis<br />
ð Simulation<br />
ð P&R<br />
• Re-use to reduce complexity<br />
ð uCore platform<br />
ð IP-block re-use<br />
SoC Design Methodology<br />
( Methods and tools … )<br />
System Design<br />
• Iterative Design RUP<br />
• Matlab modelling ML<br />
• <strong>SystemC</strong> modelling SC<br />
SOC<br />
System Validation<br />
& Qualification<br />
• Co-simulation<br />
SC/ISS/Vhdl<br />
Sw Design<br />
• Iterative Design RUP<br />
ð Requir.capture CQ<br />
& tracking<br />
ð Use Cases UC<br />
ð Modelling UML<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 10
SoC Design Methodology<br />
( Iterative design methodology ... )<br />
t<br />
OWL Case : R&D Trajectory is ITERATIVE & MODEL based<br />
• Re-use of SW methodology coming from RUP in project context<br />
• Main target : reduce Risks in order to get ASAP Working product<br />
• Early feedback from Executable <strong>SystemC</strong> model in First iteration<br />
• Models are not “throw-away” but re-used throughout iterations<br />
• <strong>SystemC</strong> is baseline for next iterations : testbench reusage<br />
• keep models well-documented, high-quality and consistent !<br />
S<br />
It.0<br />
It.1<br />
It.2<br />
It.3<br />
matlab<br />
systemC<br />
VHDL\ISS<br />
FPGA<br />
Silicon<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 11
t<br />
t<br />
SoC Design Methodology<br />
( <strong>SystemC</strong> modelling ... : targets )<br />
OWL - Iteration 0 : Big <strong>SystemC</strong> modelling effort<br />
• From<br />
To<br />
Matlab<br />
<strong>SystemC</strong><br />
[algorithms]<br />
Objectives of the <strong>SystemC</strong> model<br />
[behaviour,, system/hw<br />
hw/fw<br />
, architecture ]<br />
• The model is the executable specification<br />
• The model is a tool during iteration 0 (definition phase) to<br />
t verify the over-all system behaviour and architecture<br />
t detail the architecture for critical blocks<br />
t do finite-precision design<br />
t generate test-benches<br />
• The model is a reference for the next iterations:<br />
t test benches are the starting point for all other test benches (RT(<br />
RT-<br />
level,…) and system test plans ( Lab qualification )<br />
t The model is a tool during debugging to analyze “where it<br />
goes wrong”<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 12
SoC Design Methodology<br />
( OWL System ... )<br />
t<br />
AME’s HiperLAN-2 SoC ( The OWL Chipset )<br />
Analog<br />
Digital<br />
RF Layer BaseBand PHY Layer MAC / DLC Layer CL Layer<br />
RF<br />
front<br />
end<br />
Transmit Data-Path<br />
&<br />
Local Controller<br />
Receive Data-Path<br />
&<br />
Local Controller<br />
CL<br />
User<br />
SAP<br />
Global<br />
Controller<br />
CL<br />
Control<br />
SAP<br />
Program<br />
SDRAM<br />
(Fw/Sw)<br />
(E)PROM<br />
(Fw/Sw)<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 13
SoC Design Methodology<br />
( OWL Architecture ... )<br />
t<br />
OWL HW and FW partitioning<br />
RF<br />
Rx<br />
TimeD<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
F<br />
I<br />
F<br />
O<br />
FFT<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
CL<br />
Rx<br />
Hw<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
RF Cmd<br />
& Status<br />
Processor<br />
CL Cmd<br />
& Status<br />
Fw<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 14
SoC Design Methodology<br />
( OWL <strong>SystemC</strong> modelling ... )<br />
t<br />
<strong>SystemC</strong> model of “Hw<br />
+ Fw/Sw<br />
+ System”<br />
TimeD<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
F<br />
I<br />
F<br />
O<br />
FFT<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
Hw<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
Processor<br />
Fw<br />
Operational & TestBench FirmWare<br />
t<br />
Spec to start Hw-Design and Fw-Design …<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 15
SoC Design Methodology<br />
( OWL <strong>SystemC</strong> modelling ... )<br />
t<br />
Used Levels of<br />
Abstraction :<br />
• TF<br />
• CA<br />
<strong>SystemC</strong><br />
Matlab<br />
UTF<br />
TF<br />
Algorithmic<br />
Design and<br />
Validation<br />
System<br />
Design and<br />
Validation<br />
Function<br />
SYSTEM<br />
Abstr.<br />
RTOS<br />
BCA<br />
BCA<br />
TF CA TF<br />
<strong>SystemC</strong><br />
Sim.<br />
RTOS<br />
CA<br />
C<br />
CA<br />
HW<br />
Design<br />
HW<br />
TF<br />
FW<br />
Design<br />
FW/SW<br />
<strong>SystemC</strong><br />
Co-Sim.<br />
Software<br />
Software<br />
Design and<br />
Validation<br />
Hardware<br />
Hardware<br />
Design and<br />
Validation<br />
Firmware<br />
Firmware<br />
Design and<br />
Validation<br />
Target<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 16
SoC Design Methodology<br />
( OWL design and co-simulation … )<br />
t<br />
OWL - Iteration 1 : start of “Design”<br />
• Start of HW design (vhdl(<br />
vhdl)<br />
• Start of FW design (C on ARM-processor platform)<br />
t<br />
t<br />
<strong>SystemC</strong> as Specification and Golden Reference<br />
Co-simulation as validation<br />
• <strong>SystemC</strong> co-simulation with ISS<br />
• <strong>SystemC</strong> co-simulation with vhdl<br />
TARGET: FW validation<br />
TARGET: HW validation<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 17
SoC Design Methodology<br />
( OWL design and co-simulation … )<br />
t<br />
<strong>SystemC</strong> model as reference for “Hw<br />
(Vhdl)) design”<br />
TimeD<br />
DPath<br />
LCtrl<br />
TimeDomain<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
DPath<br />
LCtrl<br />
Complex MPY<br />
F<br />
I<br />
F<br />
O<br />
DPath<br />
LCtrl<br />
FFT<br />
FFT<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
DPath<br />
LCtrl<br />
Freq Dom 2<br />
Section<br />
Hw<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
Processor<br />
Fw<br />
Operational & TestBench FirmWare<br />
t<br />
<strong>SystemC</strong> and Vhdl Co-simulation<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 18
SoC Design Methodology<br />
( OWL design and co-simulation … )<br />
t<br />
<strong>SystemC</strong> model as reference for “FW (C-code) design”<br />
TimeD<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
F<br />
I<br />
F<br />
O<br />
FFT<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
Hw<br />
LCtrl<br />
DPRam<br />
LCtrl<br />
DPRam<br />
LCtrl<br />
DPRam<br />
LCtrl<br />
DPRam<br />
LCtrl<br />
DPRam<br />
D<br />
SRAM<br />
I<br />
SRAM<br />
CPU Core<br />
ARM Processor<br />
MAC<br />
Processor<br />
ISS :<br />
Instruction<br />
Set<br />
Simulator<br />
Operational & TestBench FirmWare<br />
Fw<br />
t<br />
<strong>SystemC</strong> and ISS Co-simulation<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 19
SoC Design Methodology<br />
( OWL design and co-simulation … )<br />
t<br />
<strong>SystemC</strong> and vhdl and ISS Co-simulation<br />
TimeD<br />
DPath<br />
LCtrl<br />
TimeDomain<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
F<br />
O<br />
DPath<br />
LCtrl<br />
FFT<br />
FFT<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
LCtrl<br />
DPRam<br />
Hw<br />
D<br />
SRAM<br />
I<br />
SRAM<br />
CPU Core<br />
ARM Processor<br />
MAC<br />
Processor<br />
ISS :<br />
Instruction<br />
Set<br />
Simulator<br />
Operational & TestBench FirmWare<br />
Fw<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 20
SoC Design Methodology<br />
( <strong>SystemC</strong> modelling ... )<br />
t<br />
Cf. . Part-IV : The Complex-MPY section as <strong>Tutorial</strong> example<br />
TimeD<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
F<br />
I<br />
F<br />
O<br />
FFT<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
Hw<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
Processor<br />
Fw<br />
Operational & TestBench FirmWare<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 21
Summary and Conclusion<br />
t<br />
SoC Design Methodology<br />
• Merging HW and SW worlds…<br />
t From conception till Lab-qualification<br />
• Iterative<br />
• Model based<br />
• Derived from OWL : a real-life life project<br />
t<br />
<strong>SystemC</strong> model in Iteration-0<br />
• Executable spec (with early feedback)<br />
• Baseline for next Iterations (HW and FW design)<br />
• Co-simulation with re-use of test-benches<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part II - slide 22
Part III.<br />
<strong>SystemC</strong> language in practice<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 1
Outline<br />
Part III.<br />
<strong>SystemC</strong> Language in practice<br />
t<br />
Context<br />
<strong>SystemC</strong><br />
v1.2b<br />
• <strong>SystemC</strong> from AME-user perspective<br />
• For complete User-Guide and Syntax : cfr. . www.systemC<br />
systemC.org<br />
• <strong>SystemC</strong> is extendable ( library of C++ classes )<br />
t<br />
<strong>SystemC</strong> as from the web<br />
t<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
t<br />
Summary<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 2
Part III.<br />
t<br />
t<br />
t<br />
t<br />
Context<br />
Outline<br />
<strong>SystemC</strong> Language in practice<br />
<strong>SystemC</strong> as from the web<br />
• System design<br />
• Modules and hierarchy<br />
• Processes and concurrency<br />
• Data types<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
• The C++ behind <strong>SystemC</strong><br />
• Matlab front-end<br />
• Fixed and floating point models<br />
Summary<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 3
t Abstract view on a system :<br />
System design<br />
Module 1 Module 2<br />
Process A<br />
ports<br />
System<br />
Process B<br />
signals<br />
Process C<br />
t<br />
<strong>SystemC</strong> adds specific features on top of C++<br />
• behaviour (modules/processes) and<br />
communication (ports/signals) are split<br />
• concurrent and sequential behaviour<br />
• different time-models models (abstraction levels)<br />
• mapped on single thread of execution<br />
• implementation specific features (e.g. fixed-point data-types types )<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 4
System design<br />
t<br />
<strong>SystemC</strong> design flow:<br />
* Procedural language<br />
with path towards<br />
implementation<br />
* Executable<br />
Specification<br />
* 4 Levels of<br />
Abstraction :<br />
• UTF : System level<br />
• TF<br />
: System level<br />
• BCA : Behavioural<br />
• CA<br />
: RTL<br />
Software<br />
Matlab<br />
<strong>SystemC</strong><br />
Design Exploration<br />
Performance Analysis<br />
HW/SW partitioning<br />
Task Partitioning<br />
Abstract RTOS<br />
Inter process comm.<br />
Scheduling/priority<br />
Target RTOS/Core<br />
Silage<br />
Abstr.<br />
RTOS<br />
RTOS<br />
SDL Esterel Others<br />
UTF<br />
TF<br />
Functional decomposition<br />
Untimed Functional<br />
Assign ‘execution time’<br />
Timed Functional<br />
HW / SW Partition<br />
Architectural mapping<br />
Refine communication<br />
BCA<br />
RTL<br />
Bus Cycle Accurate<br />
Refine behavior<br />
Cycle Accurate<br />
Hardware<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 5
System design<br />
t<br />
Gradual Refinement<br />
• Key of methodology is :<br />
design may be refined in<br />
gradual step-wise fashion,<br />
rather than one giant step.<br />
It is not “all or nothing”.<br />
UTF UTF UTF<br />
UTF UTF<br />
simulation<br />
Simulation<br />
• UTF<br />
• TF<br />
• BCA<br />
• CA<br />
Details<br />
gradually<br />
added to<br />
portions of the<br />
system.<br />
UTF UTF TF<br />
UTF<br />
TF<br />
TF BCA RTL<br />
UTF RTL<br />
simulation<br />
simulation<br />
Simulation<br />
Simulation<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 6
Part III.<br />
t<br />
t<br />
t<br />
t<br />
Context<br />
Outline<br />
<strong>SystemC</strong> Language in practice<br />
<strong>SystemC</strong> as from the web<br />
• System design<br />
• Modules and hierarchy<br />
• Processes and concurrency<br />
• Data types<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
• The C++ behind <strong>SystemC</strong><br />
• Matlab front-end<br />
• Fixed and floating point models<br />
Summary<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 7
t<br />
t<br />
Module is a structural entity<br />
• helps to split complex designs<br />
Module can contain<br />
• ports<br />
• processes<br />
• user defined C++ functions<br />
• internal member data<br />
• constructor<br />
• modules and signals<br />
In<br />
Clk<br />
Rst<br />
accumulator<br />
Acc_<br />
Modules<br />
Out<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 8<br />
t<br />
Note: valid for<br />
è Hardware<br />
è<br />
Firmware/Software<br />
è System<br />
SC_MODULE(accumulator)<br />
SC_MODULE(accumulator)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
(input)<br />
(input)<br />
sc_in<br />
sc_in<br />
In;<br />
In;<br />
sc_in<br />
sc_in<br />
Rst;<br />
Rst;<br />
sc_in_clk<br />
sc_in_clk<br />
Clk;<br />
Clk;<br />
//<br />
//<br />
ports<br />
ports<br />
(output)<br />
(output)<br />
sc_out<br />
sc_out<br />
Out;<br />
Out;<br />
//<br />
//<br />
local<br />
local<br />
member<br />
member<br />
functions<br />
functions<br />
void<br />
void<br />
accumulate();<br />
accumulate();<br />
void<br />
void<br />
display(ostream&<br />
display(ostream&<br />
=<br />
=<br />
cout);<br />
cout);<br />
//<br />
//<br />
local<br />
local<br />
member<br />
member<br />
data<br />
data<br />
int<br />
int<br />
Acc_;<br />
Acc_;<br />
//<br />
//<br />
constructor<br />
constructor<br />
SC_CTOR(accumulator)<br />
SC_CTOR(accumulator)<br />
{<br />
{<br />
SC_METHOD(accumulate);<br />
SC_METHOD(accumulate);<br />
sensitive_pos<br />
sensitive_pos<br />
Modules<br />
t<br />
Module Ports<br />
• Pass data between module-boundary<br />
and internal module-processes<br />
• Direction<br />
t in : read<br />
t out : write<br />
t inout : read & write<br />
• Type<br />
t > , > , etc.<br />
t special : clock<br />
port direction<br />
SC_MODULE(accumulator)<br />
SC_MODULE(accumulator)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
(input)<br />
port type<br />
(input)<br />
sc_in<br />
sc_in<br />
In;<br />
In;<br />
sc_in<br />
sc_in<br />
Rst;<br />
Rst;<br />
sc_in_clk<br />
sc_in_clk<br />
Clk;<br />
Clk;<br />
...<br />
...// //<br />
ports<br />
ports<br />
(output)<br />
// (output)<br />
sc_out //<br />
input<br />
input<br />
ports<br />
ports<br />
sc_out<br />
Out;<br />
sc_in Out;<br />
sc_in<br />
In;<br />
In;<br />
sc_in //<br />
//<br />
local<br />
local<br />
member<br />
member<br />
functions<br />
sc_in<br />
Rst;<br />
Rst; functions<br />
sc_in_clk void<br />
void<br />
accumulate();<br />
sc_in_clk accumulate();<br />
Clk;<br />
Clk;<br />
void<br />
void<br />
display(ostream&<br />
display(ostream&<br />
=<br />
=<br />
cout);<br />
cout);<br />
// //<br />
output<br />
//<br />
local output<br />
ports<br />
local<br />
member ports<br />
member<br />
data<br />
sc_out data<br />
sc_out<br />
Out;<br />
int<br />
Acc_; Out;<br />
Acc_;<br />
// //<br />
//<br />
constructor<br />
//<br />
inout<br />
inout constructor<br />
ports;<br />
ports;<br />
sc_inout SC_CTOR(accumulator)<br />
SC_CTOR(accumulator)<br />
{<br />
sc_inout<br />
InOut;<br />
InOut; {<br />
... SC_METHOD(accumulate);<br />
... SC_METHOD(accumulate);<br />
sensitive_pos<br />
sensitive_pos<br />
Modules<br />
t<br />
Module Member functions<br />
o<br />
o<br />
Processes<br />
• functions registered with the <strong>SystemC</strong> kernel (see next)<br />
User defined functions<br />
• can be called within processes<br />
void<br />
void<br />
accumulator::accumulate()<br />
accumulator::accumulate()<br />
{<br />
{<br />
if<br />
if<br />
(Rst.read())<br />
(Rst.read())<br />
Acc_<br />
Acc_<br />
=<br />
=<br />
0;<br />
0;<br />
else<br />
else<br />
Acc_<br />
Acc_<br />
+=<br />
+=<br />
In.read();<br />
In.read();<br />
}<br />
}<br />
display();<br />
display();<br />
Out.write(Acc_);<br />
Out.write(Acc_);<br />
void<br />
void<br />
accumulator::display(ostream&<br />
accumulator::display(ostream&<br />
os)<br />
os)<br />
{<br />
{<br />
os<br />
os<br />
Modules<br />
t<br />
t<br />
Module Member data<br />
• to keep local state variable<br />
• not to be used for communication<br />
between processes<br />
Constructor<br />
• registers processes with<br />
the <strong>SystemC</strong> kernel<br />
• initializes whatever is needed<br />
(local member data)<br />
• to create and initialize an<br />
instance of a sub-module<br />
(connections, instance name)<br />
SC_MODULE(accumulator) SC_MODULE(accumulator) {<br />
{<br />
// // ports ports (input)<br />
(input)<br />
sc_in sc_in In;<br />
In;<br />
sc_in sc_in Rst;<br />
Rst;<br />
sc_in_clk sc_in_clk Clk;<br />
Clk;<br />
// // ports ports (output)<br />
(output)<br />
sc_out sc_out Out;<br />
Out;<br />
// // local local member member functions<br />
functions<br />
void void accumulate();<br />
accumulate();<br />
void void display(ostream& display(ostream& = = cout);<br />
cout);<br />
// // local local member member data<br />
data<br />
int int Acc_;<br />
Acc_;<br />
// // constructor<br />
constructor<br />
SC_CTOR(accumulator) SC_CTOR(accumulator) {<br />
{<br />
SC_METHOD(accumulate);<br />
SC_METHOD(accumulate);<br />
sensitive_pos sensitive_pos
Modules<br />
t<br />
Hierarchy of Modules<br />
o<br />
o<br />
In<br />
Th<br />
Module instances<br />
Signals<br />
• carry data between modules<br />
and between processes<br />
top<br />
accumulator<br />
A<br />
Intern<br />
comparator<br />
C<br />
submodules<br />
internal signal<br />
Out<br />
SC_MODULE(top)<br />
SC_MODULE(top)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
sc_in<br />
sc_in<br />
In;<br />
In;<br />
...<br />
...<br />
//<br />
//<br />
module<br />
module<br />
instances<br />
instances<br />
accumulator<br />
accumulator<br />
A;<br />
A;<br />
comparator<br />
comparator<br />
C;<br />
C;<br />
//<br />
//<br />
signals<br />
signals<br />
sc_signal<br />
sc_signal<br />
Intern;<br />
Intern;<br />
submodule<br />
name<br />
//<br />
//<br />
constructor<br />
constructor<br />
SC_CTOR(top):<br />
SC_CTOR(top):<br />
A(“A”),<br />
A(“A”),<br />
C(“C”)<br />
C(“C”)<br />
{<br />
{<br />
A.In(In);<br />
A.In(In);<br />
A.Out(Intern);<br />
A.Out(Intern);<br />
...<br />
...<br />
}<br />
}<br />
};<br />
};<br />
connections<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 12
Modules<br />
t Top level “sc“<br />
sc_main()”<br />
SystemInput<br />
• instances of modules<br />
• connectivity at top-level<br />
• clock object<br />
clk<br />
In<br />
Out<br />
top<br />
A<br />
tb<br />
Gererator Analyzer<br />
W<br />
accumulator<br />
Intern<br />
R<br />
comparator<br />
C<br />
In<br />
SystemOutput<br />
Out<br />
sc_main()<br />
sc_main()<br />
{<br />
{<br />
sc_clock<br />
sc_clock<br />
clk(“clk”,<br />
clk(“clk”,<br />
20,<br />
20,<br />
0.5,<br />
0.5,<br />
2,<br />
2,<br />
true);<br />
true);<br />
testbench<br />
testbench<br />
TB(“TB”);<br />
TB(“TB”);<br />
TB.In(SystemOutput);<br />
TB.In(SystemOutput);<br />
...<br />
...<br />
top<br />
top<br />
Top(“Top”);<br />
Top(“Top”);<br />
Top.In(SystemInput);<br />
Top.In(SystemInput);<br />
...<br />
...<br />
sc_start(-1);<br />
sc_start(-1);<br />
}<br />
}<br />
clock<br />
Simulation<br />
start<br />
instances at<br />
top-level<br />
Th<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 13
Part III.<br />
t<br />
t<br />
t<br />
t<br />
Context<br />
Outline<br />
<strong>SystemC</strong> Language in practice<br />
<strong>SystemC</strong> as from the web<br />
• System design<br />
• Modules and hierarchy<br />
• Processes and concurrency<br />
• Data types<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
• The C++ behind <strong>SystemC</strong><br />
• Matlab front-end<br />
• Fixed and floating point models<br />
Summary<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 14
Processes<br />
t<br />
t<br />
t<br />
t<br />
t<br />
t<br />
Basic unit of execution<br />
Contained inside modules<br />
Functions with a specific type<br />
• method<br />
• thread<br />
• clocked thread<br />
• RPC<br />
SC_METHOD(name)<br />
SC_THREAD(name)<br />
SC_CTHREAD(name,clock)<br />
Not hierarchical<br />
communication done via signals, module ports<br />
<strong>SystemC</strong> takes care of scheduling the concurrent processes<br />
• sensitivity list<br />
• event on a signal in the list triggers the process<br />
è <strong>SystemC</strong> = Language (C++ Library) + Scheduler<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 15
Processes<br />
t<br />
Method<br />
• entire process executed once when a signal in its sensitivity list<br />
changes<br />
• can not be suspended<br />
• local variables loose their values between successive calls<br />
• most similar to a usual C++ function<br />
• fastest<br />
void<br />
void<br />
comparator::compare()<br />
comparator::compare()<br />
{<br />
{<br />
if<br />
if<br />
(Val.read()<br />
(Val.read()<br />
><br />
><br />
Th.read())<br />
Th.read())<br />
Result.write(true);<br />
Result.write(true);<br />
else<br />
else<br />
Result.write(false);<br />
Result.write(false);<br />
}<br />
}<br />
method process<br />
declaration<br />
.cc file<br />
sensitivity list<br />
SC_MODULE(comparator)<br />
SC_MODULE(comparator)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
sc_in<br />
sc_in<br />
Val;<br />
Val;<br />
sc_in<br />
sc_in<br />
Th;<br />
Th;<br />
sc_out<br />
sc_out<br />
Result;<br />
Result;<br />
//<br />
//<br />
processes<br />
processes<br />
void<br />
void<br />
compare();<br />
compare();<br />
//<br />
//<br />
constructor<br />
constructor<br />
SC_CTOR(comparator)<br />
SC_CTOR(comparator)<br />
{<br />
{<br />
SC_METHOD(compare);<br />
SC_METHOD(compare);<br />
sensitive<br />
sensitive<br />
Processes<br />
t<br />
Thread<br />
• infinite loop limited by event boundaries: execution suspended by a<br />
wait() statement(s)<br />
• (re-)activated when any of the signals in the sensitivity list changes<br />
• local variables are saved (similar to static variables in C++<br />
functions)<br />
• slower than method with module data members to store the ‘state’<br />
void<br />
void<br />
decision::fsm()<br />
decision::fsm()<br />
{<br />
{<br />
int<br />
int<br />
a,<br />
a,<br />
b;<br />
b;<br />
//<br />
//<br />
local<br />
local<br />
variables<br />
variables<br />
state_<br />
state_<br />
=<br />
=<br />
…;<br />
…;<br />
//<br />
//<br />
initial<br />
initial<br />
state<br />
state<br />
while(true)<br />
while(true)<br />
{<br />
{<br />
wait();<br />
wait();<br />
a<br />
a<br />
=<br />
=<br />
a_in.read();<br />
a_in.read();<br />
b<br />
b<br />
=<br />
=<br />
b_in.read();<br />
b_in.read();<br />
if<br />
if<br />
(…)<br />
(…)<br />
state_<br />
state_<br />
=<br />
=<br />
…;<br />
…;<br />
elseif<br />
elseif<br />
(…)<br />
(…)<br />
state_<br />
state_<br />
=<br />
=<br />
…;<br />
…;<br />
else<br />
else<br />
state_<br />
state_<br />
=<br />
=<br />
…;<br />
…;<br />
}<br />
}<br />
infinite loop<br />
thread process<br />
declaration<br />
sensitivity list<br />
SC_MODULE(decision)<br />
SC_MODULE(decision)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
sc_in<br />
sc_in<br />
Sensor_in;<br />
Sensor_in;<br />
sc_in<br />
sc_in<br />
a_in;<br />
a_in;<br />
sc_in<br />
sc_in<br />
b_in;<br />
b_in;<br />
//<br />
//<br />
processes<br />
processes<br />
void<br />
void<br />
fsm();<br />
fsm();<br />
thread<br />
process<br />
name<br />
//<br />
//<br />
constructor<br />
constructor<br />
SC_CTOR(decision)<br />
SC_CTOR(decision)<br />
{<br />
{<br />
SC_THREAD(fsm);<br />
SC_THREAD(fsm);<br />
sensitive<br />
sensitive<br />
Processes<br />
t<br />
Clocked thread<br />
• particular thread :<br />
infinite loop,<br />
sensitive only to one edge of one clock<br />
• suspended by<br />
t wait() or<br />
t wait(int<br />
int) ) or<br />
t wait_until()<br />
• only synchronous systems<br />
• slowest<br />
SC_MODULE(decision)<br />
SC_MODULE(decision)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
sc_in_clk<br />
sc_in_clk<br />
clk;<br />
clk;<br />
...<br />
...<br />
};<br />
};<br />
//<br />
//<br />
processes<br />
processes<br />
void<br />
void<br />
fsm();<br />
fsm();<br />
clocked thread<br />
process declaration<br />
//<br />
//<br />
constructor<br />
constructor<br />
SC_CTOR(decision)<br />
SC_CTOR(decision)<br />
{<br />
{<br />
SC_CTHREAD(fsm,<br />
SC_CTHREAD(fsm,<br />
clk.pos());<br />
clk.pos());<br />
}<br />
}<br />
...<br />
...<br />
thread<br />
process<br />
name<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 18
Processes<br />
t<br />
Remote procedure call (RPC)<br />
• abstract communication and<br />
execution semantics for functional level<br />
• master/slave ports and processes<br />
• RPC chain<br />
master<br />
process<br />
master<br />
port<br />
link<br />
process 1 process 2<br />
slave<br />
port<br />
slave<br />
process<br />
SC_MODULE(M1)<br />
SC_MODULE(M1)<br />
{<br />
{<br />
sc_outmaster<br />
sc_outmaster<br />
Out;<br />
Out;<br />
...<br />
...<br />
void<br />
void<br />
process1();<br />
process1();<br />
SC_CTOR(M1)<br />
SC_CTOR(M1)<br />
{<br />
{<br />
SC_METHOD(process1);<br />
SC_METHOD(process1);<br />
sensitive<br />
sensitive<br />
Processes<br />
t<br />
Remote procedure call (RPC)<br />
• Equivalent to function call but without function pointer<br />
• Structure is key for re-use (split behaviour of modules)<br />
• Concurrent RPC chains<br />
concurrent<br />
processes<br />
slave<br />
processes<br />
process A1<br />
process A2<br />
process B1 process B2 process B3<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 20
Processes<br />
t<br />
Remote procedure call (RPC)<br />
• Equivalent to function call but without function pointer<br />
• Structure is key for re-use (split behaviour of modules)<br />
• Concurrent RPC chains<br />
concurrent<br />
processes<br />
slave<br />
processes<br />
Producer() Write() ; Read() Consumer()<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 21
Part III.<br />
t<br />
t<br />
t<br />
t<br />
Context<br />
Outline<br />
<strong>SystemC</strong> Language in practice<br />
<strong>SystemC</strong> as from the web<br />
• System design<br />
• Modules and hierarchy<br />
• Processes and concurrency<br />
• Data types<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
• The C++ behind <strong>SystemC</strong><br />
• Matlab front-end<br />
• Fixed and floating point models<br />
Summary<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 22
Data types<br />
t<br />
t<br />
t<br />
C++ data types<br />
• int , double , etc…<br />
<strong>SystemC</strong> data types (slower, but … link to implementation)<br />
• scalar types<br />
sc_bit {0,1}<br />
- sc_logic {0,1,X,Z}<br />
• bit and logic vector types<br />
sc_bv<br />
bv<br />
- sc_lv<br />
lv<br />
• integer types<br />
sc_int<br />
- sc_uint<br />
: 64 or 32-bit<br />
sc_bigint<br />
- sc_biguint<br />
: > 64-bit<br />
• fixed point types<br />
sc_fixed<br />
User defined data types<br />
(faster)<br />
- sc_ufixed<br />
- sc_fix<br />
- sc_ufix<br />
e.g. Symbol64C = { 64 complex samples of sc_fixed }<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 23
Data types<br />
t<br />
Fixed point types<br />
Parameters<br />
sc_fixed ( wl , iwl , q_mode , o_mode [, n_bits] ) sig ;<br />
Example<br />
sc_fixed ( 3 , 2 , SC_TRN , SC_WRAP ) Cnt ;<br />
Cnt =<br />
CntF<br />
+1,5 = "01.1" 1,500<br />
-0,5 = "11.1" -0,500<br />
+0,5 = "00.1" 0,832<br />
+1,5 = "01.1" 1,500<br />
fixed point<br />
value Cnt<br />
01.1<br />
01.0<br />
00.1<br />
00.0<br />
11.1<br />
floating point<br />
value CntF<br />
Cnt =<br />
Cnt + Cnt<br />
-2,0 = "10.0" "01.1"+"00.1"<br />
11.0<br />
10.1<br />
10.0<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 24
Part III.<br />
t<br />
t<br />
t<br />
t<br />
Context<br />
Outline<br />
<strong>SystemC</strong> Language in practice<br />
<strong>SystemC</strong> as from the web<br />
• System design<br />
• Modules and hierarchy<br />
• Processes and concurrency<br />
• Data types<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
• The C++ behind <strong>SystemC</strong><br />
• Matlab front-end<br />
• Fixed and floating point models<br />
Summary<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 25
<strong>SystemC</strong> and C++<br />
t<br />
<strong>SystemC</strong> is based on C++<br />
• Standard Template Library (vector, map, strings, etc.)<br />
• streams<br />
• templates<br />
• constructors and destructors<br />
• inheritance and composition<br />
• function and operator overloading<br />
• exception handling<br />
• C++ data type: bool<br />
• casting operators<br />
• …<br />
è Easy to add features to <strong>SystemC</strong><br />
Example 1<br />
Example 2<br />
Example 3<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 26
<strong>SystemC</strong> and C++<br />
t<br />
Example 1: template modules<br />
//<br />
//<br />
template<br />
template<br />
module:<br />
module:<br />
definition<br />
definition<br />
of<br />
of<br />
a<br />
a<br />
mux<br />
mux<br />
with<br />
with<br />
any<br />
any<br />
//<br />
//<br />
desirable<br />
desirable<br />
type<br />
type<br />
of<br />
of<br />
signal<br />
signal<br />
template<br />
template<br />
<br />
class<br />
class<br />
mux:<br />
mux:<br />
sc_module<br />
sc_module<br />
{<br />
{<br />
//<br />
//<br />
inputs<br />
inputs<br />
sc_in<br />
sc_in<br />
Input1;<br />
Input1;<br />
sc_in<br />
sc_in<br />
Input2;<br />
Input2;<br />
sc_in<br />
sc_in<br />
Selector;<br />
Selector;<br />
//<br />
//<br />
outputs<br />
outputs<br />
sc_out<br />
sc_out<br />
Output;<br />
Output;<br />
void<br />
void<br />
process()<br />
process()<br />
{<br />
{<br />
if<br />
if<br />
(Selector.read())<br />
(Selector.read())<br />
Output<br />
Output<br />
=<br />
=<br />
Input2.read();<br />
Input2.read();<br />
else<br />
else<br />
Output<br />
Output<br />
=<br />
=<br />
Input1.read();<br />
Input1.read();<br />
}<br />
}<br />
SC_CTOR(mux)<br />
SC_CTOR(mux)<br />
{<br />
{<br />
SC_METHOD(process);<br />
SC_METHOD(process);<br />
sensitive<br />
sensitive<br />
<strong>SystemC</strong> and C++<br />
t<br />
Example 2: inheritance<br />
definition of<br />
base module<br />
definition of derived module<br />
SC_MODULE(ResetFF):<br />
SC_MODULE(ResetFF):<br />
public<br />
public<br />
FF<br />
FF<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
sc_in<br />
sc_in<br />
Rst;<br />
Rst;<br />
//<br />
//<br />
process<br />
process<br />
void<br />
void<br />
process_reset()<br />
process_reset()<br />
{<br />
{<br />
if<br />
if<br />
(Rst.read())<br />
(Rst.read())<br />
Q.write(0);<br />
Q.write(0);<br />
}<br />
}<br />
//<br />
//<br />
constructor<br />
constructor<br />
SC_CTOR(ResetFF):<br />
SC_CTOR(ResetFF):<br />
FF(“FF”)<br />
FF(“FF”)<br />
{<br />
{<br />
SC_METHOD(process_reset);<br />
SC_METHOD(process_reset);<br />
sensitive<br />
sensitive<br />
<strong>SystemC</strong> and C++<br />
t Example 3: destructor<br />
• useful in testbench<br />
t dump simulation results<br />
• useful for high-level models<br />
t dynamic memory allocation<br />
at constructor<br />
time<br />
at simulation<br />
time<br />
SC_MODULE(testbench)<br />
SC_MODULE(testbench)<br />
{<br />
{<br />
...<br />
...<br />
SC_CTOR(testbench)<br />
SC_CTOR(testbench)<br />
{<br />
{<br />
//<br />
//<br />
load<br />
load<br />
stimuli<br />
stimuli<br />
for<br />
for<br />
DUT<br />
DUT<br />
}<br />
}<br />
~testbench()<br />
~testbench()<br />
{<br />
{<br />
//<br />
//<br />
dump<br />
dump<br />
outputs<br />
outputs<br />
of<br />
of<br />
DUT<br />
DUT<br />
}<br />
}<br />
};<br />
};<br />
DUT<br />
at destructor<br />
time<br />
TB<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 29
Part III.<br />
t<br />
t<br />
t<br />
t<br />
Context<br />
Outline<br />
<strong>SystemC</strong> Language in practice<br />
<strong>SystemC</strong> as from the web<br />
• System design<br />
• Modules and hierarchy<br />
• Processes and concurrency<br />
• Data types<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
• The C++ behind <strong>SystemC</strong><br />
• Matlab front-end<br />
• Fixed and floating point models<br />
Summary<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 30
Matlab front-end<br />
t Facts :<br />
t<br />
• Matlab is used for algorithmic development<br />
• <strong>SystemC</strong> from the web has no GUI<br />
Use Matlab to create :<br />
• as main goal :<br />
Seamless design development<br />
from Matlab ( system:algorithmic level )<br />
to <strong>SystemC</strong> ( system:architectural level )<br />
• as side-effect effect :<br />
a mathematical & graphical analysis environment<br />
in <strong>SystemC</strong><br />
<strong>SystemC</strong><br />
Matlab<br />
UTF<br />
TF<br />
Algorithmic<br />
Design and<br />
Validation<br />
System<br />
Design and<br />
Validation<br />
è Use Matlab API-functions in <strong>SystemC</strong> testbenches<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 31
Matlab front-end<br />
t<br />
from Matlab (system:algorithmic level)<br />
to <strong>SystemC</strong> (system:architectural level)<br />
<strong>SystemC</strong> model<br />
DUT<br />
matlab<br />
.mat<br />
.mat<br />
matlab<br />
TB<br />
matlab API<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 32
Matlab front-end<br />
t<br />
Matlab used as mathematical & graphical analysis<br />
environment<br />
.mat<br />
DUT<br />
v1<br />
TB<br />
DUT<br />
v2<br />
.mat<br />
v1<br />
matlab<br />
TB<br />
.mat<br />
v2<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 33
Matlab front-end<br />
t Example :<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 34
Part III.<br />
t<br />
t<br />
t<br />
t<br />
Context<br />
Outline<br />
<strong>SystemC</strong> Language in practice<br />
<strong>SystemC</strong> as from the web<br />
• System design<br />
• Modules and hierarchy<br />
• Processes and concurrency<br />
• Data types<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
• The C++ behind <strong>SystemC</strong><br />
• Matlab front-end<br />
• Fixed and floating point models<br />
Summary<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 35
Fixed and floating point<br />
t Features of fixed point representation :<br />
• numerical range<br />
• required precision<br />
• for operations : quantization and overflow behaviour<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 36
Fixed and floating point<br />
t Features of fixed point representation :<br />
• slope/bias scaling:<br />
fixed and floating point values are linked<br />
via a scaling factor and a bias<br />
Q<br />
fix. point<br />
value ~ V<br />
0.01<br />
0.10<br />
0.11<br />
slope S<br />
0.00<br />
1.10<br />
1.11<br />
fl. point<br />
value V<br />
1.01<br />
1.00<br />
B = 0<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 37
t Example :<br />
Fixed and floating point<br />
• sensor measuring water temperature<br />
• range is limited: 0 to 100 ºC<br />
• bias is 0<br />
• to be mapped onto 8 bits unsigned<br />
6 1 bit ⇔ 1 C leads to a waste of precision<br />
4 1 bit ⇔ 100/255 C is better<br />
fixed point value<br />
(bits)<br />
00000110 00000000 0°C 0°C<br />
00000101<br />
00000100<br />
00000011<br />
00000010<br />
00000001<br />
00000000<br />
slope = 100/255 [ C/bit]<br />
fl. point value<br />
(degrees)<br />
00000001 1°C 0.4°C<br />
00000010 2°C 0.8°C<br />
…<br />
6<br />
4<br />
01100100 100°C 39.2°C<br />
…<br />
11111111 imposs. 100°C<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 38
Fixed and floating point<br />
t<br />
<strong>SystemC</strong> enables fixed point or floating point models<br />
float<br />
DUT<br />
floating<br />
point<br />
gradual<br />
refinement<br />
.mat<br />
TB<br />
.mat<br />
float<br />
matlab<br />
DUT<br />
fixed<br />
point<br />
fixed<br />
TB<br />
.mat<br />
fixed<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 39
Fixed and floating point<br />
t Example :<br />
SC_MODULE(accumulator)<br />
SC_MODULE(accumulator)<br />
{<br />
{<br />
//<br />
//<br />
input<br />
input<br />
ports<br />
ports<br />
sc_in<br />
sc_in<br />
In;<br />
In;<br />
sc_in<br />
sc_in<br />
Rst;<br />
Rst;<br />
sc_in_clk<br />
sc_in_clk<br />
Clk;<br />
Clk;<br />
//<br />
//<br />
output<br />
output<br />
ports<br />
ports<br />
sc_out<br />
sc_out<br />
Out;<br />
Out;<br />
//<br />
//<br />
processes<br />
processes<br />
void<br />
void<br />
process();<br />
process();<br />
//<br />
//<br />
constructor<br />
constructor<br />
SC_CTOR(accumulator)<br />
SC_CTOR(accumulator)<br />
{<br />
{<br />
SC_METHOD(process);<br />
SC_METHOD(process);<br />
sensitive_pos<br />
sensitive_pos<br />
Fixed and floating point<br />
t<br />
t<br />
Our goal: have single model<br />
which can easily simulate both precisions<br />
Easy solution: pre-processor<br />
processor<br />
DUT<br />
floating<br />
point<br />
.mat<br />
TB<br />
.mat<br />
float<br />
matlab<br />
selection<br />
by means of<br />
pre-processor<br />
DUT<br />
fixed<br />
point<br />
TB<br />
.mat<br />
fixed<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 41
Fixed and floating point<br />
t<br />
Easy solution: pre-processor<br />
processor<br />
either floating point or fixed point;<br />
selection by means of preprocessor<br />
t<br />
SC_MODULE(SR_shift_reg)<br />
SC_MODULE(SR_shift_reg)<br />
{<br />
{<br />
//<br />
//<br />
inputs<br />
inputs<br />
sc_in<br />
Sample_In;<br />
Sample_In;<br />
};<br />
};<br />
//<br />
//<br />
outputs<br />
outputs<br />
sc_out<br />
SamplesForSR_1_Out;<br />
SamplesForSR_1_Out;<br />
sc_out<br />
SamplesForSR_2_Out;<br />
SamplesForSR_2_Out;<br />
...<br />
...<br />
But …<br />
and but …<br />
and but ...<br />
precision dependent<br />
operations<br />
#if<br />
#if<br />
FINITE<br />
FINITE<br />
cout<br />
cout<br />
Fixed and floating point<br />
t<br />
AME solution: new data type<br />
• carrying BOTH floating and fixed point value,<br />
and the associated slope<br />
• conditions evaluated using the fixed or the floating point value,<br />
depending on a precision mode flag<br />
DUT<br />
fl. point<br />
TB<br />
DUT<br />
fx. point<br />
.mat<br />
DUT<br />
floating &<br />
fixed point<br />
TB<br />
.mat<br />
fl&fx<br />
matlab<br />
TB<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 43
Fixed and floating point<br />
t<br />
Definition<br />
fx_double<br />
floating point value<br />
scale<br />
fixed point value<br />
fixed point parameters<br />
precision mode<br />
double<br />
double<br />
bits<br />
word length, quantization mode, overflow mode<br />
flag: floating or fixed point mode<br />
t<br />
Example of arithmetic operation<br />
25.36 [°C]<br />
100/255 [°C/bit]<br />
b#01000000 (⇔ 25.1 [°C])<br />
<br />
Floating mode<br />
45 [°C]<br />
100/255 [°C/bit]<br />
b#01110010 (⇔ 44.7 [°C])<br />
<br />
Floating mode<br />
+ =<br />
70.36 [°C]<br />
100/255 [°C/bit]<br />
b#10110010 (⇔ 69.8 [°C])<br />
<br />
Floating mode<br />
note: 70.36 [°C] / (100/255 [°C/bit] ) = b#10110011<br />
propagation<br />
of rounding<br />
errors<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 44
Fixed and floating point<br />
t<br />
Example of relational operation<br />
25.36 [°C]<br />
100/255 [°C/bit]<br />
b#01000000 (⇔ 25.1 [°C])<br />
<br />
Floating point mode<br />
><br />
25.2 [°C]<br />
100/255 [°C/bit]<br />
b#01000000 (⇔ 25.1 [°C])<br />
<br />
Floating point mode<br />
Yes<br />
25.36 [°C]<br />
100/255 [°C/bit]<br />
b#01000000 (⇔ 25.1 [°C])<br />
<br />
Fixed point mode<br />
><br />
25.2 [°C]<br />
100/255 [°C/bit]<br />
b#01000000 (⇔ 25.1 [°C])<br />
<br />
Fixed point mode<br />
No<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 45
Fixed and floating point<br />
t Example :<br />
both floating point and fixed point<br />
SC_MODULE(SR_shift_reg)<br />
SC_MODULE(SR_shift_reg)<br />
{<br />
{<br />
//<br />
//<br />
inputs<br />
inputs<br />
sc_in<br />
Sample_In;<br />
Sample_In;<br />
//<br />
//<br />
outputs<br />
outputs<br />
sc_out<br />
SamplesForSR_1_Out;<br />
SamplesForSR_1_Out;<br />
sc_out<br />
SamplesForSR_2_Out;<br />
SamplesForSR_2_Out;<br />
…<br />
…<br />
};<br />
};<br />
precision independent<br />
operations<br />
cout<br />
cout<br />
Fixed and floating point<br />
t<br />
Pros of AME’s solution :<br />
• single executable model for both precisions<br />
• dynamic and automatically computed slopes<br />
(e.g. multiplication : slopes are multiplied )<br />
• strong type checking<br />
(e.g. addition : forbidden to have a scaling factor mismatch)<br />
• single data type → single operations for fixed and floating point<br />
• no discrepancy in code while using debugger<br />
(since pre-processor processor is not used)<br />
• clean module interfaces, all based on the AME proprietary type<br />
• single function in the testbench dumping any received signal<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 47
Summary<br />
t<br />
t<br />
<strong>SystemC</strong> as from the web<br />
• has necessary features to describe <strong>Systems</strong> (Hw(<br />
Hw, Fw, Sw)<br />
• procedural language with path to implementation<br />
• different levels of abstraction<br />
• together with the language also reference simulator<br />
• C++ based and therefore easily extendable<br />
Alcatel <strong>Microelectronic</strong>s extensions<br />
• The C++ behind <strong>SystemC</strong><br />
• Matlab front-end<br />
• Fixed and floating point models<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part III - slide 48
Part IV.<br />
AME’s System Design<br />
Methodology in Practice<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 1
Outline<br />
Part IV. AME’s System Design Methodology in Practice<br />
t<br />
Simplified section tutorial example<br />
• The complex multiplier example<br />
t<br />
<strong>SystemC</strong> executable spec: modelling and simulation<br />
t<br />
<strong>SystemC</strong> co-simulation<br />
t<br />
Summary<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 2
<strong>Tutorial</strong> Example<br />
The Complex MPY Section<br />
Complex Multiplier<br />
TimeD<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
FF<br />
OI<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Master/Slave<br />
CMPY<br />
LCtrl<br />
DPRam<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
F<br />
I<br />
F<br />
O<br />
Coeff<br />
Coeff<br />
FFT<br />
LCtrl<br />
DPRam<br />
Processor<br />
UpdateConfig<br />
F<br />
I<br />
F<br />
O<br />
Result<br />
DataPath<br />
LCtrl<br />
FreqD1<br />
LCtrl<br />
DPRam<br />
Master/Slave<br />
Link<br />
ConfigUpdated<br />
Operational & TestBench FirmWare<br />
Processor<br />
F<br />
I<br />
F<br />
O<br />
Operational FW & TestBench<br />
Through Pointers<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
LCtrl<br />
DPRam<br />
HW<br />
FW<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 3
<strong>Tutorial</strong> Example<br />
The Complex MPY Section<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Master/Slave<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
UpdateConfig<br />
Complex Multiplier<br />
Coeff<br />
Coeff<br />
Result<br />
DataPath<br />
LCtrl<br />
Processor<br />
Operational FW & TestBench<br />
SC_MODULE(CMPY_LCtrl)<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
//<br />
//<br />
...<br />
...<br />
SC_MODULE(CMPY_LCtrl) }<br />
SC_MODULE(CMPY_LCtrl) }<br />
{<br />
{<br />
//<br />
Master/Slave //<br />
ports<br />
Fports<br />
SC_MODULE(CMPY_DPath) sc_inmaster SC_MODULE(CMPY_DPath)<br />
SC_MODULE(CMPY_DPath)<br />
{<br />
sc_inmaster<br />
UpdateConfig;<br />
SC_MODULE(CMPY_DPath)<br />
{<br />
Link I<br />
{ UpdateConfig; {<br />
// sc_outmaster<br />
sc_outmaster<br />
//<br />
//<br />
...<br />
...<br />
ConfigUpdated;<br />
//<br />
ports<br />
ports ConfigUpdated;<br />
sc_inmaster sc_outmaster }<br />
sc_outmaster } F Update;<br />
sc_inmaster Update; D_In;<br />
D_In;<br />
sc_outmaster<br />
sc_outmaster<br />
D_Out;<br />
O D_Out;<br />
sc_inslave sc_inmaster //<br />
//<br />
FIFO<br />
FIFO<br />
type<br />
type<br />
is<br />
is<br />
Symbol64C.<br />
sc_inmaster Symbol64C.<br />
notEmpty,<br />
notEmpty,<br />
notFull;<br />
sc_inslave<br />
Enable;<br />
Enable; notFull;<br />
sc_inslave sc_outmaster //<br />
//<br />
Multiplication<br />
Multiplication<br />
is<br />
is<br />
performed<br />
performed<br />
for<br />
for<br />
64<br />
sc_outmaster<br />
Enable;<br />
sc_inslave Enable; Update; 64<br />
//<br />
//<br />
complex<br />
complex<br />
samples<br />
samples<br />
in<br />
Update;<br />
... ...<br />
in<br />
just<br />
just<br />
one<br />
one<br />
Enable.<br />
... ...<br />
Enable.<br />
// SC_MODULE(CMPY)<br />
SC_MODULE(CMPY)<br />
{<br />
//<br />
local<br />
local<br />
member<br />
member<br />
data<br />
data{<br />
Symbol64C void<br />
void<br />
//<br />
//<br />
control(); ports<br />
control(); ports<br />
//<br />
//<br />
process<br />
Symbol64C<br />
coef_;<br />
coef_; process<br />
// sc_inmaster<br />
sc_inmaster<br />
<br />
<br />
Full_In;<br />
//<br />
configuration<br />
configuration<br />
access<br />
access<br />
via<br />
via Full_In; pointer<br />
pointer<br />
config_CMPY& SC_CTOR(CMPY_LCtrl) sc_inmaster<br />
sc_inmaster<br />
<br />
<br />
Empty_In;<br />
SC_CTOR(CMPY_LCtrl)<br />
{<br />
config_CMPY&<br />
configClass_;<br />
configClass_; { Empty_In;<br />
SC_THREAD(control);<br />
SC_THREAD(control);<br />
... sc_inmaster sensitive_pos<br />
sc_inmaster<br />
<br />
<br />
Mult_In;<br />
sensitive_pos<br />
Outline<br />
Part IV. AME’s System Design Methodology in Practice<br />
t<br />
Simplified section tutorial example<br />
t<br />
t<br />
t<br />
<strong>SystemC</strong> executable spec: modelling and simulation<br />
• Top Level Integration<br />
• Master/Slave Library<br />
• Documented methodology<br />
• Testbench Strategy<br />
• Different levels of abstraction<br />
<strong>SystemC</strong> co-simulation<br />
Summary<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 5
<strong>SystemC</strong> Executable Spec<br />
Top level integration<br />
t<br />
The Complex-MPY as one of the sections at top level<br />
F I F<br />
O<br />
TimeD<br />
TimeD<br />
LCtrl<br />
DPRAM<br />
F<br />
I<br />
F<br />
O<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
Parameter Passing through Pointers<br />
LCtrl<br />
DPRAM<br />
F<br />
I<br />
F<br />
O<br />
Master/Slave<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
UpdateConfig<br />
Complex Multiplier<br />
FFT<br />
Coeff<br />
Coeff<br />
LCtrl<br />
DPRAM<br />
Processor<br />
F<br />
I<br />
F<br />
O<br />
Result<br />
DataPath<br />
LCtrl<br />
Processor<br />
Master/Slave<br />
Link<br />
FreqD1<br />
LCtrl<br />
DPRAM<br />
ConfigUpdated<br />
Operational & TestBench FirmWare<br />
Through Pointers<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
LCtrl<br />
FFT<br />
DPRAM<br />
HW<br />
FW<br />
F I F<br />
O<br />
Complex Multiplier Example<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 6
Integration Methodology<br />
HW/FW interface-1<br />
t<br />
t<br />
t<br />
The communication is<br />
always with M/S ports<br />
The communication is<br />
based on a<br />
configuration which is<br />
a C++ class<br />
FW accesses HW<br />
using C++ pointers.<br />
Configuration access<br />
is based on C++<br />
pointers.<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Master/Slave<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
UpdateConfig<br />
Complex Multiplier<br />
Coeff<br />
Coeff<br />
Result<br />
DataPath<br />
LCtrl<br />
Processor<br />
Master/Slave<br />
Link<br />
ConfigUpdated<br />
Through Pointers<br />
F<br />
I<br />
F<br />
O<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 7
Integration Methodology<br />
HW/FW interface-2<br />
t<br />
t<br />
Soft reset is a<br />
command sent to HW<br />
by FW and has the<br />
highest priority<br />
among other<br />
commands.<br />
“watching”<br />
mechanism can also<br />
be used for IRQ<br />
modelling, , FW to FW<br />
and/or HW to FW.<br />
• Check first if your<br />
cosim tool supports<br />
this feature!<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Master/Slave<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
UpdateConfig<br />
Complex Multiplier<br />
Coeff<br />
Coeff<br />
Result<br />
DataPath<br />
LCtrl<br />
Processor<br />
Master/Slave<br />
Link<br />
ConfigUpdated<br />
Through Pointers<br />
F<br />
I<br />
F<br />
O<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 8
Integration Methodology<br />
M/S Ports-1<br />
t<br />
HW-FW interface at the top-level<br />
• Always M/S communication is used<br />
Advantage!<br />
t<br />
COMMUNICATION IS SEPARATED FROM BEHAVIOR<br />
Advantage of using different abstraction levels<br />
• All abstraction levels communicate using M/S communication<br />
TF<br />
CA<br />
TF<br />
CA<br />
TF<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 9
Integration Methodology<br />
M/S Ports-2<br />
t<br />
t<br />
Well suited to FW-FW,<br />
FW,<br />
HW-FW and HW-HW<br />
interfaces<br />
Facilitates the communication<br />
between modules. Hides<br />
unnecessary implementation<br />
details.<br />
• Allows quick model<br />
development<br />
• Trade-off analysis for HW-FW<br />
partitioning<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Master/Slave<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
UpdateConfig<br />
Complex Multiplier<br />
Coeff<br />
Coeff<br />
Result<br />
DataPath<br />
LCtrl<br />
Processor<br />
Master/Slave<br />
Link<br />
ConfigUpdated<br />
Through Pointers<br />
F<br />
I<br />
F<br />
O<br />
• Resource allocation decisions<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 10
Integration Methodology<br />
M/S Ports-3<br />
t<br />
t<br />
t<br />
Ability to refine functional<br />
communication at the later<br />
stages of the design to BCA<br />
Benefits of separation of<br />
communication from behaviour<br />
• Embedding of IP blocks<br />
• Refining communication<br />
Only “sc_link_mp” is supported<br />
by our CoSim tool<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Master/Slave<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
UpdateConfig<br />
Complex Multiplier<br />
Coeff<br />
Coeff<br />
Result<br />
DataPath<br />
LCtrl<br />
Processor<br />
Master/Slave<br />
Link<br />
ConfigUpdated<br />
Through Pointers<br />
F<br />
I<br />
F<br />
O<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 11
<strong>SystemC</strong> Executable Spec<br />
M/S Library<br />
Complex Multiplier<br />
F<br />
I<br />
F<br />
O<br />
Link<br />
Coeff<br />
Result<br />
Link<br />
F<br />
I<br />
F<br />
O<br />
Master/Slave<br />
Master/Slave<br />
SC_MODULE(CMPY_LCtrl)<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
//<br />
//<br />
...<br />
...<br />
}<br />
}<br />
SC_MODULE(CMPY_DPath)<br />
SC_MODULE(CMPY_DPath)<br />
{<br />
{<br />
//<br />
//<br />
...<br />
...<br />
}<br />
}<br />
SC_MODULE(CMPY)<br />
SC_MODULE(CMPY)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
sc_inmaster<br />
sc_inmaster<br />
<br />
<br />
Full_In;<br />
Full_In;<br />
sc_inmaster<br />
sc_inmaster<br />
<br />
<br />
Empty_In;<br />
Empty_In;<br />
sc_inmaster<br />
sc_inmaster<br />
<br />
<br />
Mult_In;<br />
Mult_In;<br />
sc_outmaster<br />
sc_outmaster<br />
Mult_Out;<br />
Mult_Out;<br />
Parameter Passing through Pointers<br />
(Invisible at the<br />
block boundaries)<br />
UpdateConfig<br />
Coeff<br />
DataPath<br />
LCtrl<br />
Processor<br />
ConfigUpdated<br />
Through Pointers<br />
sc_inmaster<br />
sc_inmaster<br />
<br />
<br />
UpdateConfig_In;<br />
UpdateConfig_In;<br />
sc_outmaster<br />
sc_outmaster<br />
ConfigUpdated_Out;<br />
ConfigUpdated_Out;<br />
//<br />
//<br />
...<br />
...<br />
}<br />
}<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 12
<strong>SystemC</strong> Executable Spec<br />
Documented Methodology<br />
t<br />
t<br />
t<br />
t<br />
t<br />
t<br />
<strong>SystemC</strong> Coding Style<br />
• A design guidelines and rules document to be used by the <strong>SystemC</strong> teams.<br />
Naming conventions, directory structure, code layout, etc.<br />
Block Diagram Conventions<br />
• Standardizes the drawing conventions.<br />
<strong>SystemC</strong> Coding Generics<br />
• Includes coding generics to facilitate the top-level integration at a later<br />
phase.<br />
Test Plan and Test Status<br />
README files<br />
Comments in the code<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 13
Documented Methodology<br />
What would happen...<br />
t<br />
...if we did not have <strong>SystemC</strong> Coding Style?<br />
• Everyone would use a different naming convention.<br />
• There will be no common directory structure when releasing the<br />
models.<br />
• When the codes are passed to the implementation team it would be<br />
a puzzle for them to figure out the followed conventions.<br />
• Problems would arise when sharing codes.<br />
t<br />
...if we did not have Block Diagram Conventions?<br />
• Everyone would use a different drawing convention.<br />
• This would create misunderstandings between the modelling teams<br />
and later for the implementation team.<br />
• As a result drawing a block diagram would lose its meaning as its<br />
aim is to facilitate of understanding the model later by someone else.<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 14
Documented Methodology<br />
Block Diagram Conventions<br />
Signal connection<br />
Processes in<br />
SC_CTOR like<br />
SC_CTHREAD,<br />
SC_THREAD,<br />
SC_METHOD. (Don't<br />
place process bubles<br />
for SC_SLAVE and<br />
other methods!)<br />
Instance Name<br />
Module Name<br />
master port name<br />
process_name()<br />
slave port name<br />
LAT<br />
THRxClk<br />
Latency of the<br />
process<br />
Throughput of the<br />
process<br />
Clock Name<br />
ConfigSR<br />
ShiftReg<br />
PortName_In<br />
PortName_Out<br />
Port Name<br />
Internal named signal<br />
Class_In<br />
Internal signal<br />
Classes with thick<br />
lines<br />
Write the external<br />
port name inside this.<br />
Hierarchical port<br />
connection. This port<br />
connects to upper<br />
level module.<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 15
Documented Methodology<br />
Complex Multiplier Block Diagram<br />
RxS3<br />
rx_s3<br />
mult<br />
multiplier<br />
Mult_In<br />
Mult_Out<br />
FIFO2<br />
fifo<br />
Enable_In<br />
SoftRst_In<br />
Update_In<br />
FIFO3<br />
fifo<br />
Data_In<br />
Data_Out<br />
Data_In<br />
Data_Out<br />
Full_Out<br />
Empty_Out<br />
UpdateConfig_In<br />
lctr<br />
lctrl_chproc<br />
Empty_In<br />
Enable_Out<br />
SoftRst_Out<br />
Update_Out<br />
Full_In<br />
Full_Out<br />
Empty_Out<br />
UpdateConfig_In<br />
UpdateConfig_In<br />
generate_enable<br />
1xClk20<br />
ConfigUpdated_Out<br />
RxS3CR1<br />
control_reg<br />
(C)<br />
C<br />
C<br />
RxS3CR2<br />
control_reg<br />
(C)<br />
testbench<br />
testbench<br />
RxFIFO2UpdateConfig_Out<br />
RxS3UpdateConfig_Out<br />
RxS3ConfigUpdated_In<br />
RxFIFO3UpdateConfig_Out<br />
Empty_In<br />
IRQ_GEN<br />
irq_gen<br />
Full_In<br />
Data_Out<br />
test_sequence<br />
1xClk200<br />
Data_In<br />
IRQ_In<br />
GPIO_In<br />
IRQ_Out<br />
GPIO_Out<br />
irq_gen()<br />
1xClk200<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 16
Documented Methodology<br />
What would happen...<br />
t<br />
...if we did not have <strong>SystemC</strong> Coding Generics?<br />
• Top level integration would be a nightmare!<br />
• A lot of things like common definitions, duplicate port, signal,<br />
module names had to be changed in the codes.<br />
• The changes would be done by the top level integrators, which is<br />
error prone, as they don’t know the details of the codes.<br />
• Or the section coders would make the changes to their codes, which<br />
would consume the project time.<br />
• There won’t be a reference document for the section coders, to<br />
consider top-level integration issues.<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 17
Documented Methodology<br />
What would happen...<br />
t<br />
...if we did not have Test Plan documents?<br />
• Supervisors would not easily understand how the model will be<br />
tested. They would not easily add or remove tests.<br />
• There would not be a track list during the testing of a model. This T<br />
would probably result in some of the tests to be forgotten.<br />
• There would not be a reference to see the results of the tests.<br />
• If later someone wanted to rerun the tests, he/she would go into the<br />
details of the testbench to learn how to run it. Time Consuming!<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 18
Outline<br />
Part IV. AME’s System Design Methodology in Practice<br />
t<br />
t<br />
t<br />
t<br />
Simplified section tutorial example<br />
<strong>SystemC</strong> executable spec: modelling and simulation<br />
• Top Level Integration<br />
• Master/Slave Library<br />
• Documented methodology<br />
• Different levels of abstraction<br />
t TF#1 - TF#2 - CA#1 -<br />
• Testbench Strategy<br />
<strong>SystemC</strong> co-simulation<br />
Summary<br />
CA#2<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 19
<strong>SystemC</strong> Executable Spec.<br />
TF#1 Model of ComplexMPY<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Master/Slave<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
UpdateConfig<br />
Complex Multiplier<br />
Coeff<br />
Coeff<br />
Result<br />
DataPath<br />
LCtrl<br />
Processor<br />
Operational FW & TestBench<br />
SC_MODULE(CMPY_LCtrl)<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
SC_MODULE(CMPY_DPath) sc_inmaster<br />
Master/Slave sc_inmaster<br />
UpdateConfig;<br />
SC_MODULE(CMPY_DPath)<br />
{<br />
F { UpdateConfig;<br />
// sc_outmaster<br />
sc_outmaster<br />
ConfigUpdated;<br />
//<br />
ports<br />
ports<br />
Link I<br />
ConfigUpdated;<br />
sc_inmaster sc_outmaster<br />
sc_outmaster<br />
Update;<br />
sc_inmaster Update; D_In;<br />
D_In;<br />
sc_outmaster<br />
sc_outmaster F D_Out;<br />
D_Out;<br />
sc_inslave sc_inmaster<br />
sc_inmaster<br />
notEmpty,<br />
O notEmpty,<br />
notFull;<br />
sc_inslave<br />
Enable;<br />
Enable; notFull;<br />
sc_inslave sc_outmaster<br />
sc_outmaster<br />
Enable;<br />
sc_inslave Enable; Update;<br />
Update;<br />
... ...<br />
... ...<br />
//<br />
//<br />
local<br />
local<br />
member<br />
member Enable data<br />
data multiply!<br />
Symbol64C void<br />
void<br />
control();<br />
control();<br />
//<br />
//<br />
process<br />
Symbol64C<br />
coef_;<br />
coef_; process<br />
//<br />
//<br />
configuration<br />
configuration<br />
access<br />
access<br />
via<br />
via<br />
pointer<br />
pointer<br />
config_CMPY& SC_CTOR(CMPY_LCtrl)<br />
SC_CTOR(CMPY_LCtrl)<br />
{<br />
config_CMPY&<br />
configClass_;<br />
configClass_; {<br />
SC_THREAD(control);<br />
SC_THREAD(control); CLK<br />
... sensitive_pos<br />
sensitive_pos<br />
t<br />
<strong>SystemC</strong> Executable Spec.<br />
TF#1 Model of ComplexMPY<br />
Multiply (64 complex samples) when Enable is triggered<br />
• Using “Slow” Functional clock CLK<br />
• Process execution time ==> 1 x wait() for a functional CLK tick<br />
void<br />
void<br />
CMPY_LCtrl::control()<br />
CMPY_LCtrl::control()<br />
{<br />
{<br />
}<br />
}<br />
while(true)<br />
while(true)<br />
{<br />
{<br />
if<br />
if<br />
(UpdateConfig.read())<br />
(UpdateConfig.read())<br />
{<br />
{<br />
Update.write(TRUE);<br />
Update.write(TRUE);<br />
ConfigUpdated.write(TRUE);<br />
ConfigUpdated.write(TRUE);<br />
}<br />
}<br />
if<br />
if<br />
(notEmpty.read()<br />
(notEmpty.read()<br />
&&<br />
&&<br />
notFull.read())<br />
notFull.read())<br />
{<br />
{<br />
Enable.write(TRUE);<br />
Enable.write(TRUE);<br />
}<br />
}<br />
wait();<br />
wait();<br />
//<br />
//<br />
Functional<br />
Functional<br />
clock<br />
clock<br />
CLK<br />
CLK<br />
void<br />
void<br />
CMPY_DPath::updCoef()<br />
CMPY_DPath::updCoef()<br />
{<br />
{<br />
}<br />
}<br />
if<br />
if<br />
(Update.read())<br />
(Update.read())<br />
{<br />
{<br />
coef_<br />
coef_<br />
=<br />
=<br />
configClass_.Coef();<br />
configClass_.Coef();<br />
}<br />
}<br />
0<br />
Result ready here!<br />
“Computed in ‘NoTime’ “<br />
1 2 63 64<br />
0 1 CLK<br />
SC_MODULE(CMPY_LCtrl)<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
sc_inmaster<br />
sc_inmaster<br />
UpdateConfig;<br />
UpdateConfig;<br />
sc_outmaster<br />
sc_outmaster<br />
ConfigUpdated;<br />
ConfigUpdated;<br />
sc_outmaster<br />
sc_outmaster<br />
Update;<br />
Update;<br />
sc_inmaster<br />
sc_inmaster<br />
notEmpty,<br />
notEmpty,<br />
notFull;<br />
notFull;<br />
sc_outmaster<br />
sc_outmaster<br />
Enable;<br />
Enable;<br />
...<br />
...<br />
void<br />
void<br />
control();<br />
control();<br />
//<br />
//<br />
process<br />
process<br />
SC_CTOR(CMPY_LCtrl)<br />
SC_CTOR(CMPY_LCtrl)<br />
{<br />
{<br />
SC_THREAD(control);<br />
SC_THREAD(control);<br />
sensitive_pos<br />
sensitive_pos<br />
t<br />
<strong>SystemC</strong> Executable Spec.<br />
TF#1 Model of ComplexMPY<br />
Multiply (64 complex samples) when Enable is triggered<br />
• Using “Slow” Functional clock CLK<br />
//<br />
• Process execution time ==> 1 x wait() for a functional //<br />
ports<br />
ports CLK tick<br />
SC_MODULE(CMPY_DPath)<br />
SC_MODULE(CMPY_DPath)<br />
{<br />
{<br />
sc_inmaster<br />
sc_inmaster<br />
D_In;<br />
D_In;<br />
sc_outmaster<br />
SC_MODULE(CMPY_LCtrl) sc_outmaster<br />
D_Out;<br />
SC_MODULE(CMPY_LCtrl)<br />
{ D_Out;<br />
sc_inslave {<br />
//<br />
void<br />
void<br />
CMPY_LCtrl::control()<br />
CMPY_LCtrl::control()<br />
{<br />
//<br />
ports sc_inslave<br />
Enable;<br />
Enable;<br />
portssc_inslave<br />
{<br />
sc_inmaster sc_inslave<br />
Update;<br />
sc_inmaster<br />
UpdateConfig; Update;<br />
... UpdateConfig;<br />
void sc_outmaster<br />
while(true)<br />
while(true)<br />
{<br />
sc_outmaster<br />
ConfigUpdated;<br />
void<br />
CMPY_Dpath::multiply()<br />
CMPY_Dpath::multiply()<br />
{<br />
...<br />
{<br />
// ConfigUpdated;<br />
Symbol64C {<br />
sc_outmaster<br />
sc_outmaster<br />
Update;<br />
Symbol64C<br />
in_<br />
in_<br />
,<br />
,<br />
tmp_<br />
tmp_<br />
;<br />
//<br />
local<br />
local<br />
member<br />
member<br />
data<br />
data<br />
;<br />
Symbol64C<br />
Symbol64C<br />
coef_;<br />
coef_; Update;<br />
if<br />
if<br />
(UpdateConfig.read())<br />
(UpdateConfig.read())<br />
{<br />
//<br />
in_ {<br />
sc_inmaster<br />
Update.write(TRUE);<br />
sc_inmaster<br />
notEmpty,<br />
notEmpty,<br />
notFull;<br />
in_<br />
=<br />
=<br />
D_In.read();<br />
//<br />
configuration<br />
configuration<br />
access<br />
access<br />
via<br />
via<br />
ptr<br />
ptr<br />
D_In.read();<br />
config_CMPY& notFull;<br />
for(i=0 Update.write(TRUE);<br />
sc_outmaster<br />
}<br />
sc_outmaster<br />
Enable;<br />
for(i=0<br />
;<br />
;<br />
i
t<br />
<strong>SystemC</strong> Executable Spec.<br />
TF#2 Model of ComplexMPY<br />
Multiply (64 complex samples) when Enable is triggered<br />
• Using “Fast” Functional clock CLK64<br />
• Process execution time ==> 1 x wait(64) with functional CLK64 ticks<br />
SC_MODULE(CMPY_LCtrl)<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
void<br />
void<br />
CMPY_LCtrl::control()<br />
CMPY_LCtrl::control()<br />
{<br />
//<br />
{<br />
//<br />
ports<br />
ports<br />
sc_inmaster<br />
sc_inmaster<br />
UpdateConfig;<br />
UpdateConfig;<br />
while(true)<br />
while(true)<br />
{<br />
sc_outmaster<br />
{<br />
sc_outmaster<br />
ConfigUpdated;<br />
ConfigUpdated;<br />
sc_outmaster<br />
sc_outmaster<br />
Update;<br />
Update;<br />
if<br />
if<br />
(UpdateConfig.read())<br />
(UpdateConfig.read())<br />
{<br />
{<br />
Update.write(TRUE);<br />
sc_inmaster<br />
Update.write(TRUE);<br />
sc_inmaster<br />
notEmpty,<br />
notEmpty,<br />
notFull;<br />
notFull;<br />
ConfigUpdated.write(TRUE); sc_outmaster<br />
ConfigUpdated.write(TRUE); sc_outmaster<br />
Enable;<br />
Enable;<br />
}<br />
...<br />
}<br />
...<br />
if<br />
if<br />
(notEmpty.read()<br />
(notEmpty.read()<br />
&&<br />
&&<br />
notFull.read())<br />
notFull.read())<br />
{<br />
{<br />
Enable.write(TRUE);<br />
void<br />
Enable.write(TRUE);<br />
void<br />
control();<br />
control();<br />
//<br />
//<br />
process<br />
process<br />
}<br />
}<br />
}<br />
SC_CTOR(CMPY_LCtrl)<br />
}<br />
SC_CTOR(CMPY_LCtrl)<br />
{<br />
{<br />
SC_THREAD(control);<br />
SC_THREAD(control);<br />
void<br />
void<br />
CMPY_DPath::updCoef()<br />
CMPY_DPath::updCoef()<br />
{<br />
sensitive_pos<br />
{<br />
sensitive_pos<br />
t<br />
<strong>SystemC</strong> Executable Spec.<br />
TF#2 Model of ComplexMPY<br />
Multiply (64 complex samples) when Enable is triggered<br />
• Using “Fast” Functional clock CLK64<br />
• Process execution time ==> 1 x wait(64) with functional CLK64 ticks<br />
SC_MODULE(CMPY_LCtrl)<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
void<br />
void<br />
CMPY_LCtrl::control()<br />
CMPY_LCtrl::control()<br />
{<br />
{<br />
SC_MODULE(CMPY_DPath) //<br />
//<br />
ports<br />
SC_MODULE(CMPY_DPath) ports {<br />
sc_inmaster<br />
sc_inmaster<br />
UpdateConfig; {<br />
void UpdateConfig;<br />
void<br />
CMPY_Dpath::multiply_1()<br />
while(true) CMPY_Dpath::multiply_1()<br />
{<br />
//<br />
while(true)<br />
{ {<br />
sc_outmaster //<br />
ports<br />
ports<br />
{<br />
sc_outmaster<br />
ConfigUpdated;<br />
Symbol64C ConfigUpdated;<br />
Symbol64C<br />
in_<br />
in_<br />
,<br />
,<br />
tmp_<br />
tmp_<br />
;<br />
sc_inmaster<br />
;<br />
sc_outmaster sc_inmaster<br />
D_In;<br />
sc_outmaster<br />
Update; D_In;<br />
sc_outmaster<br />
sc_outmaster Update; D_Out;<br />
D_Out;<br />
in_ if<br />
if<br />
(UpdateConfig.read())<br />
(UpdateConfig.read())<br />
{<br />
in_<br />
=<br />
=<br />
D_In.read(); {<br />
sc_inslave<br />
D_In.read();<br />
Update.write(TRUE);<br />
sc_inmaster<br />
sc_inslave<br />
Enable;<br />
Update.write(TRUE);<br />
sc_inmaster<br />
notEmpty,<br />
Enable;<br />
notEmpty,<br />
notFull;<br />
for(i=0 notFull;<br />
for(i=0<br />
;<br />
}<br />
;<br />
i
t<br />
<strong>SystemC</strong> Executable Spec.<br />
TF#2 Model of ComplexMPY<br />
Multiply (64 complex samples) when Enable is triggered<br />
• Using “Fast” Functional clock CLK64<br />
• Process execution time ==> 1 x wait(64) with functional CLK64 ticks<br />
void<br />
void<br />
CMPY_Dpath::multiply_1()<br />
CMPY_Dpath::multiply_1()<br />
{<br />
{ SC_MODULE(CMPY_LCtrl)<br />
Symbol64C<br />
Symbol64C<br />
in_<br />
in_<br />
,<br />
,<br />
tmp_<br />
tmp_<br />
;<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
;<br />
//<br />
//<br />
ports<br />
ports<br />
sc_inmaster<br />
in_<br />
in_<br />
=<br />
=<br />
D_In.read();<br />
sc_inmaster<br />
UpdateConfig;<br />
UpdateConfig;<br />
D_In.read();<br />
sc_outmaster<br />
for(i=0<br />
for(i=0<br />
;<br />
;<br />
i
<strong>Tutorial</strong> Example<br />
CA#1 Model of ComplexMPY<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Master/Slave<br />
(Invisible at the<br />
block boundaries)<br />
Link<br />
UpdateConfig<br />
Complex Multiplier<br />
Coeff<br />
Coeff<br />
Result<br />
DataPath<br />
LCtrl<br />
Processor<br />
Operational FW & TestBench<br />
SC_MODULE(CMPY_LCtrl)<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
SC_MODULE(CMPY_LCtrl)<br />
//<br />
//<br />
...<br />
SC_MODULE(CMPY_LCtrl)<br />
... {<br />
} {<br />
// }<br />
//<br />
ports<br />
SC_MODULE(CMPY_DPath) ports<br />
Master/Slave<br />
SC_MODULE(CMPY_DPath)<br />
{<br />
sc_inmaster {<br />
SC_MODULE(CMPY_DPath) sc_inmaster F<br />
UpdateConfig;<br />
// UpdateConfig;<br />
//<br />
ports<br />
SC_MODULE(CMPY_DPath)<br />
{<br />
sc_outmaster ports {<br />
Link<br />
sc_outmaster<br />
// I<br />
ConfigUpdated;<br />
sc_inmaster // ... ConfigUpdated;<br />
sc_inmaster<br />
D_In;<br />
sc_outmaster ...<br />
} sc_outmaster<br />
Update; D_In;<br />
sc_outmaster Update;<br />
sc_outmaster<br />
D_Out;<br />
} F D_Out;<br />
sc_inslave<br />
sc_inslave<br />
Enable;<br />
sc_inmaster<br />
// sc_inmaster O notEmpty, Enable;<br />
//<br />
FIFO<br />
FIFO<br />
type<br />
type<br />
is<br />
is<br />
Sample notEmpty,<br />
notFull;<br />
sc_inslave<br />
Sample<br />
in<br />
in<br />
this notFull;<br />
sc_inslave<br />
Update;<br />
sc_outmaster this<br />
case.<br />
case.<br />
// sc_outmaster<br />
Enable; Update;<br />
...<br />
//<br />
And<br />
And<br />
one<br />
one<br />
complex<br />
complex<br />
multiplication Enable;<br />
... ... multiplication<br />
is<br />
is<br />
// // ...<br />
//<br />
local<br />
// local<br />
performed member<br />
performed member data<br />
data<br />
each<br />
each<br />
clock<br />
clock<br />
cycle.<br />
cycle.<br />
SampleC<br />
SampleC SC_MODULE(CMPY) coef_;<br />
void SC_MODULE(CMPY)<br />
{<br />
void<br />
control(); coef_; {<br />
//<br />
//<br />
ports control();<br />
//<br />
//<br />
process<br />
// process<br />
//<br />
configuration<br />
configuration<br />
access<br />
ports access<br />
via<br />
via<br />
pointer<br />
pointer<br />
config_CMPY&<br />
config_CMPY& SC_CTOR(CMPY_LCtrl)<br />
sc_inmaster configClass_;<br />
sc_inmaster configClass_; <br />
<br />
Full_In;<br />
SC_CTOR(CMPY_LCtrl)<br />
{ Full_In;<br />
sc_inmaster<br />
sc_inmaster<br />
{<br />
SC_THREAD(control); <br />
Empty_In;<br />
SC_THREAD(control);<br />
Empty_In;<br />
...<br />
... sensitive_pos<br />
sc_inmaster sensitive_pos<br />
t<br />
void<br />
void<br />
CMPY_Dpath::multiply_CA1()<br />
CMPY_Dpath::multiply_CA1()<br />
{<br />
{<br />
void<br />
void<br />
CMPY_LCtrl::control()<br />
CMPY_LCtrl::control()<br />
{ SampleC<br />
{ SampleC<br />
in_<br />
in_<br />
,<br />
,<br />
tmp_<br />
tmp_<br />
;<br />
;<br />
while(true)<br />
while(true)<br />
{<br />
{<br />
if<br />
if<br />
(UpdateConfig.read()) RealCoef_<br />
(UpdateConfig.read()) RealCoef_ { =<br />
{ =<br />
coef_.sample[i].data.real();<br />
coef_.sample[i].data.real();<br />
Update.write(TRUE); ImaginCoef_<br />
Update.write(TRUE); ImaginCoef_<br />
=<br />
=<br />
coef_.sample[i].data.imag();<br />
coef_.sample[i].data.imag();<br />
ConfigUpdated.write(TRUE);<br />
ConfigUpdated.write(TRUE);<br />
}<br />
RealIn_<br />
}<br />
RealIn_<br />
=<br />
=<br />
in_.sample[i].data.real();<br />
in_.sample[i].data.real();<br />
if<br />
if<br />
(notEmpty.read()<br />
(notEmpty.read()<br />
&&<br />
&&<br />
notFull.read()) ImaginIn_<br />
notFull.read()) ImaginIn_<br />
=<br />
=<br />
in_.sample[i].data.imag();<br />
in_.sample[i].data.imag();<br />
{<br />
{<br />
Enable.write(TRUE);<br />
Enable.write(TRUE);<br />
}<br />
//<br />
}<br />
//<br />
multiplying<br />
multiplying<br />
data<br />
data<br />
samples<br />
samples<br />
by<br />
by<br />
coeff<br />
coeff<br />
samples<br />
samples<br />
wait();<br />
wait();<br />
//<br />
//<br />
Fast<br />
Fast<br />
clock<br />
clock<br />
CLK64 RealResult_<br />
CLK64 RealResult_<br />
=<br />
=<br />
(RealIn_<br />
(RealIn_<br />
*<br />
*<br />
RealCoef_)<br />
RealCoef_)<br />
-<br />
-<br />
(ImaginIn_*<br />
(ImaginIn_*<br />
ImaginCoef_);<br />
ImaginCoef_);<br />
}<br />
ImaginResult_<br />
}<br />
ImaginResult_<br />
=<br />
=<br />
(RealIn_*<br />
(RealIn_*<br />
ImaginCoef_)<br />
ImaginCoef_)<br />
+(ImaginIn_*<br />
+(ImaginIn_*<br />
RealCoef_);<br />
RealCoef_);<br />
//<br />
//<br />
Putting<br />
Putting<br />
result<br />
result<br />
samples<br />
samples<br />
in<br />
in<br />
a<br />
a<br />
temporary<br />
temporary<br />
symbol<br />
symbol<br />
void<br />
void<br />
CMPY_DPath::updCoef()<br />
CMPY_DPath::updCoef()<br />
{ tmp_.sample[i]<br />
{ tmp_.sample[i]<br />
=<br />
=<br />
complex<br />
complex<br />
(RealResult_,<br />
(RealResult_,<br />
ImaginResult_);<br />
ImaginResult_);<br />
}<br />
}<br />
<strong>SystemC</strong> Executable Spec.<br />
CA#1 Model of ComplexMPY<br />
One complex multiplication per clock tick<br />
• FIFO on sample basis<br />
• Using “Fast” clock CLK-64<br />
in_<br />
in_<br />
=<br />
=<br />
D_In.read();<br />
D_In.read();<br />
if<br />
if<br />
(Update.read())<br />
(Update.read())<br />
{ //<br />
{ //<br />
Writing<br />
Writing<br />
the<br />
the<br />
result<br />
result<br />
to<br />
to<br />
the<br />
the<br />
output<br />
output<br />
port<br />
port<br />
coef_<br />
coef_<br />
=<br />
=<br />
configClass_.Coef(); D_Out.write(<br />
configClass_.Coef(); D_Out.write(<br />
tmp_<br />
tmp_<br />
);<br />
);<br />
}<br />
}<br />
}<br />
} .cc file<br />
.cc file<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 27
t<br />
<strong>SystemC</strong> Executable Spec.<br />
CA#1 Model of ComplexMPY<br />
One complex multiplication per clock tick<br />
• FIFO on sample basis<br />
• Using “Fast” clock CLK-64<br />
void<br />
void<br />
CMPY_Dpath::multiply_CA1()<br />
CMPY_Dpath::multiply_CA1()<br />
{<br />
{<br />
void<br />
void<br />
CMPY_LCtrl::control()<br />
CMPY_LCtrl::control()<br />
{ SampleC<br />
{ SampleC<br />
in_<br />
in_<br />
,<br />
,<br />
tmp_<br />
tmp_<br />
;<br />
;<br />
while(true)<br />
while(true)<br />
{<br />
{<br />
if<br />
if<br />
(UpdateConfig.read()) RealCoef_<br />
(UpdateConfig.read()) RealCoef_ { =<br />
{ =<br />
coef_.sample[i].data.real();<br />
coef_.sample[i].data.real();<br />
Update.write(TRUE); ImaginCoef_<br />
Update.write(TRUE); ImaginCoef_<br />
=<br />
=<br />
coef_.sample[i].data.imag();<br />
coef_.sample[i].data.imag();<br />
ConfigUpdated.write(TRUE);<br />
ConfigUpdated.write(TRUE);<br />
}<br />
RealIn_<br />
}<br />
RealIn_<br />
=<br />
=<br />
in_.sample[i].data.real();<br />
in_.sample[i].data.real();<br />
if<br />
if<br />
(notEmpty.read()<br />
(notEmpty.read()<br />
&&<br />
&&<br />
notFull.read()) ImaginIn_<br />
notFull.read()) ImaginIn_<br />
=<br />
=<br />
in_.sample[i].data.imag();<br />
in_.sample[i].data.imag();<br />
{<br />
{<br />
Enable.write(TRUE);<br />
Enable.write(TRUE);<br />
}<br />
//<br />
}<br />
//<br />
multiplying<br />
multiplying<br />
data<br />
data<br />
samples<br />
samples<br />
by<br />
by<br />
coeff<br />
coeff<br />
samples<br />
samples<br />
wait();<br />
wait();<br />
//<br />
//<br />
Fast<br />
Fast<br />
clock<br />
clock<br />
CLK64 RealResult_<br />
CLK64 RealResult_<br />
=<br />
=<br />
(RealIn_<br />
(RealIn_<br />
*<br />
*<br />
RealCoef_)<br />
RealCoef_)<br />
-<br />
-<br />
(ImaginIn_*<br />
(ImaginIn_*<br />
ImaginCoef_);<br />
ImaginCoef_);<br />
}<br />
ImaginResult_<br />
}<br />
ImaginResult_<br />
=<br />
=<br />
(RealIn_*<br />
(RealIn_*<br />
ImaginCoef_)<br />
ImaginCoef_)<br />
+(ImaginIn_*<br />
+(ImaginIn_*<br />
RealCoef_);<br />
RealCoef_);<br />
//<br />
//<br />
Putting<br />
Putting<br />
result<br />
result<br />
samples<br />
samples<br />
in<br />
in<br />
a<br />
a<br />
temporary<br />
temporary<br />
symbol<br />
symbol<br />
void<br />
void<br />
CMPY_DPath::updCoef()<br />
CMPY_DPath::updCoef()<br />
{ tmp_.sample[i]<br />
{ tmp_.sample[i]<br />
=<br />
=<br />
complex<br />
complex<br />
(RealResult_,<br />
(RealResult_,<br />
ImaginResult_);<br />
ImaginResult_);<br />
}<br />
}<br />
}<br />
}<br />
in_<br />
in_<br />
=<br />
=<br />
D_In.read();<br />
D_In.read();<br />
if<br />
if<br />
(Update.read())<br />
(Update.read())<br />
{ //<br />
{ //<br />
Writing<br />
Writing<br />
the<br />
the<br />
result<br />
result<br />
to<br />
to<br />
the<br />
the<br />
output<br />
output<br />
port<br />
port<br />
coef_<br />
coef_<br />
=<br />
=<br />
configClass_.Coef();<br />
Result<br />
configClass_.Coef();<br />
and Output D_Out.write(<br />
D_Out.write(<br />
ready<br />
tmp_<br />
tmp_<br />
);<br />
);<br />
at each sample...<br />
}<br />
} .cc file<br />
.cc file<br />
1 2 63 64<br />
CLK64<br />
time<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 28
t<br />
a<br />
c<br />
CLK-64<br />
*<br />
b<br />
d<br />
<strong>SystemC</strong> Executable Spec.<br />
CA#1 Model of ComplexMPY<br />
Functional specification to HW-designers<br />
• one complex multiplication per fast CLK-64 cycle (THR=1, LAT=1)<br />
• (a+jb) * (c+jd) = (a*c – b*d) + j(c*b + a*d)<br />
*<br />
c<br />
b<br />
-<br />
*<br />
a<br />
d<br />
Result of<br />
Real part<br />
* +<br />
Latency!<br />
+<br />
Throughput!<br />
+<br />
Reference Clk<br />
=<br />
Input for HW<br />
designers<br />
Result of<br />
imaginary<br />
part<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 29
t<br />
Possible implementation:<br />
a<br />
c<br />
CLK-HW<br />
*<br />
b<br />
d<br />
<strong>SystemC</strong> Executable Spec.<br />
CA#2 Model of ComplexMPY<br />
• 1 Multiplier, 1 Adder/Subtracter ;<br />
• use CLK-HW , 4 times faster than CLK64<br />
*<br />
c<br />
b<br />
-<br />
*<br />
a<br />
d<br />
Result of<br />
Real part<br />
* +<br />
Latency!<br />
+<br />
Throughput!<br />
+<br />
Reference Clk<br />
=<br />
Input for HW<br />
designers<br />
Result of<br />
imaginary<br />
part<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 30
t<br />
<strong>SystemC</strong> Executable Spec.<br />
CA#2 Model of ComplexMPY<br />
One multiplication per clock tick<br />
• Using “Very Fast” clock CLK-HW<br />
• 4 CLK-HW cycles in order to perform a complex multiplication<br />
SC_MODULE(CMPY_LCtrl)<br />
SC_MODULE(CMPY_LCtrl)<br />
{<br />
{<br />
//<br />
//<br />
ports<br />
ports<br />
sc_inmaster<br />
sc_inmaster<br />
UpdateConfig;<br />
UpdateConfig;<br />
sc_outmaster<br />
sc_outmaster<br />
ConfigUpdated;<br />
ConfigUpdated;<br />
sc_outmaster<br />
sc_outmaster<br />
Update;<br />
Update;<br />
sc_inmaster<br />
sc_inmaster<br />
notEmpty,<br />
notEmpty,<br />
notFull;<br />
notFull;<br />
sc_outmaster<br />
sc_outmaster<br />
Enable;<br />
Enable;<br />
...<br />
...<br />
void<br />
void<br />
control();<br />
control();<br />
//<br />
//<br />
process<br />
process<br />
SC_CTOR(CMPY_LCtrl)<br />
SC_CTOR(CMPY_LCtrl)<br />
{<br />
{<br />
SC_THREAD(control);<br />
SC_THREAD(control);<br />
sensitive_pos<br />
sensitive_pos<br />
t<br />
<strong>SystemC</strong> Executable Spec.<br />
CA#2 Model of ComplexMPY<br />
One multiplication per clock tick<br />
• Using “Very Fast” void<br />
void clock CMPY_Dpath::multiply_CA2()<br />
CMPY_Dpath::multiply_CA2() CLK-HW<br />
{<br />
{<br />
SampleC<br />
SampleC<br />
in_<br />
in_<br />
,<br />
,<br />
tmp_<br />
tmp_<br />
;<br />
;<br />
• 4 CLK-HW cycles in order to perform a complex multiplication<br />
in_<br />
in_<br />
=<br />
=<br />
D_In.read();<br />
D_In.read();<br />
void<br />
void<br />
CMPY_LCtrl::control()<br />
CMPY_LCtrl::control()<br />
{<br />
{<br />
RealCoef_<br />
RealCoef_<br />
=<br />
=<br />
coef_.sample[i].data.real();<br />
coef_.sample[i].data.real();<br />
ImaginCoef_<br />
ImaginCoef_<br />
=<br />
=<br />
coef_.sample[i].data.imag();<br />
coef_.sample[i].data.imag();<br />
while(true)<br />
while(true)<br />
{<br />
{<br />
RealIn_<br />
RealIn_<br />
=<br />
=<br />
in_.sample[i].data.real();<br />
in_.sample[i].data.real();<br />
if<br />
if<br />
(UpdateConfig.read())<br />
(UpdateConfig.read())<br />
ImaginIn_<br />
ImaginIn_<br />
{<br />
{<br />
=<br />
=<br />
in_.sample[i].data.imag();<br />
in_.sample[i].data.imag();<br />
Update.write(TRUE);<br />
Update.write(TRUE);<br />
ConfigUpdated.write(TRUE);<br />
ConfigUpdated.write(TRUE);<br />
//<br />
//<br />
multiplying<br />
multiplying<br />
data<br />
data<br />
samples<br />
samples<br />
by<br />
by<br />
coeff<br />
coeff<br />
samples<br />
samples<br />
}<br />
}<br />
RealResult1_<br />
RealResult1_<br />
=<br />
=<br />
(RealIn_<br />
(RealIn_<br />
*<br />
*<br />
RealCoef_)<br />
RealCoef_)<br />
;<br />
;<br />
if<br />
if<br />
(notEmpty.read()<br />
(notEmpty.read()<br />
&&<br />
&&<br />
notFull.read()) wait();<br />
notFull.read()) wait();<br />
//<br />
//<br />
Hardware<br />
Hardware<br />
{<br />
{<br />
clock<br />
clock<br />
CLK-HW<br />
CLK-HW<br />
Enable.write(TRUE);<br />
Enable.write(TRUE);<br />
RealResult_<br />
RealResult_<br />
=<br />
=<br />
(RealResult1_<br />
(RealResult1_<br />
-<br />
-<br />
(ImaginIn_*<br />
(ImaginIn_*<br />
ImaginCoef_);<br />
ImaginCoef_);<br />
}<br />
}<br />
wait();<br />
wait();<br />
//<br />
//<br />
Hardware<br />
Hardware<br />
clock<br />
clock<br />
CLK-HW<br />
CLK-HW<br />
}<br />
ImaginResult1_<br />
}<br />
ImaginResult1_<br />
=<br />
=<br />
(RealIn_*<br />
(RealIn_*<br />
ImaginCoef_)<br />
ImaginCoef_)<br />
;<br />
;<br />
wait();<br />
wait();<br />
//<br />
//<br />
Hardware<br />
Hardware<br />
clock<br />
clock<br />
CLK-HW<br />
CLK-HW<br />
void<br />
void<br />
CMPY_DPath::updCoef()<br />
CMPY_DPath::updCoef()<br />
{<br />
{<br />
ImaginResult_<br />
ImaginResult_<br />
=<br />
=<br />
(ImaginResult1_<br />
(ImaginResult1_<br />
+(ImaginIn_*<br />
+(ImaginIn_*<br />
RealCoef_);<br />
RealCoef_);<br />
//<br />
//<br />
Putting<br />
Putting<br />
result<br />
result<br />
samples<br />
samples<br />
in<br />
in<br />
a<br />
a<br />
temporary<br />
temporary<br />
symbol<br />
symbol<br />
if<br />
if<br />
(Update.read())<br />
(Update.read())<br />
{<br />
{<br />
tmp_.sample[i]<br />
tmp_.sample[i]<br />
=<br />
=<br />
complex<br />
complex<br />
(RealResult_,<br />
(RealResult_,<br />
ImaginResult_);<br />
ImaginResult_);<br />
coef_<br />
coef_<br />
=<br />
=<br />
configClass_.Coef();<br />
configClass_.Coef();<br />
}<br />
// } }<br />
//<br />
Writing<br />
Writing<br />
the<br />
the<br />
result<br />
result<br />
to<br />
to<br />
the<br />
the<br />
output<br />
output<br />
port<br />
}<br />
.cc file<br />
port<br />
D_Out.write(<br />
D_Out.write(<br />
tmp_<br />
tmp_<br />
);<br />
);<br />
wait();<br />
wait();<br />
//<br />
//<br />
Hardware<br />
Hardware<br />
clock<br />
clock<br />
CLK-HW<br />
CLK-HW<br />
=<br />
=<br />
4<br />
4<br />
x<br />
x<br />
faster<br />
faster<br />
than<br />
than<br />
CLK64<br />
CLK64<br />
}<br />
}<br />
1 2 63 64<br />
CLK64<br />
time<br />
.cc file<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 32
<strong>SystemC</strong> Executable Spec.<br />
Latency / Throughput in Block Diagram<br />
Signal connection<br />
Processes in<br />
SC_CTOR like<br />
SC_CTHREAD,<br />
SC_THREAD,<br />
SC_METHOD. (Don't<br />
place process bubles<br />
for SC_SLAVE and<br />
other methods!)<br />
Instance Name<br />
Module Name<br />
master port name<br />
process_name()<br />
slave port name<br />
LAT<br />
THRxClk<br />
Latency of the<br />
process<br />
Throughput of the<br />
process<br />
Clock Name<br />
ConfigSR<br />
ShiftReg<br />
PortName_In<br />
PortName_Out<br />
Port Name<br />
Internal named signal<br />
Class_In<br />
Internal signal<br />
Classes with thick<br />
lines<br />
Write the external<br />
port name inside this.<br />
Hierarchical port<br />
connection. This port<br />
connects to upper<br />
level module.<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 33
<strong>SystemC</strong> Executable Spec.<br />
Latency / Throughput<br />
Latency<br />
+<br />
Throughput<br />
+<br />
Ref. Clk<br />
Calc1<br />
Calculate<br />
Data_In<br />
calc()<br />
Data_Out<br />
3<br />
1xClk20<br />
Calc1<br />
Calculate<br />
Data_In<br />
≡ calc()<br />
Data_Out<br />
1xClk20<br />
1xClk20<br />
1xClk20<br />
instate[LAT]<br />
instate[LAT]<br />
//0.....LAT-1<br />
//0.....LAT-1<br />
init()<br />
init()<br />
:<br />
:<br />
instate[i]=0;<br />
instate[i]=0;<br />
inptr<br />
inptr<br />
=<br />
=<br />
0;<br />
0;<br />
while(true)<br />
while(true)<br />
{<br />
{<br />
a=<br />
a=<br />
Data_In.read();<br />
Data_In.read();<br />
inptr<br />
inptr<br />
=<br />
=<br />
index<br />
index<br />
%<br />
%<br />
LAT;<br />
LAT;<br />
instate[inptr]=<br />
instate[inptr]=<br />
a;<br />
a;<br />
outptr=(inptr<br />
outptr=(inptr<br />
+<br />
+<br />
1)%LAT;<br />
1)%LAT;<br />
b=calc(instate[outptr]);<br />
b=calc(instate[outptr]);<br />
wait(THR-1);<br />
wait(THR-1);<br />
Data_Out.write(b);<br />
Data_Out.write(b);<br />
index++;<br />
index++;<br />
wait();<br />
wait();<br />
}<br />
}<br />
instate[LAT]<br />
instate[LAT]<br />
//0.....LAT-1<br />
//0.....LAT-1<br />
init()<br />
init()<br />
:<br />
:<br />
instate[i]=0;<br />
instate[i]=0;<br />
inptr<br />
inptr<br />
=<br />
=<br />
0;<br />
0;<br />
while(true)<br />
while(true)<br />
{<br />
{<br />
for<br />
for<br />
(int<br />
(int<br />
i<br />
i<br />
=<br />
=<br />
(LAT-1),<br />
(LAT-1),<br />
i>0,<br />
i>0,<br />
i-<br />
i-<br />
-)<br />
-)<br />
{<br />
{<br />
instate[i]<br />
instate[i]<br />
=<br />
=<br />
instate[i-1];<br />
instate[i-1];<br />
}<br />
}<br />
instate[0]<br />
instate[0]<br />
=<br />
=<br />
Data_In.read();<br />
Data_In.read();<br />
b<br />
b<br />
=<br />
=<br />
calc(instate[LAT-1]);<br />
calc(instate[LAT-1]);<br />
wait(THR-1);<br />
wait(THR-1);<br />
Data_Out.write(b);<br />
Data_Out.write(b);<br />
wait();<br />
wait();<br />
}<br />
}<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 34
Outline<br />
Part IV. AME’s System Design Methodology in Practice<br />
t<br />
t<br />
Simplified section tutorial example<br />
<strong>SystemC</strong> executable spec: modelling and simulation<br />
• Top Level Integration<br />
• Master/Slave Library<br />
• Documented methodology<br />
• Different levels of abstraction<br />
• Testbench Strategy<br />
t Horizontal - Vertical<br />
t<br />
t<br />
<strong>SystemC</strong> co-simulation<br />
Summary<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 35
<strong>SystemC</strong> Executable Spec.<br />
Testbench Strategy (horizontal re-use)<br />
TimeD<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
F<br />
I<br />
F<br />
O<br />
FFT<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
F<br />
I<br />
F<br />
O<br />
HW<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
TB1 TB2 TB3 TB4 TB5<br />
Processor<br />
Operational Firmware<br />
FW<br />
Load Evaluate Get/Analyze<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 36
<strong>SystemC</strong> Executable Spec.<br />
Testbench Strategy (horizontal re-use)<br />
Complex Multiplier<br />
F<br />
I<br />
F<br />
O<br />
Master/Slave<br />
Link<br />
Coeff<br />
Result<br />
Master/Slave<br />
Link<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
(Invisible at the<br />
block boundaries)<br />
Coeff<br />
UpdateConfig<br />
DataPath<br />
LCtrl<br />
ConfigUpdated<br />
Through Pointers<br />
Processor<br />
Load Evaluate Get/Analyze<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 37
<strong>SystemC</strong> Executable Spec.<br />
Testbench Strategy (vertical re-use)<br />
Matlab as the<br />
algorithmic<br />
reference<br />
<strong>SystemC</strong><br />
Testbench<br />
Algorithmic Modelling<br />
Matlab<br />
<strong>SystemC</strong> Modelling<br />
HW<br />
FW<br />
Implementation<br />
VHDL C-code<br />
Reused in all stages<br />
of the design!<br />
Prototype Tests<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 38
<strong>SystemC</strong> Executable Spec.<br />
Testbench Strategy (vertical re-use)<br />
Complex Multiplier<br />
Matlab<br />
Algorithmic<br />
Reference<br />
F<br />
I<br />
F<br />
O<br />
Master/Slave<br />
Link<br />
Coeff<br />
Result<br />
Master/Slave<br />
Link<br />
F<br />
I<br />
F<br />
O<br />
.mat<br />
Parameter Passing through Pointers<br />
(Invisible at the<br />
block boundaries)<br />
UpdateConfig<br />
Coeff<br />
DataPath<br />
LCtrl<br />
Processor<br />
ConfigUpdated<br />
Load Evaluate Get/Analyze<br />
Through Pointers<br />
.mat<br />
Equal?<br />
<strong>SystemC</strong><br />
Result<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 39
<strong>SystemC</strong> Executable Spec.<br />
Execution of the Model<br />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
| Rx_Section5 module test starts! |<br />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
|-------------------------------------------------------------------|<br />
| Test_reference list: |<br />
| 1 -TopLevel_Push_Tag_Only |<br />
| 2 -TopLevel_BPSK_1_2 |<br />
| 3 -TopLevel_QPSK_3_4 |<br />
| 4 -TopLevel_16QAM_9_16 |<br />
| 5 -TopLevel_64QAM_2_3 |<br />
| 6 -TopLevel_BPSK_1_2_4OFDM |<br />
|-------------------------------------------------------------------|<br />
>> Select one of the test_reference numbers:2<br />
>> Do you want debug-info?(0=No,1=Yes)0<br />
(SOFTCODING) : soft reseted at 0 0 clk cycle<br />
(DEINTERLEAVER) : soft reseted at 0 0 clk cycle<br />
(DEPUNCTURER) : soft reseted at 0 0 clk cycle<br />
(VITERBI) : soft reseted at 0 0 clk cycle<br />
(DESCRAMBLER) : soft reseted at 0 0 clk cycle<br />
(SCHEDULER) : soft reseted 0 0 clk cycle<br />
.<br />
(TESTBENCH) : Matlab input file =<br />
./input_mat_files/TopLevel_BPSK_1_2_in.mat<br />
(TESTBENCH) : Matlaboutput file<br />
:./output_mat_files/TopLevel_BPSK_1_2_out.mat<br />
(SCHEDULER) : process_scheduler() started at 0 0 clk cycle<br />
(TESTBENCH) : Modulation = BPSK 1/2<br />
(TESTBENCH) : Ncbps = 48<br />
(TESTBENCH) : Nbpsc = 1<br />
(TESTBENCH) : P1 puncturing disabled<br />
(TESTBENCH) : Dummy Softbit = 100<br />
(TESTBENCH) : Viterbi Traceback Depth = 96<br />
(TESTBENCH) : Descrambler Mode = Reset with external seed<br />
(TESTBENCH) : Seed = 1110100<br />
(TESTBENCH) : Tag pushed<br />
(TESTBENCH) : Number of OFDM symbols = 10<br />
User<br />
interface<br />
Resetting<br />
blocks<br />
Opening<br />
input/<br />
creating<br />
output files<br />
Configuration<br />
data sent by<br />
testbench<br />
(SCHEDULER) : config signals updated at 50 1 clk cycle<br />
(SOFTCODING) : config updated at 50 1 clk cycle<br />
(DEINTERLEAVER) : config updated at 50 1 clk cycle<br />
(DEPUNCTURER) : config updated at 50 1 clk cycle<br />
(VITERBI) : config updated at 50 10 clk cycle<br />
(DESCRAMBLER) : config updated at 50 1 clk cycle<br />
(SOFTCODING) : DATA IN :0 DATA :000001 FLAG :0<br />
(SCHEDULER) : current_config_.DeScramblerMode()--->2 at 5350 107 clk cycle<br />
.<br />
(DEINTERLEAVER) : enabled for OFDM symbol 1 at 100 2 clk cycle<br />
.<br />
(DEPUNCTURER) : enabled for OFDM symbol 1 at 1100 22 clk cycle<br />
.<br />
(VITERBI) : enabled for OFDM symbol 1 at 1300 26 clk cycle<br />
.<br />
(DESCRAMBLER) : enabled for OFDM symbol 1 at 5350 107 clk cycle<br />
.<br />
(TESTBENCH) : Section is done!<br />
(TESTBENCH) : Files are closed !<br />
*****************************************************************************<br />
* START COMPARING OUTPUT WITH GOLDEN REFERENCE<br />
*<br />
* First file : ./output_mat_files/TopLevel_BPSK_1_2_out.mat<br />
* Second file : ./golden_output_mat_files/TopLevel_BPSK_1_2_golden_out.mat<br />
* Arrays in two files :<br />
* RxS5TopLevelOut_systemc 2 160x1 real numbers<br />
* TOPLEVELOutput 2 160x1 real numbers<br />
*<br />
*****************************************************************************<br />
* REPORT :<br />
*<br />
* Number of bits compared : 160<br />
* There is no difference between arrays in two files<br />
*<br />
* Files are closed successfully.<br />
End of the test<br />
Configuration<br />
received by<br />
blocks<br />
Processing<br />
data<br />
Result of<br />
comparison<br />
*****************************************************************************<br />
Comparison results are written to "results.log" file.<br />
Comparing<br />
output<br />
with<br />
golden<br />
output<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 40
<strong>SystemC</strong> Executable Spec.<br />
Results File<br />
*****************************************************************************<br />
* START COMPARING OUTPUT WITH GOLDEN REFERENCE *<br />
* First file : ./output_mat_files/TopLevel_BPSK_1_2_out.mat<br />
* Second file : ./golden_output_mat_files/TopLevel_BPSK_1_2_golden_out.mat<br />
* Arrays in two files :<br />
* RxS5TopLevelOut_systemc 2 160x1 real<br />
numbers<br />
* TOPLEVELOutput 2 160x1 real<br />
numbers<br />
*<br />
*<br />
* Comparing 1. column(OFDM symbol except descrambler)<br />
* 0 ...............................................…<br />
* 50 ...............................................…<br />
* 100 ...............................................…<br />
* 150 .......…<br />
*<br />
* Comparing 1. Column<br />
* SYSTEMC MATLAB<br />
* 0. 1 1<br />
* 1. 1 1<br />
* 2. 1 1<br />
* 3. 1 1<br />
* 4. 0 0<br />
* 5. 0 0<br />
* 6. 0 0<br />
* 7. 0 0<br />
.<br />
.<br />
Output (<strong>SystemC</strong>) and<br />
Reference(Matlab) Data<br />
*****************************************************************************<br />
* REPORT :<br />
* Number of bits compared : 160<br />
* There is no difference between arrays in two files<br />
*<br />
* Files are closed successfully.<br />
*****************************************************************************<br />
Output and<br />
Reference File<br />
Info<br />
“.” means that output is same with<br />
reference<br />
“x” means errors<br />
Result Summary<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 41
Outline<br />
Part IV. AME’s System Design Methodology in Practice<br />
t<br />
t<br />
Simplified section tutorial example<br />
<strong>SystemC</strong> executable spec: modelling and simulation<br />
t<br />
<strong>SystemC</strong> co-simulation<br />
• AME needs and CoWare N2C as a solution<br />
• Complex Multiplier for <strong>SystemC</strong>/VHDL<br />
cosim<br />
• Complex Multiplier for <strong>SystemC</strong>/ISS<br />
cosim<br />
• Complex Multiplier for <strong>SystemC</strong>/ISS/VHDL<br />
cosim<br />
t<br />
Summary<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 42
Co-simulation<br />
AME needs and N2C as a solution<br />
Coware’s N2C flow<br />
Sign-off<br />
system functionality<br />
Sign-off between<br />
system developer,<br />
hardware developer<br />
and software developer<br />
Sign-off for<br />
processing<br />
1 System Specification<br />
System specification<br />
&<br />
environment model<br />
2 Partitioning & interface design<br />
Partitioning<br />
&<br />
interface design<br />
Hardware<br />
implementation<br />
C simulation<br />
Simulation<br />
-C<br />
-Assembly<br />
Software<br />
optimization<br />
<strong>SystemC</strong><br />
Link to CoSim<br />
environment.<br />
Manual or<br />
by tool.<br />
3 Hardware implementation and software optimization<br />
CoSim and<br />
design<br />
<strong>SystemC</strong><br />
Abstr.<br />
RTOS<br />
RTO<br />
S<br />
AME Flow<br />
Matlab<br />
UTF<br />
TF<br />
BCA<br />
RTL<br />
Algorithmic<br />
Design and<br />
Validation<br />
System<br />
Design and<br />
Validation<br />
BCA<br />
CoSim Environment<br />
Software Hardware Firmware<br />
CoSim Environment<br />
Target<br />
Software Hardware Firmware<br />
Design and Design and Design and<br />
Validation Validation Validation<br />
C<br />
Function<br />
Simulation<br />
-Multi-level mixed mode<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 43
Co-simulation<br />
SoC <strong>SystemC</strong> / VHDL CoSim<br />
t<br />
<strong>SystemC</strong> model as reference for “HW (VHDL) design”<br />
TimeD<br />
DPath<br />
LCtrl<br />
TimeDomain<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
DPath<br />
LCtrl<br />
Complex MPY<br />
F<br />
I<br />
F<br />
O<br />
DPath<br />
LCtrl<br />
FFT<br />
FFT<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
DPath<br />
LCtrl<br />
Freq Dom 2<br />
Section<br />
HW<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
LCtrl<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
DPRam<br />
Processor<br />
FW<br />
Operational & TestBench FirmWare<br />
t<br />
<strong>SystemC</strong> and VHDL Co-simulation<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 44
Co-simulation<br />
<strong>SystemC</strong> / VHDL<br />
Complex Multiplier<br />
BlackBox<br />
F<br />
I<br />
F<br />
O<br />
F<br />
I<br />
F<br />
O<br />
Master/Slave<br />
Link<br />
sc_uint<br />
std_logic_vector<br />
Coeff<br />
std_logic<br />
Result<br />
sc_uint<br />
Master/Slave<br />
Link<br />
F<br />
I<br />
F<br />
O<br />
F<br />
I<br />
F<br />
O<br />
Parameter Passing through Pointers<br />
Parameter Passing through Pointers<br />
(Invisible at the<br />
block boundaries)<br />
UpdateConfig<br />
UpdateConfig<br />
Coeff<br />
Coeff. Register<br />
std_logic<br />
DataPath<br />
DataPath<br />
LCtrl<br />
LCtrl<br />
Wrapper Around Vhdl<br />
sc_uint<br />
<strong>SystemC</strong> I/F<br />
ConfigUpdated<br />
ConfigUpdated<br />
Through Pointers<br />
Through Pointers<br />
Processor<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 45
Co-Simulation<br />
<strong>SystemC</strong> / VHDL<br />
t<br />
Wrapper around VHDL: to convert generic C / <strong>SystemC</strong> types to VHDL<br />
data types<br />
SC_MODULE(CoSimWrapper_BCA_version)<br />
SC_MODULE(CoSimWrapper_BCA_version)<br />
{<br />
{<br />
cwr_clock_inslave<br />
cwr_clock_inslave<br />
Clk_20M;<br />
Clk_20M;<br />
sc_inslave<br />
sc_inslave<br />
Mult_In;<br />
sc_outmaster<br />
sc_outmaster<br />
<br />
ReadFIFOEn_Out;<br />
ReadFIFOEn_Out;<br />
sc_uint<br />
}<br />
}<br />
SC_CTOR<br />
SC_CTOR<br />
(CoSimWrapper_BCA_version)<br />
(CoSimWrapper_BCA_version)<br />
{<br />
{<br />
//<br />
//<br />
location<br />
location<br />
of<br />
of<br />
the<br />
the<br />
source<br />
source<br />
file<br />
file<br />
cwr_add_attribute<br />
cwr_add_attribute<br />
(this,<br />
(this,<br />
"import",<br />
"import",<br />
"source<br />
"source<br />
=<br />
=<br />
(\"./CoSimWrapper.Entity.vhd\");");<br />
(\"./CoSimWrapper.Entity.vhd\");");<br />
//<br />
//<br />
replace<br />
replace<br />
"."<br />
"."<br />
to<br />
to<br />
"_"<br />
"_"<br />
when<br />
when<br />
referring<br />
referring<br />
to<br />
to<br />
signals<br />
signals<br />
in<br />
in<br />
ports<br />
ports<br />
in<br />
in<br />
this<br />
this<br />
context<br />
context<br />
//<br />
//<br />
for<br />
for<br />
exampl<br />
exampl<br />
clk.clk<br />
clk.clk<br />
to<br />
to<br />
clk_clk<br />
clk_clk<br />
cwr_add_context<br />
cwr_add_context<br />
(this,<br />
(this,<br />
"component<br />
"component<br />
CoSimWrapper\n" VHDL<br />
CoSimWrapper\n"<br />
component in <strong>SystemC</strong><br />
"<br />
"<br />
port<br />
port<br />
(\n"<br />
(\n"<br />
"<br />
"<br />
Clk_20M<br />
Clk_20M<br />
:<br />
:<br />
in<br />
in<br />
std_logic;\n"<br />
std_logic;\n"<br />
"<br />
"<br />
Mult_In<br />
Mult_In<br />
:<br />
:<br />
in<br />
in<br />
std_logic_vector(23<br />
std_logic_vector(23<br />
downto<br />
downto<br />
0);\n"<br />
0);\n"<br />
"<br />
"<br />
ReadFIFOEn_Out<br />
ReadFIFOEn_Out<br />
:<br />
:<br />
out<br />
out<br />
std_logic;\n"<br />
std_logic;\n"<br />
//<br />
//<br />
Connect<br />
Connect<br />
<strong>SystemC</strong><br />
<strong>SystemC</strong><br />
ports<br />
ports<br />
to<br />
to<br />
VHDL<br />
VHDL<br />
ports<br />
ports<br />
"<br />
"<br />
CoSimWrapper_1<br />
CoSimWrapper_1<br />
:<br />
:<br />
CoSimWrapper\n"<br />
CoSimWrapper\n"<br />
"<br />
"<br />
port<br />
port<br />
map<br />
map<br />
(\n"<br />
(\n"<br />
"<br />
"<br />
Clk_20M<br />
Clk_20M<br />
=><br />
=><br />
Clk_20M_clk,\n<br />
Clk_20M_clk,\n<br />
"<br />
"<br />
"<br />
"<br />
Mult_In<br />
Mult_In<br />
=><br />
=><br />
Mult_In_d,\n<br />
Mult_In_d,\n<br />
"<br />
"<br />
"<br />
"<br />
ReadFIFOEn<br />
ReadFIFOEn<br />
_Out<br />
_Out<br />
=><br />
=><br />
ReadFIFOEn_Out_d,\n<br />
ReadFIFOEn_Out_d,\n<br />
"<br />
"<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 46
t<br />
Co-simulation<br />
<strong>SystemC</strong>/VHDL<br />
<strong>SystemC</strong> I/F Wrapper: to convert C++ data types to generic C or<br />
<strong>SystemC</strong> data types<br />
SC_MODULE(<strong>SystemC</strong>Interface){<br />
SC_MODULE(<strong>SystemC</strong>Interface){<br />
//<br />
//<br />
<strong>SystemC</strong><br />
<strong>SystemC</strong><br />
Interface<br />
Interface<br />
port<br />
port<br />
declarations<br />
declarations<br />
sc_in_clk<br />
sc_in_clk<br />
Clk20;<br />
Clk20;<br />
sc_outmaster<br />
sc_outmaster<br />
Mult_Out;<br />
Mult_Out;<br />
sc_inmaster<br />
sc_inmaster<br />
Mult_In;<br />
Mult_In;<br />
sc_inslave<br />
ReadFIFOEn_In;<br />
ReadFIFOEn_In;<br />
sc_outmaster<br />
MultSerialData_Out;<br />
MultSerialData_Out;<br />
sc_inslave<br />
MultSerialData_In;<br />
MultSerialData_In;<br />
...<br />
...<br />
void<br />
void<br />
read_fifo_out();<br />
read_fifo_out();<br />
Conversion of Mult_In to MultSerial_Out<br />
SC_CTOR(<strong>SystemC</strong>Interface)<br />
SC_CTOR(<strong>SystemC</strong>Interface)<br />
{<br />
{<br />
SC_THREAD(read_fifo_out);<br />
SC_THREAD(read_fifo_out);<br />
sensitive_pos<br />
sensitive_pos<br />
1 CA or<br />
TF<br />
Co-simulation<br />
ComplexMPY Abstract Levels<br />
F<br />
I<br />
F<br />
O<br />
Master/Slave<br />
Link<br />
Complex Multiplier<br />
Coeff<br />
Result<br />
Master/Slave<br />
Link<br />
F<br />
I<br />
F<br />
O<br />
2 TF<br />
<strong>SystemC</strong><br />
Matlab<br />
UTF<br />
TF<br />
Algorithmic<br />
Design and<br />
Validation<br />
System<br />
Design and<br />
Validation<br />
Function<br />
Parameter Passing through Pointers<br />
(Invisible at the<br />
block boundaries)<br />
Coeff<br />
UpdateConfig<br />
DataPath<br />
LCtrl<br />
ConfigUpdated<br />
Through Pointers<br />
1 CA or<br />
TF<br />
Abstr.<br />
RTOS<br />
RTO<br />
S<br />
Software<br />
Software<br />
Design and<br />
Validation<br />
BCA<br />
RTL<br />
Hardware<br />
Hardware<br />
Design and<br />
Validation<br />
BCA<br />
C<br />
Firmware<br />
Firmware<br />
Design and<br />
Validation<br />
Target<br />
2 TF<br />
Processor<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 48
Co-simulation<br />
<strong>SystemC</strong>/VHDL<br />
1RTL<br />
Complex Multiplier<br />
F<br />
I<br />
F<br />
O<br />
sc_uint<br />
std_logic_vector<br />
std_logic<br />
DataPath<br />
sc_uint<br />
F<br />
I<br />
F<br />
O<br />
2TF<br />
<strong>SystemC</strong><br />
Matlab<br />
UTF<br />
TF<br />
Algorithmic<br />
Design and<br />
Validation<br />
System<br />
Design and<br />
Validation<br />
Function<br />
Parameter Passing through Pointers<br />
UpdateConfig<br />
Coeff. Register<br />
std_logic<br />
LCtrl<br />
Wrapper Around Vhdl<br />
sc_uint<br />
<strong>SystemC</strong> I/F<br />
Processor<br />
ConfigUpdated<br />
2TF<br />
Through Pointers<br />
Abstr.<br />
RTOS<br />
RTO<br />
S<br />
Software<br />
Software<br />
Design and<br />
Validation<br />
1RTL<br />
BCA<br />
RTL<br />
Hardware<br />
Hardware<br />
Design and<br />
Validation<br />
BCA<br />
C<br />
Firmware<br />
Firmware<br />
Design and<br />
Validation<br />
Target<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 49
Co-simulation<br />
SoC <strong>SystemC</strong>/ISS CoSim<br />
t<br />
<strong>SystemC</strong> model as reference for “FW (C-code) design”<br />
TimeD<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
F<br />
I<br />
F<br />
O<br />
FFT<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
HW<br />
LCtrl<br />
DPRam<br />
LCtrl<br />
DPRam<br />
LCtrl<br />
DPRam<br />
LCtrl<br />
DPRam<br />
LCtrl<br />
DPRam<br />
D<br />
SRAM<br />
CPU Core<br />
ARM Processor<br />
MAC<br />
I<br />
SRAM<br />
Processor<br />
ISS :<br />
Instruction<br />
Set<br />
Simulator<br />
Operational & TestBench FirmWare<br />
FW<br />
t<br />
<strong>SystemC</strong> and ISS Co-simulation<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 50
Co-Simulation<br />
<strong>SystemC</strong> / ISS<br />
Black Box<br />
fifo_config class<br />
new_fifo_config<br />
struct<br />
F<br />
I<br />
F<br />
O<br />
Through Pointers<br />
Complex<br />
Multiplier<br />
LCtrl<br />
C++ classes (may be hierarchical)<br />
N2c compliant System-C Wrapper around not N2c compliant System-C<br />
Through Pointers<br />
F<br />
I<br />
F<br />
O<br />
sc_indexed port<br />
Basic C types<br />
Non-hierarchical C structs<br />
Indexed ports<br />
SC_MODULE<br />
mapped to a<br />
processor<br />
<strong>SystemC</strong> I/F (N2C)<br />
PROCESSOR<br />
C- code<br />
System<br />
Bus<br />
Clock and Reset<br />
generators for<br />
processor<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 51
t<br />
Wrapper for ISS<br />
Co-Simulation<br />
<strong>SystemC</strong> / ISS<br />
//<br />
//<br />
fifo_config<br />
fifo_config<br />
class<br />
class<br />
template<br />
template<br />
<br />
class<br />
class<br />
fifo_config<br />
fifo_config<br />
{<br />
{<br />
public:<br />
public:<br />
void<br />
void<br />
fc_cmd(int<br />
fc_cmd(int<br />
command);<br />
command);<br />
int<br />
int<br />
fc_cmd();<br />
fc_cmd();<br />
void<br />
void<br />
fc_index(int<br />
fc_index(int<br />
idx);<br />
idx);<br />
int<br />
int<br />
fc_index();<br />
fc_index();<br />
void<br />
void<br />
fc_value(itemT<br />
fc_value(itemT<br />
val);<br />
val);<br />
itemT<br />
itemT<br />
fc_value();<br />
fc_value();<br />
void<br />
void<br />
fc_status(fifo_status_s<br />
fc_status(fifo_status_s<br />
sts);<br />
sts);<br />
fifo_status_s<br />
fifo_status_s<br />
fc_status();<br />
fc_status();<br />
//<br />
//<br />
Define<br />
Define<br />
the<br />
the<br />
=<br />
=<br />
operator<br />
operator<br />
inline<br />
inline<br />
void<br />
void<br />
operator<br />
operator<br />
=<br />
=<br />
(const<br />
(const<br />
fifo_config&<br />
fifo_config&<br />
rhs){<br />
rhs){<br />
fc_cmd_<br />
fc_cmd_<br />
=<br />
=<br />
rhs.fc_cmd_;<br />
rhs.fc_cmd_;<br />
fc_index_<br />
fc_index_<br />
=<br />
=<br />
rhs.fc_index_;<br />
rhs.fc_index_;<br />
fc_value_<br />
fc_value_<br />
=<br />
=<br />
rhs.fc_value_;<br />
rhs.fc_value_;<br />
fc_status_=<br />
fc_status_=<br />
rhs.fc_status_;<br />
rhs.fc_status_;<br />
}<br />
}<br />
private:<br />
private:<br />
int<br />
int<br />
fc_cmd_;<br />
fc_cmd_;<br />
int<br />
int<br />
fc_index_;<br />
fc_index_;<br />
itemT<br />
itemT<br />
fc_value_;<br />
fc_value_;<br />
fifo_status_s<br />
fifo_status_s<br />
fc_status_;};<br />
fc_status_;};<br />
//<br />
//<br />
new_fifo_config<br />
new_fifo_config<br />
struct<br />
struct<br />
struct<br />
struct<br />
fifo_config<br />
fifo_config<br />
{<br />
{<br />
int<br />
int<br />
fc_cmd_;<br />
fc_cmd_;<br />
int<br />
int<br />
fc_index_;<br />
fc_index_;<br />
//<br />
//<br />
do<br />
do<br />
not<br />
not<br />
use<br />
use<br />
hierarchical<br />
hierarchical<br />
structs<br />
structs<br />
//<br />
//<br />
divide<br />
divide<br />
fifo_status_s<br />
fifo_status_s<br />
into<br />
into<br />
members<br />
members<br />
int<br />
int<br />
fs_buffer_size;<br />
fs_buffer_size;<br />
int<br />
int<br />
fs_wrptr;<br />
fs_wrptr;<br />
int<br />
int<br />
fs_rdptr;<br />
fs_rdptr;<br />
int<br />
int<br />
fs_nbrerrwr;<br />
fs_nbrerrwr;<br />
int<br />
int<br />
fs_full;<br />
fs_full;<br />
int<br />
int<br />
fs_empty;<br />
fs_empty;<br />
};<br />
};<br />
sc_indexed<br />
sc_indexed<br />
port<br />
port<br />
for<br />
for<br />
itemT<br />
itemT<br />
fc_value_<br />
fc_value_<br />
sc_inoutmaster<br />
FIFOData;<br />
FIFOData;<br />
//<br />
//<br />
128<br />
128<br />
comes<br />
comes<br />
from:<br />
from:<br />
//<br />
//<br />
64<br />
64<br />
real<br />
real<br />
part<br />
part<br />
of<br />
of<br />
an<br />
an<br />
OFDM<br />
OFDM<br />
symbol<br />
symbol<br />
//<br />
//<br />
64<br />
64<br />
imaginary<br />
imaginary<br />
part<br />
part<br />
of<br />
of<br />
an<br />
an<br />
OFDM<br />
OFDM<br />
symbol<br />
symbol<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 52
Co-simulation<br />
SoC <strong>SystemC</strong> / ISS / VHDL CoSim<br />
t<br />
<strong>SystemC</strong> and VHDL and ISS Co-simulation<br />
TimeD<br />
DPath<br />
LCtrl<br />
TimeDomain<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
F<br />
O<br />
CMPY<br />
DPath<br />
LCtrl<br />
CMPY<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
F<br />
O<br />
FFT<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
F<br />
O<br />
FreqD1<br />
LCtrl<br />
DPRam<br />
F<br />
I<br />
F<br />
O<br />
FreqD2<br />
LCtrl<br />
DPRam<br />
HW<br />
D<br />
SRAM<br />
I<br />
SRAM<br />
CPU Core<br />
ARM Processor<br />
MAC<br />
Processor<br />
ISS :<br />
Instruction<br />
Set<br />
Simulator<br />
Operational & TestBench FirmWare<br />
FW<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 53
Co-Simulation<br />
<strong>SystemC</strong> / ISS / VHDL<br />
Complex Multiplier<br />
C++ classes<br />
F<br />
I<br />
F<br />
O<br />
<strong>SystemC</strong> I/F<br />
sc_uint<br />
std_logic_vector<br />
std_logic<br />
DataPath<br />
sc_uint<br />
<strong>SystemC</strong> I/F<br />
F<br />
I<br />
F<br />
O<br />
Coeff. Register<br />
std_logic<br />
LCtrl<br />
Wrapper Around Vhdl<br />
with <strong>SystemC</strong><br />
<strong>SystemC</strong> I/F (N2C)<br />
SC_MODULE mapped to a<br />
processor<br />
PROCESSOR<br />
C-code<br />
System<br />
Bus<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 54
Co-Simulation<br />
ISS / VHDL<br />
Complex Multiplier<br />
F<br />
I<br />
F<br />
O<br />
std_logic_vector<br />
F<br />
I<br />
F<br />
O<br />
DataPath<br />
Coeff. Register<br />
LCtrl<br />
std_logic<br />
Wrapper Around Vhdl with <strong>SystemC</strong> I/F<br />
<strong>SystemC</strong> I/F (N2C)<br />
SC_MODULE mapped to a<br />
processor<br />
PROCESSOR<br />
C-code<br />
System<br />
Bus<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 55
Summary<br />
t<br />
t<br />
t<br />
t<br />
<strong>SystemC</strong> is the GOLDEN reference throughout<br />
the design phases (iterative and model-based)<br />
• Matlab as an algorithmic reference for <strong>SystemC</strong>.<br />
Integration methodology based on<br />
• Master/slave ports : M/S communication has advantages.<br />
• Classes and pointers<br />
Testbench strategy:<br />
• Horizontal<br />
• Vertical<br />
Co-simulation:<br />
• <strong>SystemC</strong> / VHDL<br />
• <strong>SystemC</strong> / ISS<br />
• <strong>SystemC</strong> / ISS / VHDL<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s Part IV - slide 56
Part V<br />
AME’s Experience with<br />
<strong>SystemC</strong> Based<br />
Design Methodology<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 1
Outline<br />
Part V. AME’s Experience<br />
t<br />
The OWL Project<br />
t<br />
Introducing <strong>SystemC</strong> in AME<br />
t<br />
Design Engineers’ Involvement<br />
t<br />
<strong>SystemC</strong> Approach<br />
t<br />
Conclusion<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 2
Outline<br />
Part V. AME’s Experience<br />
t<br />
t<br />
t<br />
t<br />
t<br />
The OWL Project<br />
• Overview<br />
• Project Phases<br />
• Project Team Setup<br />
Introducing <strong>SystemC</strong> in AME<br />
Design Engineers’ involvement<br />
<strong>SystemC</strong> Approach<br />
Conclusion<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 3
The OWL Project<br />
( Overview )<br />
t<br />
AME’s HiperLAN-2 SoC ( The OWL Chipset )<br />
RF<br />
front<br />
end<br />
Analog<br />
<strong>SystemC</strong> execution output:<br />
RF Layer BaseBand PHY Layer MAC / DLC Layer CL Layer<br />
Global<br />
Controller<br />
CL<br />
Control<br />
SAP<br />
Core<br />
Network<br />
>(Testbench) : Starting Test1.<br />
>(Testbench) Digital: Transmission started at time 500 ns.<br />
>(PHY) : System reseted at time 300 ns<br />
>(PHY) : Sytem running for 3 frames......<br />
>(PHY) : Transmitting frame 1...<br />
>(PHY) Transmit : Transmitting Data-Path frame 2...<br />
>(PHY) : &<br />
Local Transmitting Controller<br />
frame 3...<br />
>(PHY) : Transmission Completed!!.<br />
>(Testbench) : Comparison started<br />
CL<br />
Receive Data-Path<br />
User<br />
>........<br />
&<br />
SAP<br />
>........<br />
Local Controller<br />
>(Testbench) : Comparison completed<br />
>(Testbench) : see Test1.LOG file<br />
Core<br />
Network<br />
CL - Specific Part<br />
Network Convergence Layer<br />
CL - Common Part<br />
Data Link Control Layer<br />
[ MAC - DLC ]<br />
Physical Layer<br />
[ PHY ]<br />
HiperLAN-2<br />
Core<br />
Network<br />
Program<br />
SDRAM<br />
(Fw/Sw)<br />
(E)PROM<br />
(Fw/Sw)<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 4
OWL Project Phases<br />
( Iterative design methodology ... )<br />
t<br />
OWL Case : R&D Trajectory is ITERATIVE & MODEL based<br />
• Re-use of SW methodology coming from RUP in project context<br />
• Main target : reduce Risks in order to get ASAP Working Product<br />
• Early feedback from Executable <strong>SystemC</strong> model in First iteration<br />
• Models are not “throw-away” but re-used throughout iterations<br />
• <strong>SystemC</strong> is baseline for next iterations : testbench re-usage<br />
• keep models well-documented, high-quality and consistent !<br />
S<br />
It.0<br />
It.1<br />
It.2<br />
It.3<br />
matlab<br />
systemC<br />
VHDL\ISS<br />
FPGA<br />
Silicon<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 5
OWL Project Phases<br />
( Iterative design methodology ... )<br />
S<br />
It.0<br />
It.1<br />
It.2<br />
It.3<br />
Matlab<br />
systemC<br />
VHDL\ISS<br />
FPGA<br />
Silicon<br />
> Matlab<br />
Modelling<br />
> <strong>SystemC</strong><br />
Modelling<br />
> HW design<br />
> FW design<br />
> Cosimulation<br />
Step Risk Covered Model/Platform Used Test Target<br />
S : Feasibility Feasibility - Algorithms Matlab Function<br />
It0 : Definition Specification - System&Architecture <strong>SystemC</strong> Simulated Timing & Bit level<br />
It1 : Development<br />
Discrepancy Physics/Model<br />
<strong>SystemC</strong> as golden reference for<br />
Check implementation<br />
Integration & Coexistence of<br />
<strong>SystemC</strong>+ISS+VHDL cosimulation<br />
versus <strong>SystemC</strong> golden reference<br />
HW/FW<br />
environment<br />
It2 : Development<br />
RTL Implementation<br />
<strong>SystemC</strong> as golden reference<br />
for FPGA + Integration boards<br />
Simulated Timing & Bit level<br />
It3 : Validation<br />
Backend & production<br />
<strong>SystemC</strong> as golden reference<br />
for real Silicon on Integration boards<br />
and System Qualification tests<br />
Full system<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 6
OWL Project Team Setup<br />
( Context of <strong>SystemC</strong> teams )<br />
t<br />
Teams and Interactions (in/out AME)<br />
Tools<br />
Emb. Proc.<br />
Design<br />
Method.<br />
FPGA<br />
<strong>SystemC</strong><br />
IP Blocks<br />
VHDL<br />
CAD<br />
Method.<br />
SW<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 7
OWL Project Team Setup<br />
( <strong>SystemC</strong> teams )<br />
Tools<br />
Emb. Proc.<br />
Design<br />
Method.<br />
FPGA<br />
Task 2<br />
<strong>SystemC</strong><br />
Teams<br />
Task 3 Task 3<br />
Task 1 Task 1<br />
Task 4 Task 4<br />
Task 5 Task 5<br />
IP Blocks<br />
VHDL<br />
CAD<br />
Method.<br />
SW<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 8
Outline<br />
Part V. AME’s Experience<br />
t<br />
t<br />
t<br />
t<br />
t<br />
The OWL Project<br />
Introducing <strong>SystemC</strong> in AME<br />
Design Engineers’ involvement<br />
<strong>SystemC</strong> Approach<br />
Conclusion<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 9
Introducing <strong>SystemC</strong> in AME<br />
Experience/Activities<br />
ManPower ManPower<br />
<strong>SystemC</strong> Modelling<br />
<strong>SystemC</strong> Methodology<br />
VHDL<br />
Implementation<br />
&<br />
Firmware<br />
Implementation<br />
<strong>SystemC</strong><br />
language<br />
AME<br />
<strong>SystemC</strong><br />
Methodology<br />
Start<br />
week1<br />
week5<br />
Time<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 10
Outline<br />
Part V. AME’s Experience<br />
t<br />
t<br />
t<br />
t<br />
t<br />
The OWL Project<br />
Introducing <strong>SystemC</strong> in AME<br />
Design Engineers’ involvement<br />
• Phase 1 : <strong>SystemC</strong> Modelling<br />
• Phase 2 : Implementation, Verification and Testing<br />
<strong>SystemC</strong> Approach<br />
Conclusion<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 11
Design Engineers’ Involvement<br />
( Phase 1 : <strong>SystemC</strong> modelling )<br />
Phase 1 :<br />
<strong>SystemC</strong><br />
Modelling<br />
HW<br />
designers<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 12
HW designers in Phase 1<br />
t<br />
t<br />
t<br />
t<br />
Design Engineers’ Involvement<br />
( Phase 1 : <strong>SystemC</strong> modelling )<br />
HW designers are familiar with <strong>SystemC</strong> concepts like<br />
• ports<br />
• signals<br />
• wait() concept<br />
HDL background is an advantage while learning/using<br />
<strong>SystemC</strong> to model a HW block.<br />
HW design experience makes it easier for a designer to<br />
make timing assumptions for TF models in <strong>SystemC</strong>.<br />
C++ and Object-Oriented Oriented background helps<br />
HW-designers to get used to <strong>SystemC</strong> syntax.<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 13
Design Engineers’ Involvement<br />
( Phase 1 : <strong>SystemC</strong> modelling )<br />
Phase 1 :<br />
<strong>SystemC</strong><br />
Modelling<br />
HW<br />
designers<br />
SW<br />
designers<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 14
SW designers in Phase 1<br />
t<br />
t<br />
t<br />
t<br />
SW designers are familiar with the syntax of <strong>SystemC</strong>,<br />
since it is a C++ based language<br />
UTF models of <strong>SystemC</strong> are very similar to SW coding.<br />
SW designers are less familiar with HW-concepts like<br />
• ports<br />
• signal timings and wait()<br />
Knowledge of abstract timing concepts such as<br />
• throughput<br />
• latency<br />
Design Engineers’ Involvement<br />
( Phase 1 : <strong>SystemC</strong> modelling )<br />
makes it possible for SW designers to develop CA<br />
Models.<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 15
Design Engineers’ Involvement<br />
( Phase 1 : <strong>SystemC</strong> modelling )<br />
Phase 1 :<br />
<strong>SystemC</strong><br />
Modelling<br />
HW<br />
designers<br />
SW<br />
designers<br />
System<br />
designers<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 16
System designers in Phase 1<br />
t<br />
t<br />
t<br />
t<br />
Design Engineers’ Involvement<br />
( Phase 1 : <strong>SystemC</strong> Modelling )<br />
Facilitate making executable spec. out of Matlab<br />
algorithms.<br />
Matlab usage (Algorithms + GUI) facilitates<br />
communication between HW/SW and system engineers.<br />
They decide on model abstraction level (BCA/CA vs.<br />
UTF/TF) to guide HW/SW engineers.<br />
<strong>SystemC</strong> language is easy to use by System engineers.<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 17
Design Engineers’ Involvement<br />
( Phase 2 : Impl. , verification and testing )<br />
Phase 1 :<br />
<strong>SystemC</strong><br />
modelling<br />
HW<br />
designers<br />
SW<br />
designers<br />
System<br />
designers<br />
Phase 2 :<br />
Implementation<br />
Verification<br />
and Testing<br />
HW/<strong>SystemC</strong><br />
Co-Simulation<br />
ISS/<strong>SystemC</strong><br />
CoSimulation<br />
<strong>SystemC</strong> reuse in<br />
system tests<br />
-FPGA<br />
-IC/ lab<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 18
Design Engineers’ Involvement<br />
t<br />
<strong>SystemC</strong> creates a suitable platform for<br />
• SW,<br />
• HW and<br />
• system designers<br />
to contribute to<br />
Executable specification of the design<br />
t<br />
Mutual interaction between different teams/disciplines<br />
• improves quality of the designed product<br />
• enhances the development time.<br />
• increases technical competence and related skills<br />
This makes up an ideal TEAM!<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 19
Design Engineers’ Involvement<br />
( Modelling and Implementation )<br />
Classical approach<br />
System designers<br />
<strong>SystemC</strong> approach<br />
System designers<br />
HW spec<br />
- funct.<br />
- perf.<br />
SW spec<br />
HW spec<br />
- funct.<br />
- perf.<br />
SW spec<br />
System level understanding<br />
HW designers<br />
SW designers<br />
HW designers<br />
SW designers<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 20
Outline<br />
Part V. AME’s Experience<br />
t<br />
t<br />
t<br />
t<br />
t<br />
The OWL Project<br />
Introducing <strong>SystemC</strong> in AME<br />
Design Engineers’ involvement<br />
<strong>SystemC</strong> Approach<br />
Conclusion<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 21
<strong>SystemC</strong> Approach<br />
( Testbench re-usage )<br />
Classical approach<br />
System designers<br />
<strong>SystemC</strong> approach<br />
System designers<br />
Testbench 1<br />
HW spec<br />
- funct.<br />
- perf.<br />
SW spec<br />
Testbench<br />
HW spec<br />
- funct.<br />
- perf.<br />
SW spec<br />
System level understanding<br />
HW designers<br />
SW designers<br />
Testbench 2<br />
HW designers<br />
Testbench 3<br />
SW designers<br />
Testbench<br />
Testbench<br />
Testbench 4<br />
Testbench<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 22
<strong>SystemC</strong> Approach<br />
( Examples from OWL-experience )<br />
Matlab<br />
model<br />
Matlab<br />
output<br />
Matlab<br />
stimuli<br />
<strong>SystemC</strong><br />
output<br />
HW spec<br />
- funct.<br />
HW spec<br />
- funct.<br />
- perf.<br />
- perf.<br />
HW designers<br />
System designers<br />
SW spec<br />
SW spec<br />
SW designers<br />
t<br />
Matlab integration<br />
• Matlab files are read by<br />
<strong>SystemC</strong> Models.<br />
• <strong>SystemC</strong> dumps results to<br />
Matlab files<br />
• <strong>SystemC</strong> testbench<br />
compares the <strong>SystemC</strong><br />
spec outputs to Matlab<br />
reference outputs and<br />
generates reports<br />
Reports<br />
Analyze<br />
in<br />
Matlab environment<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 23
<strong>SystemC</strong> Approach<br />
( Examples from OWL-experience )<br />
HW spec<br />
- funct.<br />
- perf.<br />
HW designers<br />
System designers<br />
Reports<br />
SW spec<br />
SW designers<br />
t<br />
t<br />
SW bug<br />
The Model is executable<br />
Early bug detection!!<br />
• alarm conditions of the system<br />
are detected at <strong>SystemC</strong> top level<br />
integration phase<br />
• HW/SW interface is designed<br />
and bugs are fixed at <strong>SystemC</strong><br />
design phase<br />
<strong>SystemC</strong> execution output:<br />
<strong>SystemC</strong> execution output:<br />
(Testbench) : Starting Test1.<br />
(Testbench) : Transmission started at time 500 ns.<br />
(PHY) : Sytem running.......<br />
(PHY) : 5 symbols of frame 1 transmitted..<br />
(PHY) : FIFO1 full! System error!!!<br />
(Testbench) : Starting Test1.<br />
(Testbench) : Transmission started at time 500 ns.<br />
(PHY) : Sytem running.......<br />
(PHY) : Parameter P1 =0 , P2 = BPSK, P3 = 1/2<br />
....<br />
(PHY) :Output not as expected!! See LOG file<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 24
<strong>SystemC</strong> Approach<br />
( Design complexity and time )<br />
t<br />
t<br />
Mastering design complexity<br />
Reducing design time ( and first-time<br />
time-right ! )<br />
Examples of some sub-blocks blocks :<br />
CA<br />
TF<br />
CA<br />
System<br />
C code<br />
size<br />
VHDL code<br />
size (#lines)<br />
Hardware size<br />
(#Gates)<br />
VHDL<br />
development<br />
time (mandays)<br />
<strong>SystemC</strong><br />
development<br />
time (mandays)<br />
HWObservations 400 2083 37295 80 65<br />
Processor 1789 2221 10272 150 50<br />
Rotor 686 770 60999 25 15<br />
Correlator 102 210 24900 35 10<br />
Counter 220 137 1183 10 2<br />
Deinterleaver 200 20 2<br />
Viterbi 1100 40 5<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 25
Outline<br />
Part V. AME’s Experience<br />
t<br />
t<br />
t<br />
t<br />
t<br />
The OWL Project<br />
Introducing <strong>SystemC</strong> in AME<br />
Design Engineers’ involvement<br />
<strong>SystemC</strong> Approach<br />
Conclusion<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 26
Conclusion<br />
t<br />
Errors detected in early stage<br />
t System specification is generated :<br />
t<br />
t<br />
t<br />
t<br />
• without thinking about HW/SW first.<br />
• As specification evolves, parts to be implemented in SW and HW become b<br />
clearer.<br />
The methodology development done for this project<br />
• smoothened integration phase (SW/HW <strong>SystemC</strong> model integration)<br />
• may be reused in other projects<br />
Testbenches come with the Spec.<br />
These testbenches can be reused in implementation and<br />
testing phases.<br />
Matlab is integrated to <strong>SystemC</strong> testbenches.<br />
30.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part V - slide 27
Part VI.<br />
Summary and Conclusions<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part VI - slide 1
Summary<br />
t Need for System-on<br />
on-Chip (SoC) Design Methodology<br />
t OSCI <strong>SystemC</strong> provides solution :<br />
Language & reference simulator<br />
• Suitable for system ( hardware , firmware , software ) level design<br />
• Supports different levels of abstraction<br />
with gradual and partial refinement<br />
• Executable specification<br />
• Open Source <strong>SystemC</strong> Initiative<br />
• Big momentum , world-wide<br />
wide<br />
• Roadmap : new versions evolve while being backwards compatible<br />
• Seed for <strong>SystemC</strong>-based tools and methodologies<br />
t Besides the language, one needs also a Methodology ...<br />
• AME used the <strong>SystemC</strong> language to develop<br />
an own <strong>SystemC</strong>-based SoC-Design Methodology<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part VI - slide 2
Summary<br />
t<br />
t<br />
Introducing <strong>SystemC</strong> in Alcatel <strong>Microelectronic</strong>s<br />
• Early adoption of <strong>SystemC</strong> language and reference simulator<br />
• Fast learning curve<br />
• In context of real-life life project : OWL Wireless LAN Project<br />
• Resulted in : OWL Executable System model<br />
( Hardware , Firmware , Software )<br />
• Resulted in :<br />
SoC Design Methodology<br />
The AME SoC Design Methodology<br />
• Iterative based design : reducing risks , model based<br />
• Iteration-0 0 : <strong>SystemC</strong> model development<br />
t executable specification as golden reference<br />
t tool for early (designers/customers) feedback and design decisions<br />
• Next iterations ( design implementation, test and qualification ):<br />
t <strong>SystemC</strong> model as reference & test-bench re-usage<br />
t <strong>SystemC</strong> based co-simulation during hardware and software design<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part VI - slide 3
t<br />
Summary<br />
Experience from the OWL Project<br />
• <strong>SystemC</strong> is easy to learn and use<br />
• <strong>SystemC</strong> is extendable : C++ , Matlab integration , fixed point types<br />
• Fast model development for complex and large system<br />
t Abstraction level : mainly TF , some CA<br />
t Master/Slave communication, separated from behaviour<br />
• Model integration methodology is required<br />
• Methodology needs to be well documented<br />
• Allows early involvement of several multi-disciplinary teams (system,<br />
hardware, software engineers) :<br />
t cross-fertilization of ideas<br />
t the ideal team !<br />
• Executable model results in<br />
t fast feedback from designers / customers / marketing<br />
t early bug-detection<br />
t faster and higher-quality design cycles<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part VI - slide 4
Conclusion<br />
t<br />
The OWL Project team at Alcatel <strong>Microelectronic</strong>s<br />
gained large experience and expertise<br />
in System-on<br />
on-Chip development<br />
and SoC Design Methodologies<br />
by using <strong>SystemC</strong><br />
and making an executable specification<br />
of a real-life life Wireless LAN product<br />
!! Hip hip hurray for <strong>SystemC</strong> !!<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part VI - slide 5
Appendix<br />
References<br />
t<br />
t<br />
t<br />
t<br />
http://www.systemC<br />
systemC.org<br />
<strong>SystemC</strong> source code<br />
UserGuide.pdf<br />
systemc-forum@<br />
forum@systemc.org<br />
http://www-ti<br />
ti.informatik.uni-tuebingen.de/~<br />
.de/~systemc<br />
ESCUG<br />
http://www<br />
www.ittf.no/<br />
.no/aktiviteter/2001/dakforum/program<br />
DAK2001 Forum 2001<br />
http://www.alcatel<br />
alcatel.com/microelectronics<br />
marc.pauwels<br />
pauwels@mie.alcatel.be<br />
yves.vanderperren<br />
vanderperren@mie.alcatel.be<br />
ates.berna<br />
berna@alcatel.com.<br />
.com.tr<br />
fatma.ozdemir@alcatel.com.<br />
.com.tr<br />
.be fatma<br />
15.01.2002 <strong>SystemC</strong> <strong>Tutorial</strong> © 2002 - Alcatel <strong>Microelectronic</strong>s<br />
Part VI - slide 6