44
UE SYSTEMC – Cours 2 Etude et modélisation d’un processeur en SystemC Francois.pecheux @lip6.fr [email protected]

UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC [email protected] [email protected]

Embed Size (px)

Citation preview

Page 1: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

UE SYSTEMC – Cours 2

Etude et modélisation d’un processeur en SystemC

[email protected]

[email protected]

Page 2: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Constructeur

Données membres, l’interface

Nom du module

half_adder.h// File : half_adder.h#include "systemc.h"

SC_MODULE(half_adder){

sc_in<bool> a,b;sc_out<bool> sum,carry;

void prc_half_adder();

SC_CTOR(half_adder){

SC_METHOD(prc_half_adder);sensitive << a << b;

}};

half_adder.h

Page 3: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

SC_METHOD (1)// File : half_adder.h#include "systemc.h"

SC_MODULE(half_adder){

sc_in<bool> a,b;sc_out<bool> sum,carry;

void prc_half_adder();

SC_CTOR(half_adder){

SC_METHOD(prc_half_adder);sensitive << a << b;

}};

Déclare un process sansmémoire appelé prc_half_adder()

Ne peut utiliser les wait

Sensibilité « statique » sur a et b

Page 4: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

SC_METHOD (2)

// File : half_adder.cpp

#include "half_adder.h"

void half_adder::prc_half_adder()

{

sum = a ^ b;

carry = a & b;

}

Page 5: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Description de la hiérarchie// File : full_adder.h#include "half_adder.h"

SC_MODULE(full_adder){

sc_in<bool> a,b,carry_in;sc_out<bool> sum,carry_out;

sc_signal<bool> c1,s1,c2;void prc_or();

half_adder *ha1_ptr,*ha2_ptr;

SC_CTOR(full_adder){

ha1_ptr=new half_adder("ha1");// Named association:ha1_ptr->a(a);ha1_ptr->b(b);ha1_ptr->sum(s1);ha1_ptr->carry(c1);

ha2_ptr=new half_adder("ha2");// Positional association:(*ha2_ptr)(s1,carry_in,sum,c2);

SC_METHOD(prc_or);sensitive << c1 << c2;

}

// A destructor~full_adder(){

delete ha1_ptr;delete ha2_ptr;

}};

// File : full_adder.cpp

#include "full_adder.h"

void full_adder::prc_or()

{

carry_out = c1 | c2;

}

Page 6: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

driver.h, driver.cpp

// File : driver.h#include "systemc.h"

SC_MODULE(driver){

sc_out<bool> d_a,d_b,d_cin;

void prc_driver();

SC_CTOR(driver){

SC_THREAD(prc_driver);}

};

// File : driver.cpp

#include "driver.h"

void driver::prc_driver()

{

sc_uint<3> pattern;

pattern=0;

while (1)

{

d_a=pattern[0];

d_b=pattern[1];

d_cin=pattern[2];

wait(5,SC_NS);

pattern++;

}

}

Page 7: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

monitor.h, monitor.cpp

// File : monitor.h#include "systemc.h"

SC_MODULE(monitor){

sc_in<bool> m_a,m_b,m_cin,m_sum,m_cout;

void prc_monitor();

SC_CTOR(monitor){

SC_METHOD(prc_monitor);sensitive << m_a

<< m_b << m_cin << m_sum << m_cout;

}};

// File : monitor.cpp

#include "monitor.h"

void monitor::prc_monitor()

{

cout << "At time " << sc_time_stamp() << "::";

cout << "(a, b, carry_in): ";

cout << m_a

<< m_b << m_cin;

cout << " (sum, carry_out): " << m_sum

<< m_cout << endl;

}

Page 8: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Schématique du toplevel

driver

full_adder

monitor

Page 9: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Le toplevel// File : full_adder_main.cpp#include "driver.h"#include "monitor.h"#include "full_adder.h"

int sc_main(int argc,char *argv[]){ sc_signal<bool> t_a, t_b, t_cin, t_sum, t_cout;

full_adder f1("FullAdderWithHalfAdder"); // Connect using positional association: f1 << t_a << t_b << t_cin << t_sum << t_cout;

driver d1("GenerateWaveforms"); // Connect using named association: d1.d_a(t_a); d1.d_b(t_b); d1.d_cin(t_cin);

monitor mo1("MonitorWaveforms"); mo1 << t_a << t_b << t_cin << t_sum << t_cout;

sc_start(100,SC_NS);

return(0);}

A éviter

A utiliser

Page 10: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Tracede

simulation

Page 11: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Pour ajouter des traces (.vcd)

Page 12: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

VHDL – SystemC (1)entity my_model is

port(input1: in BIT;input2: in BIT; output1: out BIT; output2: out BIT;);

end my_model;architecture my_arch of my_model isbegin process( input1, input2) variable my_var1,my_var2: BIT; begin

my_var1 := not input1;my_var2 := not input2;output1 <= input1 and my_var2;

output2 <= input2 and my_var1; end process;end my_arch;

#include “systemc.h”SC_MODULE (my_model){ sc_in<bool> input1; sc_in<bool> input2; sc_out<bool> output1; sc_out<bool> output2; SC_CTOR (my_model) { SC_METHOD ( process ); sensitive << input1 << input2; } void process( ) { bool my_var1, my_var2; my_var1 = ~input1; my_var2 = ~input2; output1 = input1 & my_var2; output2 = input2 & my_var1; }};

Page 13: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

VHDL – SystemC (2)process( input1, input2 )

process(clk). . .if ( clk’event and clk = ‘1’)

then

SC_METHOD ( process ); sensitive << input1 << input2;

SC_METHOD ( process ); sensitive_pos << clk;

Page 14: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

MINIMIPS1

1

1

1

32

32

32

DATAIN

DATAOUT

ADDRESS

MEMREAD

MEMWRITE

CLK

RESET MEMOIRE

ADDRESS

1

CLK

MEMREAD

MEMWRITE

DATAOUT

DATAIN

Le système MINIMIPS

Processeur 32 bits MIPS R3000 simplifié + mémoire d’instructions et de données

Page 15: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

1

1

1

1

32

32

32

DATAIN

DATAOUT

ADDRESS

MEMREAD

MEMWRITE

CLK

RESETAutomate de contrôle

(FSM)

Chemin de données(DATAPATH)

13 commandes

2 indications

Le processeur MINIMIPS

Page 16: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

1

1

32

32

32ADDRESS

1

CLK

MEMREAD

MEMWRITE

DATAOUT

DATAIN

La mémoire

Mémoireinstructions

MémoireDonnées

@0 : Inst 0@4 : Inst 1@8 : Inst 2@C : Inst 3

@80 : Data 0@84 : Data 1

Page 17: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Processeur MINIMIPS

• 1 Register File = 32 registres 32 bits nommés $0 à $31 ($0=0)

• 1 registre PC (Program counter)

• 1 registre IR (Instruction register)

• 1 registre DT (Data)

• 1 registre AD (Address)

$0=0

$1

$31

PC

IR

DT

AD

Page 18: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Les formats d’instructions du MIPSR3000

Le processeur possède 57 instructions qui se répartissent en 4 classes :33 instructions arithmétiques/logiques entre registres12 instructions de branchement7 instructions de lecture/écriture mémoire5 instructions systèmes

Toutes les instructions ont une longueur de 32 bits et possèdent un des trois formats suivants :

OPCOD RS RT RD

31 25 20 15 10 0

OPCOD RS RT

OPCOD

IMD16

IMD26

Format R

Format I

Format J

5

SH FUNC

Page 19: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Décodage de l’opcod

000 001 010 011 101 110 111

000

001

100

011

010

100

101

110

111

SPECIAL

ADDI LUISLTI

SWSHSB

LB

ANDI ORI XORI

J JAL BEQ BNE

INS 28 : 26

INS

3

1 :

29

BCOND BLEZ BGTZ

ADDIU SLTIU

COPRO

LH LW LBU LHU

DECODAGE OPCOD

Page 20: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Instruction « special »IN

S

5 :

3

SUB

SLL SRL SRA

SLT

AND OR XOR

JALR

INS 2 : 0

OPCOD = SPECIAL

SLLV SRLV SRAV

SYSCALL BREAK

NORADD ADDU SUBU

SLTU

JR

DIVMULT MULTU DIVU

MFLOMFHI MTHI MTLO

000 001 010 011 101 110 111

000

001

100

011

010

100

101

110

111

Page 21: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Exemples d’instructions

• addi $12, $0, 0x80met 0x80 dans $12format I

Valeur immédiate

001000 00000 01100 0000000010000000

Page 22: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Exemples d’instructions

• lw $6, 4($2)

charge dans $6 le contenu de la case mémoire pointée par ($2+4)

Registre d’adressage mémoire

offset

345678

12$2=0x10010000+4+8+C

100011 00010 00110 0000000000000100

0000000000000000 0000000000000100 = 0x0000 0100+ 0001000000000001 0000000000000000 = 0x1001 0000 0001000000000001 0000000000000100 = 0x1001 0100

Extension de signe

Page 23: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Exemples d’instructions

• add $13, $11, $8met la somme de $11 et $8 dans $13format R

Valeur immédiate

001000 01000 01011 01101 XXXXX 100000

RS toujours registre sourceRT peut être source et destinationRD toujours registre destination

Page 24: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Exemples d’instructions

• beq $8,$10, saut

le processeur va à l’adresse saut si $8=$10 (étudié en TP)

Page 25: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Instructionsarithmétiques

Instructions Arithmétiques/Logiques entre registres

Assembleur Opération Format

Add

Sub

Or

And

Xor

Sllv

Srlv

Srav

Rd, Rs, Rt

Rd, Rs, Rt

Rd, Rs, Rt

Rd, Rs, Rt

Rd, Rs Rt

Rd, Rt, Rs

Rd, Rt, Rs

Rd, Rt, Rs

Rd <-Rs + Rt

Rd <-

Rd <-

Rd <-

Rd <-

Rd <-

Rd <-

Rd <-

Rs - Rt

Rs or Rt

Rs and Rt

Rs xor Rt

Rt << Rs

Rt >> Rs

Rt >>* Rs

Add

Subtract

Logical Or

Logical And

Logical Exclusive-Or

Shift Left Logical Variable

Shift Right Logical Variable

Shift Right Arithmetical Variable

5 lsb of Rs is significant

5 lsb of Rs is significant

5 lsb of Rs is significant

overflow detection

overflow detection

R

R

R

R

R

R

R

R

Addi Rt, Rs,I Rt <- Rs + IAdd Immediate overflow detection

I

Ori

Andi

Xori

Rt, Rs, I

Rt, Rs, I

Rt, Rs, I

Rt <-

Rt <-

Rt <-

Rs or I

Rs and I

Rs xor I

Or Immediate

And Immediate

Exclusive-Or Immediate

unsigned immediate

unsigned immediate

unsigned immediate

I

I

I

Sll

Srl

Sra

Rd, Rt, sh

Rd, Rt, sh

Rd, Rt, sh

Rd <-

Rd <-

Rd <-

Rt << sh

Rt >> sh

Rt >>* sh

Shift Left Logical

Shift Right Logical

Shift Right Arithmetical

Lui Rt, I Rt <- I || "0000"Load Upper Immediate I16 lower bits of Rt are set to zero

Addu

Subu

Rd, Rs, Rt

Rd, Rs, Rt

Rd <-Rs + Rt

Rd <-Rs - Rt

Add

Subtract

R

R

Nor Rd, Rs, Rt Rd <-Rs nor RtLogical Not Or R

R

R

R

Addiu Rt, Rs,I Rt <- Rs + IAdd Immediate I

no overflow

no overflow

no overflow

* : with sign extension

Page 26: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Assembleur Opération Format

Beq

Bne

Rs, Rt, Label

Rs, Rt, Label

PC <- I

I

Branch if Equal

Branch if Not Equal

PC+4+(I*4)

Instructions de Branchement

PC <- PC+4

PC <- PC+4+(I*4)

PC <- PC+4

J Label Jump PC <- PC 31:28 || I*4

Jal Label Jump and LinkPC <- PC 31:28 || I*4

R31 <- PC+4

Jr Rs Jump Register PC <- Rs

Jalr Rs Jump and Link Register

PC <- Rs

R31 <- PC+4

J

J

R

R

Bgez Rs, Label PC <- IBranch if Greater or Equal Zero

PC+4+(I*4)

PC <- PC+4

Bgtz Rs, Label PC <- IBranch if Greater Than Zero PC+4+(I*4)PC <- PC+4

Blez Rs, Label PC <- IBranch if Less or Equal Zero

PC+4+(I*4)PC <- PC + 4

Bltz Rs, Label PC <- IBranch if Less Than Zero PC+4+(I*4)PC <- PC+4

Bgezal Rs, Label PC <- IBranch if Greater or Equal Zero and link

PC+4+(I*4)PC <- PC+4

R31 <-PC+4 in both cases

Bltzal Rs, Label PC <- IBranch if Less Than Zero and link

PC+4+(I*4)

PC <- PC+4

R31 <- PC+4 in both cases

Jalr Rd, Rs Jump and Link Register

PC <- Rs

Rd <- PC+4 R

if Rs = Rtif Rs ° Rt

if Rs ° Rt

if Rs = Rt

if Rs 0

if Rs < 0

if Rs > 0if Rs Š 0

if Rs Š 0if Rs > 0

if Rs < 0if Rs 0

if Rs 0if Rs < 0

if Rs < 0

if Rs 0

Instructionsde branchement

Page 27: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Assembleur Opération Format

Lw

Sw

Lbu

Sb

Rt, I (Rs)

Rt, I (Rs)

Rt, I (Rs)

Rt, I (Rs)

Rt <-

M (Rs + I) <-

I

I

I

I

Load Word

Store Word

Load Byte Unsigned

Store Byte

M (Rs + I)

Rt

Instructions de lecture/écriture mémoire

Rt <-

M (Rs + I) <-

M (Rs + I)

Rt

sign extended Immediate

sign extended Immediate

sign extended Immediate. One byte from storage is loaded into the less significant byte of Rt, other bytes are set to zero

sign extended Immediate. The less significant byte of Rt is stored into storage

Lb Rt, I (Rs) ILoad Byte Rt <- M (Rs + I)sign extended Immediate. One byte from storage is loaded into the less significant byte of Rt. The sign of this byte is extended on the 3 most signficant bytes.

Lhu

Sh

Rt, I (Rs)

Rt, I (Rs)

I

I

Load Half Word Unsigned

Store Half Word

Rt <-

M (Rs + I) <-

M (Rs + I)

Rt

sign extended Immediate. Two bytes from storage is loaded into the the 2 less significant bytes of Rt, other bytes are set to zero

sign extended Immediate. The Two less significant bytes of Rt are stored into storage

Lh Rt, I (Rs) ILoad Half Word Rt <- M (Rs + I)sign extended Immediate. Two bytes from storage is loaded into the 2 less significant bytes of Rt. The sign of these 2 bytes is extended on the 2 most signficant bytes.

Instructions d’accès mémoire

Page 28: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr
Page 29: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Le banc de registres

RF

MUX_RF_W MUX_RF_R

IR(20:16) IR(15:11) IR(25:21) IR(20:16)

0 10 1

data1Writedata

Page 30: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

cst0_32.h#ifndef _CST0_32_H#define _CST0_32_H#include "systemc.h"

SC_MODULE(cst0_32){

sc_out<sc_uint<32> > S;

SC_CTOR(cst0_32){

SC_METHOD(mWrite);}

void mWrite(){

S.write(0) ;}

};#endif

Utilisé pour générer la constante 0

Page 31: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

mux21_5.h#ifndef _MUX21_5_H#define _MUX21_5_H#include "systemc.h"

SC_MODULE(mux21_5){

sc_in<sc_uint<5> > IN0;sc_in<sc_uint<5> > IN1;sc_in<bool> COM;sc_out<sc_uint<5> > S;

SC_CTOR(mux21_5){

SC_METHOD(mWrite);sensitive << IN0 << IN1 << COM ;

}

void mWrite(){

int com=(int)COM.read();

switch (com){

case 0:S.write(IN0.read()); break;

case 1:S.write(IN1.read()); break;

}}

};#endif

Utilisé pour choisir les registresSource et destination

Page 32: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

alu_32.h#ifndef _ALU_32_H#define _ALU_32_H#include "systemc.h"

SC_MODULE(alu_32){

sc_in<sc_uint<32> > A, B; sc_in<sc_uint<3> > Aluop;sc_out<sc_uint<32> > Aluout; sc_out<bool> zero;

SC_CTOR(alu_32) {SC_METHOD(mWrite);sensitive << A << B << Aluop ;

}

void mWrite() {sc_uint<32> result = 0 ; sc_uint<32> opA ; sc_uint<32> opB ;opA = A.read() ;opB = B.read() ;switch(Aluop.read()) {

case 0: result = opA & opB ; break;case 1: result = opA | opB ; break;case 2: result = opA + opB ; break;case 6: result = opA - opB ; break;case 7: result = opA | opB ; break;default: cout << "aluop illegal" << endl ; break;

}Aluout=result;zero=(result==0)?1:0;

}};#endif

Page 33: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

nosign_extend_32.h#ifndef _NOSIGN_EXTEND_32_H#define _NOSIGN_EXTEND_32_H#include "systemc.h"

SC_MODULE(nosign_extend_32){

sc_in<sc_uint<16> > I;sc_out<sc_uint<32> > O;

SC_CTOR(nosign_extend_32){

SC_METHOD(mWrite);sensitive << I ;

}

void mWrite(){

sc_uint<16> i_value=I.read();

O.write(0x00000000 | i_value.range(15,0));}

};#endif

Page 34: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

sign_extend_32.h#ifndef _SIGN_EXTEND_32_H#define _SIGN_EXTEND_32_H#include "systemc.h"

SC_MODULE(sign_extend_32){

sc_in<sc_uint<16> > I;sc_out<sc_uint<32> > O;

SC_CTOR(sign_extend_32){

SC_METHOD(mWrite);sensitive << I ;

}

void mWrite() {sc_uint<16> i_value=I.read();

if (i_value[15]==1)O.write(0xFFFF0000 | i_value);

elseO.write(i_value);

}};#endif

Page 35: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

plain_reg_32.h#ifndef _PLAIN_REG_32_H#define _PLAIN_REG_32_H#include "systemc.h"

SC_MODULE(plain_reg_32){

sc_in<sc_uint<32> > D;sc_in<bool> regWrite;sc_in<bool> clk;sc_out<sc_uint<32> > Q;

SC_CTOR(plain_reg_32){SC_METHOD(mWrite);sensitive << clk.pos();}

void mWrite(){if (regWrite){Q = D;}}

};#endif

Utilisé pour AD et DT

Page 36: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

ir_reg_32.h#ifndef _IR_REG_32_H#define _IR_REG_32_H#include "systemc.h"

SC_MODULE(ir_reg_32){

sc_in<sc_uint<32> > D; sc_in<bool> regWrite; sc_in<bool> clk;sc_out<sc_uint<32> > Q;sc_out<sc_uint<16> > Q15_0;sc_out<sc_uint<5> > Q15_11;sc_out<sc_uint<5> > Q20_16;sc_out<sc_uint<5> > Q25_21;

SC_CTOR(ir_reg_32) {SC_METHOD(mWrite);sensitive << clk.pos();

}

void mWrite() {if (regWrite) {sc_uint<32> din=D.read();Q = D;Q15_0.write(din.range(15,0));Q15_11.write(din.range(15,11));Q20_16.write(din.range(20,16));Q25_21.write(din.range(25,21));}

}};#endif

Page 37: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

pc_reg_32.h

#ifndef _PC_REG_32_H#define _PC_REG_32_H#include "systemc.h"

SC_MODULE(pc_reg_32){

sc_in<sc_uint<32> > D;sc_in<bool> clk;sc_in<bool> PCWrite;sc_in<bool> reset;sc_out<sc_uint<32> > Q;

SC_CTOR(pc_reg_32) {SC_METHOD(mWrite);sensitive << clk.pos();

}

void mWrite() {sc_uint<32> d_input=D.read();

if (reset==0) {Q = 0x0;}else if (PCWrite) {Q = d_input;}

}};#endif

Page 38: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

rf32.h

#ifndef _RF32_H#define _RF32_H#include "systemc.h"

SC_MODULE(rf32){

sc_in<bool> clk, RegWrite; sc_in<sc_uint<5> > Addwrite, Addrd1;sc_in<sc_uint<32> > Writedata; sc_out<sc_uint<32> > data1;sc_signal<sc_uint<32> > regFile[32];SC_CTOR(rf32) {

SC_METHOD(mReadRegs);sensitive << Addrd1 ;sensitive << clk.neg() ;SC_METHOD(mWriteReg);sensitive << clk.pos() ;

}void mReadRegs() {

if (Addrd1.read()==0)data1.write(0);

elsedata1.write(regFile[Addrd1.read()].read());

}void mWriteReg(){

if (RegWrite)if (Addwrite.read()!=0) {

regFile[Addwrite.read()].write(Writedata.read());}

}};#endif

Page 39: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

1

1

1

1

32

32

32

DATAIN

DATAOUT

ADDRESS

MEMREAD

MEMWRITE

CLK

RESETAutomate de contrôle

(FSM)

Chemin de données(DATAPATH)

13 commandes

2 indications

Le processeur MINIMIPS

Page 40: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr
Page 41: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Moore FSM

RegistreD’état

Fonctionde

Transition(combinatoire)

Fonctionde

fénérationdes sortiesde Moore

(combinatoire)

clk

zero,IR

write_pcmux_rf_wwrite_rfmux_rf_rwrite_adwrite_dtwrite_irmux_xmux_ymux_addraluopmemrw

nreset

Page 42: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Le code de fsm.h

• Editez le fichier fsm.h

Page 43: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

ram.h

#ifndef _RAM_H#define _RAM_H#include "systemc.h"

SC_MODULE(ram){

sc_in<sc_uint<32> > addr; sc_out<sc_uint<32> > dout;sc_in<sc_uint<32> > din; sc_in<sc_uint<2> > memrw; sc_in<bool> clk;sc_uint<32> ramContents[100];SC_CTOR(ram) {

SC_METHOD(mRead);sensitive << addr << memrw;SC_METHOD(mWrite);sensitive << clk.pos();

ramContents[0]=0x20010080;ramContents[1]=0x8C220000;ramContents[2]=0x8C230004;ramContents[32]=0x00000001;ramContents[33]=0x00000002;

}void mRead() {

if ((int)memrw.read()==1)dout.write(ramContents[addr.read()>>2]) ;

}void mWrite() {

if ((int)memrw.read()==2)ramContents[addr.read()>>2]=din.read() ;

}};#endif

Page 44: UE SYSTEMC – Cours 2 Etude et modélisation dun processeur en SystemC Francois.pecheux@lip6.fr Julien.denoulet@lip6.fr

Le toplevel

• Editez le fichier main.cpp