計算機アーキテクチャ演習第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
© Copyright 2024 ExpyDoc