Modèle Verilog du processeur

Transcription

Modèle Verilog du processeur
Modélisation Verilog
simple µP (32-bit)
P. Bakowski
[email protected]
Architecture du processeur
Ce modèle implémente un simple processeur 32-bit.
Dans la version initiale le processeur n’a pas de
registres. Il communique directement avec la
mémoire interne.
Dans la version finale il faut ajouter le registre de
travail (accumulateur) et les registres entrée-sortie
pour la communication avec la mémoire externe.
Le processeur doit communiquer avec notre soussystème mémoire externe via le bus de données, bus
d’adresses et les lignes de contrôle (WE,OE).
Le code Verilog du processeur est disponible ici.
P. Bakowski
2
Système complet
address bus
OE
WE
CS0
CS1
CS2
CS3
data bus
P. Bakowski
3
Architecture du processeur
Liste d’instructions
opcode name
NOP HLT BRA STR CPL ADD MUL SHF
... ... comments
no operation ..
halt ..
branch if flag of type CCODEis set, branch to BB store if IMMED, MEM[BB] <= AA else MEM[BB] <= MEM[AA] complement if IMMED, MEM[BB] <= ~AA else MEM[BB] <= ~MEM[AA] add MEM[BB]<=MEM[BB] + MEM[AA] multiply MEM[BB]<=MEM[BB] * MEM[AA] shift
if SHLEFT, shift MEM[BB] left by SHDIST, else shift right
P. Bakowski
4
Architecture du processeur
Formats d’instructions
P. Bakowski
5
Modèle Verilog du processeur
La description comporte un seul module
qui intègre le processeur et la mémoire.
Le module commence par la déclaration de la mémoire.
La taille proposée est 2**12 de 32-bit mots.
Le compteur du programme a 12 bits.
Le mot-clé 'define définie les champs d’instructions et
les opcodes.
Le bloc task setcondcode est un processus qui
compute les valeurs des drapeaux de condition (status
flags).
P. Bakowski
6
Modèle Verilog du processeur
Le processus always execute une instruction du programme
enregistré dans la mémoire : initialement une instruction est lue dans la MEM et le PC est
incrémenté; puis l’instruction est décodée par le mécanisme
de case.
La sélection:
if ('IMMED) MEM['BB]='AA;
else MEM['BB] = MEM['AA];
détermine deux modes d’adressage: immédiat et direct.
P. Bakowski
7
Modèle Verilog du processeur
module system;
parameter
step = 10, // execution time of one instruction
width = 32, // data bus width
addrsize = 12, // address bus width
memsize = 1<<addrsize, // memory size
sbits = 6; // number of status bits
reg[width-1:0] MEM[0:memsize-1], // memory declaration
IR; // instruction register declaration
reg[sbits-1:0] SR; // status register
reg[addrsize-1:0] PC; // program counter
'define OPCODE IR[31:28] // opcode
'define AA IR[23:12] // operand AA
'define BB IR[11:0] // operand BB
'define IM IR[27] // operand type 1: immediate 0: memory
'define CCODE IR[27:24] // branch condition
'define SHL IR[27] // shift direction 1: left 0: right
'define SHD IR[16:12] // shift distance
P. Bakowski
8
Modèle Verilog du processeur
//instruction codes
'define HLT 4'b0000
// halt
'define BRA 4'b0001
// branch
'define NOP 4'b0010
// no-op
'define STR 4'b0011
// store
'define SHF 4'b0100
// shift
'define CPL 4'b0101
// complement
'define ADD 4'b0110
// add
'define MUL 4'b0111
// multiply
//condition code and status bit position
'define ALWAYS
0
'define CARRY
1
'define EVEN
2
'define PARITY
3
'define ZERO
4
'define NEG
5
P. Bakowski
9
Modèle Verilog du processeur
//set flags
task setcondcode;
input [width:0] RES;
begin
SR['ALWAYS]
= 1;
SR['CARRY]
= RES[width];
SR['EVEN]
= ~RES[0];
SR['PARITY]
= ^RES;
SR['ZERO]
= ~(|RES);
SR['NEG]
= RES[width-1];
end;
end task;
//reset: start module
initial
PC = 0;
P. Bakowski
// start program
10
Modèle Verilog du processeur
always begin
// execution time of one instruction
#step
IR = MEM[PC];
//instruction fetch
PC = PC + 1;
//increment program counter
case('OPCODE)
'NOP:;
//nothing to do
'BRA: if (SR['CCODE])
//branch
PC = 'BB;
'STR: if ('IM)
MEM['BB] = 'AA;
//store
//immediate
else
MEM['BB] = MEM['AA];
//direct
'ADD: begin
MEM['BB] = MEM['AA] + MEM['BB];
setcondcode(MEM['BB]);
end
P. Bakowski
11
Modèle Verilog du processeur
'MUL: begin
MEM['BB] = MEM['AA] * MEM['BB]; setcondcode(MEM['BB]);
end
'CPL: begin
if ('IM)
//complement store
MEM['BB] = ~'AA;
//immediate
else
MEM['BB] = ~MEM['AA];
setcondcode(MEM['BB]);
end
'SHF: begin
if ('SHL)
//shift
MEM['BB] = MEM['BB] << 'SHD;
else
MEM['BB] = MEM['BB] >> 'SHD;
//left
setcondcode(MEM['BB]);
end
'HLT: $finish
// halt
default: $display("erreur: mauvaise valeur dans op-code");
endcase;
end
endmodule;
P. Bakowski
12
Phases d’intégration plus rapport
1. Simuler le modèle du processeur avec sa mémoire
interne.
2. Modifier le code du processeur par l’introduction d’un
registre de travail – accumulateur, et les tampons de
communication avec la mémoire externe.
3. Ajouter les bus et les signaux de contrôle.
4. Intégrer l’ensemble avec votre sous-système mémoire.
5. Simuler ensemble avec un court programme dans la
mémoire externe (quelques instructions dans une boucle).
6. Rédiger un court rapport (max.6 pages + listing)
concernant votre mini-projet (base d’évaluation).
P. Bakowski
13

Documents pareils