VLSI設計論第4回 アキュムレータマシンと 仮遅延シミュレーション 慶應義塾大学 理工学部 情報工学科 天野
アキュムレータマシン 合成部分 ir ALU accum ‘1’ pc + Instruction Memory Data Memory op.code ALU ‘1’ accum pc operand + idata aout ddata we_ Instruction Memory Data Memory iadr dadr
状態遷移 Instruction Execution Fetch pc←pc+1 ir ← idata rst_ 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 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 clk <= `Low; rst_ <= `Enable_; #(STEP/4) #(STEP) rst_ <= `Disable_; #(STEP*100) $finish; always @( negedge clk ) begin $display( "stat = %b pc = %x ir = %x, accum = %x", ac0.stat, iadr, ac0.ir, acout); $readmemb("imem.dat", imem); $readmemb("dmem.dat", dmem); $shm_open(); $shm_probe("AC");
design_visionによる最適化 accmu.vとalu.vをReadする
クロックと面積の指定 create_clock –period 100 clock set_max_area 0 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でクリティカルパス全体を表示してくれる クリティカルパスの表示 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
仮遅延シミュレーション 遅延があるのがわかる
演習 アキュムレータにイミィデエイト命令を付け、テストし、合成、速度重視の最適化を行え。 シミュレーションして結果を確認、合成してゲート数を確認の上、天野(hunga@am.ics.keio.ac.jp)までソースとクリティカルパス長をメールのこと