Document

計算機アーキテクチャ演習第6回
PICOのVerilog記述
慶応大学 天野
2007/10/25
1
PICOの構成(前期の図を若干変更)
aluout
regc
outc
MUX
MUX
pc
op
com
ir
op2
op
110
ALU
001
alubin
Expander
MUX
‘2’
op2
dest
idata
src
regb
aluain
MUX
rega
adrA
adrB
regfile
ddataout
2007/10/25
we_
MUX
iadr
Instruction
Memory
ddatain
dadr
Data
Memory
2
レジスタファイル
module regfile (clk, adrA, adrB, inc, outa, outb, rwe);
`include "pico.h"
input clk;
input [RegNum-1:0] adrA, adrB;
input [DataBus-1:0] inc;
output [DataBus-1:0] outa, outb;
input rwe;
reg [DataBus-1:0] rfile [0:7];
assign outa = rfile[adrA];
assign outb = rfile[adrB];
always @(posedge clk)
if (rwe) rfile[adrA] <= inc;
endmodule
2007/10/25
初期化は特に必要ない。
rwe=Hの時、同期的に書き込み
読み書きは同時に可能
3
状態遷移
結果を書き込む命令
それ以外:分岐、STなど
IF
irに命令を
フェッチ
2007/10/25
RF
レジスタ
読み出し
PC←PC+2
EX
WB
演算実行
結果の格納
飛び先セット
メモリからの読み
書き込み
4
状態遷移、レジスタの記述
always@(posedge clk)
if(reset_== Enable_) begin
pc <= 16'h0000;
ir <= 16'h0000;
stat <= IF; end
else
case (stat)
IF: begin
ir <= idata;
stat <= RF; end
RF: begin
pc <= aluout;
rega <= outa;
regb <= outb;
stat <= EX; end
EX: begin
if(pcset) pc <= aluout;
if(wbinst) begin
regc <= outc;
stat <= WB; end
else stat <= IF; end
WB: stat <= IF;
endcase
2007/10/25
リセット時
レジスタの値設定を、statの変化と
共に記述している
wbinst: 結果を書き込む命令
pcset: 分岐成立
5
One-Hot Counter
parameter IF = 4'b0001;
parameter RF = 4'b0010;
parameter EX = 4'b0100;
parameter WB = 4'b1000;
parameter RF_BIT = 2'b01;
parameter EX_BIT = 2'b10;
parameter WB_BIT = 2'b11;
stat[EX_BIT]は、状態がEXの時だけ1になる。他もこ
れと同じ→One Hot Counterの特性の利用
2007/10/25
6
入出力、レジスタ
module bpico16 (clk, reset_, iaddr, idata, daddr, ddatain, ddataout, dwe);
`include "pico.h"
input clk, reset_;
output [AddrBus-1:0] iaddr;
input [DataBus-1:0] idata;
output [AddrBus-1:0] daddr;
input [DataBus-1:0] ddatain;
output [DataBus-1:0] ddataout;
output dwe;
// Registers
reg [AddrBus-1:0] pc;
reg [DataBus-1:0] ir;
reg [DataBus-1:0] rega, regb, regc;
reg [StateNum-1:0] stat;
2007/10/25
7
信号線、命令フィールド定義
wire pcset;
wire rwe;
wire [DataBus-1:0] aluout, result, outa, outb, outc ;
wire [DataBus-1:0] aluina, aluinb;
wire [ComNum-1:0] com;
//Field
wire [Opcode-1:0] op, op2;
wire [RegNum-1:0] dest,src;
// Instructions
wire wbinst;
wire brinst;
wire imm16;
assign op = ir[15:11];
assign dest = ir[10:8];
assign src = ir[7:5];
assign op2 = ir[4:0];
2007/10/25
8
命令デコード
assign wbinst = ((op == ROP) & ( (op2[4:3] == 2'b00) | op2 == LD) ) |
(op == LDLI ) | (op == LDHI) |
(op[4:3] == 2'b00)&(op != ROP) ;
assign brinst = (op == BNEZ) | (op == BEQZ);
assign pcset = ( (rega == 16'h0000)&(op == BEQZ)|
(rega != 16'h0000)& (op == BNEZ) );
2007/10/25
9
メモリ周辺
assign iaddr = pc;
assign ddataout = regb;
assign dwe = (stat[EX_BIT] & (op== ROP) & (op2== ST)) ;
assign daddr = ((op==ROP) & (op2 == ST))? rega : regb ;
idata
ddatain
regb
ddataout
2007/10/25
regb
we_
MUX
iadr
Instruction
Memory
rega
dadr
Data
Memory
10
ALU周辺
assign aluina = (stat[RF_BIT] | brinst) ? pc : rega;
assign imm16 = ((op[4:3] == 2'b00 & op != ROP) |
brinst | op == LDLI | op == LDHI) ;
aluout
assign aluinb = stat[RF_BIT] ? 16'h0002 :
imm16 ? { {8{ir[7]}}, ir[7:0] } :
op == LDHI ?
{ir[7:0],8'h00} :
regb;
ADDOP :
THB :
op[2:0] :
op2[2:0];
outc
MUX
MUX
assign com = stat[RF_BIT] | brinst ?
(op == LDLI | op == LDHI) ?
imm16 ?
regc
com
ALU
alubin
‘2’
aluain
MUX
MUX
Expander
regb
rega
pc
assign outc = ( op == ROP & op2 == LD) ? ddatain:
aluout ;
assign aluout = alu(aluina, aluinb, com);
2007/10/25
11
レジスタファイル周辺
assign rwe = stat[WB_BIT] & wbinst;
regfile reg0(.clk(clk), .adrA(dest), .adrB(src),
.inc(regc), .outa(outa), .outb(outb), .rwe(rwe));
regb
adrA
rega
adrB
regc
2007/10/25
12
演習
1.LDHI rd,#X rd <-X,0x00 11101 ddd xxxxxxxx Load High Immediate
LDHI命令を付け加えよ。
2.JMP X PC<-PC+0x100 01111 00100000000 Jump
JMP命令を付け加えよ。
2007/10/25
13