Verilog

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])までソース
とクリティカルパス長をメールのこと