VLSI設計論第4回 アキュムレータマシンと 仮遅延シミュレーション 慶應義塾大学 理工学部 情報工学科 天野 アキュムレータマシン 合成部分 ir op.code ALU ‘1’ accum pc operand + idata iadr Instruction Memory aout we_ dadr ddata Data Memory 状態遷移 rst_ Instruction Fetch pc←pc+1 ir ← idata Execution BEQ: if (accum == 0) pc← ir[3:0] BNQ: if (accum != 0) pc← ir[3:0] ST: we_ = L else: accum ← ALU出力 アキュムレータの記述(1) `include "my1.h" `define STNUM 2 `define IF `STNUM'b01 `define EX `STNUM'b10 `define EX_BIT 1'b1 module accum(clock, rst_, ddata, idata, iadr, dadr, acout, we_); input clock, rst_; input [`DataBus] ddata; input [`InstBus] idata; output [`DataBus] iadr; output [`DataBus] dadr; output [`DataBus] acout; output we_; reg [`DataBus] accum; // Accumulator reg [`DataBus] pc; // Program Counter reg [`InstBus] ir; // Instruction Register reg [`STNUM-1:0] stat; // State register wire [`DataBus] alu_y; assign acout = accum; assign iadr = pc; assign dadr = ir[3:0]; assign we_ = ~(stat[`EX_BIT] & ir[7:4] == `ST) ; alu alu0(.ina(accum), .inb(ddata), .com(ir[6:4]), .y(alu_y)); アキュムレータの記述(2) always@(posedge clock) begin if(rst_ == `Enable_) begin stat <= `IF; pc <= 4'b0000; end else この記述は命令により様々 case (stat) //Case文 `IF: begin なレジスタを ir <= idata; 制御している pc <= pc+1; stat <= `EX; end リソースシュアリングが `EX: begin 可能だが、やりすぎると case (ir[7:4]) //Case文入れ子 `BEQ: if (accum == 4'b0000) pc <= ir[3:0]; バグの元なので注意! `BNE: if (accum != 4'b0000) pc <= ir[3:0]; default: if(ir[7]==1'b0) accum <= alu_y; endcase stat <= `IF; end endcase end endmodule テストベンチ(1) `include "my1.h" `timescale 1ns/1ps module datapat_test; parameter STEP = 10; reg rst_, clk; reg [`DataBus] dmem[`MemSize]; reg [`InstBus] imem[`MemSize]; wire [`DataBus] acout, ddata; wire [`InstBus] idata ; wire [`AdrBus] iadr, dadr; wire we_; accum ac0( .clock( clk ), .rst_( rst_ ), .ddata( ddata ), .idata( idata ), .iadr( iadr ), .dadr( dadr ), .acout (acout), .we_ (we_) ); テストベンチ(2) always #( STEP / 2 ) begin clk <= ~clk; end assign idata = imem[iadr]; always @(posedge clk ) if (!we_) dmem[dadr] <= acout; assign ddata = dmem[dadr]; initial begin #0 #(STEP/4) #(STEP) end clk <= `Low; rst_ <= `Enable_; rst_ <= `Disable_; #(STEP*100) $finish; always @( negedge clk ) begin $display( "stat = %b pc = %x ir = %x, accum = %x", ac0.stat, iadr, ac0.ir, acout); end initial begin $readmemb("imem.dat", imem); $readmemb("dmem.dat", dmem); $shm_open(); $shm_probe("AC"); end design_visionによる最適化 accmu.vとalu.vをReadする クロックと面積の指定 create_clock –period 100 clock 100nsecに設定(非常にゆっくり) set_max_area 0 面積は最小を指定 Design → Compile Designで合成 Design → Report Cellsで使用セル数 Timing → Report Timing Pathで遅延を見る 面積重視の合成 速度重視の設定 create_clock –period 2 clock 2nsecに設定(非常に高速) フリップフロップ間の遅延とセットアップ時 間がクロック周期より小さくなるようにがん ばってくれる Design → Compile Designで合成 Design → Report Cellsで使用セル数 Timing → Report Timing Pathで遅延を見る 速度重視の合成 回路の解析 クリティカルパス上の信号名をク リックすると表示してくれる クリティカルパスの表示 Highlight -> Critical Pathでクリティカルパス全 体を表示してくれる 合成後Verilogファイルの保存 File→Save As→Formatでverilogを指定 名前を付けて保存する(ソースファイルと重なって は駄目:ここではaccum_s.v) accum_s.vを表示してみよう AND, ORなどのゲートの形になっていることがわ かる 合成後のシミュレーション(仮遅延シミュレーショ ン) verilog accum_test.v accum.v -v /usr/local/vdec/lib/rohm/cadence/rohm06.v 仮遅延シミュレーション 遅延があるの がわかる 演習 アキュムレータにイミィデエイト命令を付 け、テストし、合成、速度重視の最適化 を行え。 シミュレーションして結果を確認、合成し てゲート数を確認の上、天野 ([email protected])までソース とクリティカルパス長をメールのこと
© Copyright 2024 ExpyDoc