20.03.2015 Views

SystemC Tutorial - Microelectronic Systems Laboratory

SystemC Tutorial - Microelectronic Systems Laboratory

SystemC Tutorial - Microelectronic Systems Laboratory

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!