Simulatore

Anche il processo simulatore necessita in ingresso di alcuni parametri, secondo la seguente sintassi:

c:\Simulator <*.hex file> <*.ram Image File> <-log| -unlog>

Il file *.hex viene passato in funzione del file *.asm del progetto corrente mentre il file immagine e l’opzione log o unlog dipendono dalla finestra di dialogo riportata in figura 21.

figura 21 – Schermata per la selezione del file del file immagine

 

L’opzione “Update log file on fetch event” permette di abilitare la scrittura del file di log ogni volta che viene caricata una nuova istruzione; in realtà vengono loggate tutte le fasi successive ovvero quella di decode e di execute riportando in ultimo il dump dei registri interni. Tale opzione è di particolare utilità per controllare parti di programma critiche (la sua abilitazione rallenta la simulazione a causa del continuo accesso al file di *.slg).  Il simulatore al pari del compilatore può essere eseguito in ambiente DOS o altri sistemi operativi, se ricompilato.

Il programma principale Simulator.c include i seguenti file header (oltre ad alcuni header  delle librerie standard):

#include "myVariable.h"     // variabili globali

#include "myConstant.h"     // dichiara le costanti degli operandi e di programma

#include "myFunction.h"     // dichiara funzioni matematiche IntToBin BinToInt…

#include "exeIstr.h"        // funzioni relative alle istruzioni da eseguire

#include "compute.h"        // ha le funzioni fetch decode execoute

Alcune, utilizzate nel programma di compilazione, sono state riutilizzate anche in questo programma. Dopo la lettura e il controllo dei parametri passati il programma provvede ad allocare degli spazi di memoria in modo da simulare la RAM del microprocessore e la rispettiva ROM. Allocati gli spazi opportuni viene letto il file esadecimale e successivamente il file immagine. Lo spazio di memoria RAM dedicata all’immagine destinazione viene settato a FFh tramite programma piuttosto che leggere e riportare in RAM il contenuto del file. Tutte le operazioni di cui sopra vengono loggate nel file *.slg. Prima di avviare la simulazione vengono inizializzati gli array di contatori nei quali vengono conteggiati gli accessi ai registri interni e l’uso delle varie istruzioni.

Complessivamente ai fini dell’analisi statistica sono utilizzate le seguenti variabili :

int NumeroIstruzioni;   // conta il numero di istruzioni lette

 

long int counterReg [15];        // conta accesso ai singoli registri

long int counterIstr [15];       // conta esecuzione delle singole istruzioni (8)

long int branchUp =0;

long int branchDown =0;

 

Prima di avviare la simulazione viene posta la variabile PC=0. L’intera simulazione viene svolta all’interno del seguente ciclo infinito, alla fine del quale viene creato un file di output contenente l’immagine di uscita e il file di log viene chiuso.

 

while (1) // ciclo infinito

{    printf (".");                    // stampa sullo schermo punto/istruzione

     fetch (Istruzione,PrgMemory,log);

     decode (Istruzione,log);

     PC++;                            // il BRGT cambierà eventualmente il PC

     if (execut (ImgMemory,log)) break;    // ritorna 1 se esegue RETURN (esco se 1)

}

Da quanto spiegato si capisce l’utilità dei file header, grazie ai quali si è potuta mantenere una linearità concettuale nella stesura del programma. Le funzioni fetch, decode ed execute sono contenute nel file compute.h; da questo file vengono poi richiamate le rispettive funzioni (contenute nel file exeIstr.h) che implementano le istruzioni di volta in volta caricate e decodificate. Si riporta sotto il file di log *.slg relativo alla simulazione del file precedentemente compilato; non si fa uso della memoria destinata all’immagine destinazione.

Set Program file : C:\WINDOWS\Desktop\Prova.hex

Set Image file : C:\WINDOWS\Desktop\Digitale\Sorgente\img_mem.img

Program's Array memory allocated

Image's Array memory allocated

Open Program file : C:\WINDOWS\Desktop\Prova.hex

Program loaded.

Open Image file : C:\WINDOWS\Desktop\Digitale\Sorgente\img_mem.img

Image loaded.

Image's destination RAM is set to 0xFF.

 

The loaded Program is :

 

0  : 1100000000000001

1  : 1100010000011110

2  : 1100011000001000

3  : 1110011001100010

4  : 0010011001100000

5  : 1101110000001000

6  : 0100011001011100

7  : 0110000000000000

 

*********** START SIMULATION ***********

 

Interrupt received

Internal Registers clear

 

Fetch intstruction  0 : 1100000000000001

Instruction Decode like : MOVE

Opcode : 6

Destination Register : 0

Immediate Operand : 1

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000000000

Reg3  : 0000000000000000000

[…]

Reg14 : 0000000000000000000

Reg15 : 0000000000000000000

 

Fetch intstruction  1 : 1100010000011110

Instruction Decode like : MOVE

Opcode : 6

Destination Register : 2

Immediate Operand : 30

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000000000

[…]

Reg14 : 0000000000000000000

Reg15 : 0000000000000000000

 

Fetch intstruction  2 : 1100011000001000

Instruction Decode like : MOVE

Opcode : 6

Destination Register : 3

Immediate Operand : 8

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000001000

[…]

Reg14 : 0000000000000000000

Reg15 : 0000000000000000000

 

Fetch intstruction  3 : 1110011001100010

Instruction Decode like : SHIFTL

Opcode : 7

Destination Register : 3

Source Register 1 : 3

Immediate Operand : 2

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000100000

[…]

Reg14 : 0000000000000000000

Reg15 : 0000000000000000000

 

Fetch intstruction  4 : 0010011001100000

Instruction Decode like : SUB

Opcode : 1

Destination Register : 3

Source Register 1 : 3

Source Register 2 : 0

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000011111

[…]

Reg14 : 0000000000000000000

Reg15 : 0000000000000000000

 

Fetch intstruction  5 : 1101110000001000

Instruction Decode like : MOVE

Opcode : 6

Destination Register : 14

Immediate Operand : 8

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000011111

[…]

Reg14 : 0000000000000001000

Reg15 : 0000000000000000000

 

Fetch intstruction  6 : 0100011001011100

Instruction Decode like : BRGT

Opcode : 2

Load PC from Register : 14

Source Register 1 : 3

Source Register 2 : 2

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000011111

[…]

Reg14 : 0000000000000001000

Reg15 : 0000000000000000000

 

Fetch intstruction  4 : 0010011001100000

Instruction Decode like : SUB

Opcode : 1

Destination Register : 3

Source Register 1 : 3

Source Register 2 : 0

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000011110

[…]

Reg14 : 0000000000000001000

Reg15 : 0000000000000000000

 

Fetch intstruction  5 : 1101110000001000

Instruction Decode like : MOVE

Opcode : 6

Destination Register : 14

Immediate Operand : 8

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000011110

[…]

Reg14 : 0000000000000001000

Reg15 : 0000000000000000000

 

Fetch intstruction  6 : 0100011001011100

Instruction Decode like : BRGT

Opcode : 2

Load PC from Register : 14

Source Register 1 : 3

Source Register 2 : 2

Execute done.

 

Register Dump

 

Reg0  : 0000000000000000001

Reg1  : 0000000000000000000

Reg2  : 0000000000000011110

Reg3  : 0000000000000011110

[…]

Reg14 : 0000000000000001000

Reg15 : 0000000000000000000

 

Fetch intstruction  7 : 0110000000000000

Instruction Decode like : RETURN

Opcode : 3

 

***********  SIMULATION END  ***********

 

Statistics file created : C:\WINDOWS\Desktop\Prova.sta

Image file output created : C:\WINDOWS\Desktop\Prova.img

Log END

 

Michele Marino - M.M.Electronics