Transcript clk

計算機構成 第3回
データパス:計算をするところ
テキスト14‐19、29‐35
情報工学科
天野英晴
ALUで色々な演算ができる
• しかし、2つの入力データに限定される
X+Y
110
Y
S
A
B
X
Y
たくさんALUを使う方法
→大変だし一般性がない
X+Y-W+Z
111
Y
S
A
B
X+Y
110
WーZ
Y
111
S
Y
S
A
B
A
B
X
Y
W
Z
レジスタへのデータの書き込み
途中結果を蓄えるためにレジスタを導入
レジスタ=D.F.Fの集合
clk
レジスタ
clk
新しいデータ 新しいデータ 新しいデータ
入力データ
書き込み
Q
Q
Q
Q
D
D
D
D
…
Q
Q
D
D
書き込み
書き込み
clkの立ち上がり(立下り)に同期して書き込む
→CPUの状態はclkに同期して変化する
レジスタの利用
Y
S
A
clk
B
ACC
ACC:アキュムレータ
結果を蓄えるレジスタ
S
B
ACCの内容
001
X
X
110
Y
X+Y
111
W X+Y-W
110
Z
X+Y-W+Z
メモリの構成
ACCを使った構造も万能ではない→ (SL X)+(SL Y)はうまく行かない
メモリに、入力データ、中間結果を溜めておくためのメモリ
DO
Address
幅
n
メモリは幅wbit, 深さ2
この例はw=16, n=8
8
深さ2 =256
(本当はもっとずっと多数のデータを
格納する)
0
1
2
8bitならば
…
255
clk
DI
メモリのモデル
we
メモリからの読み出し
1100101010100001
DO
Address
0
1
2
幅
1100101010100001
1
…
256
clk
DI
メモリのモデル
we
Address=1ならば1のところに格納
された11001010がDOから読み出される
メモリへの書き込み
DO
Address
0
1
2
幅
1100101010100001
2
…
タイミングはレジスタと同じ
256
clk
DI
we=1
1100101010100001
メモリのモデル
we=1の時、Address=2 ならば2番地に
clkが0→1の変化時にDIからの値が
書き込まれる
メモリ付きのデータパスでの計算
(p.18 例題2-3)
com
001
THB
0番地にX、1番地にYが入っている
X+Yを計算して2番地に格納せよ
Y
A
clk
we com
0 001
0 110
1 000
S
B
ACC
0
Address
…
clk
we
Address
00000000
00000001
00000010
メモリ付きのデータパス
com
110
ADD
0番地にX、1番地にYが入っている
X+Yを計算して2番地に格納せよ
Y
+
S
A
clk
we com
0 001
0 110
1 000
B
ACC
1
Address
…
clk
we
Address
00000000
00000001
00000010
メモリ付きのデータパス
com
000
THA
0番地にX、1番地にYが入っている
X+Yを計算して2番地に格納せよ
Y
+
S
A
clk
B
we com
0 001
0 110
1 000
ACC
2
Address
…
clk
we=1
Address
00000000
00000001
00000010
メモリ付きのデータパス
(p.18 例題2-4)
0番地にX、1番地にYが入っている
(SL X)+(SL Y)を計算して2番地に
格納せよ
Y
com
S
A
clk
B
we com Address
0 001 00000000
0 100 00000000
1 000 00000010
0 001 00000001
0 100 00000000
0
110 00000010
1
000 00000010
ACC
Address
…
clk
we
命令の形にする
0番地にX、1番地にYが入っている
X+Yを計算して2番地に格納せよ
we com
0 001
0 110
1 000
Address
00000000
00000001
00000010
操作を表す部分:op-code
オプコード
操作対象を表す部分:operand
オペランド
分かりやすい記号で書く:ニーモニックと呼ぶ
0000
0001
0010
0011
0100
0101
0110
0111
1000
NOP
LD ( Load)メモリからACCにデータを読み込む
AND
OR
SL この時はオペランドは何でも良い
SR この時はオペランドは何でも良い
ADD
SUB
ST (Store)メモリへACCからデータを書き込む
プログラムの形にする
0番地にX、1番地にYが入っている
X+Yを計算して2番地に格納せよ
we com
0 001
0 110
1 000
Address
00000000
00000001
00000010
LD 0
ADD 1
ST 2
0番地にX、1番地にYが入っている
(SL X)+(SL Y)を計算して2番地に
格納せよ
機械語
アセンブラ表記
we com Address
0 001 00000000
0 100 00000000
1 000 00000010
0 001 00000001
0 100 00000000
0
110 00000010
1
000 00000010
LD 0
SL
ST 2
LD 1
SL
ADD 2
ST 2
レジスタのVerilog記述
宣言
reg [15:0] accum;
読み出し
assign accout = accum;
クロックの立ち上げ同期
して書き込み
always @(posedge clk or negedge rst_n)
begin
rst_nが0になると初期化
if(!rst_n) accum <= 16’b0;
(非同期リセット)
else accum <= alu_y;
end
always文
initial文は最初の一回のみ実行され、通常テストベンチにのみ用いる
always文は@以下の条件が成り立つときに常に実行される
posedge 立ち上がり negedge 立ち上がり
or, and はここだけで使う特殊な条件指定論理
決まった形式以外は使わない!
always @(posedge clk or negedge rst_n)
レジスタに対する値の書
begin
き込みは<=を使って
if(!rst_n) accum <= 16’b0; always文の中で行う
always文中ではif文や
else accum <= alu_y;
case文が使える
なぜか?
end
レジスタに対する代入だから
→プログラム言語の変数と同
じで代入されない場合の値が
メモリの記述
幅16ビット、深さ256の
メモリ宣言
reg [15:0] dmem [0:255];
assign do = dmem[daddr];
アドレスdaddrからの
データ読み出し
always @(posedge clk)
if(we) dmem[daddr] <= ddataout;
we=1の時のクロッ
ク立ち上がりでデー
タの書き込み
2番地の上位8ビットは?
dmem[2][15:8]
メモリは通常、合成の対象としない→テストベンチで記述
データパスのVerilog記述
Y
com
S
A
clk
B
この部分を
datapath
で記述
ACC
Address
メモリはテストベンチに
記述
…
clk
we
データパスのVerilog記述
module datapath(
input clk, input rst_n, input[15:0] datain,
input [2:0] com, output[15:0] accout);
reg [15:0] accum;
wire [15:0] alu_y;
assign accout = accum;
wire [15:0] alu_y;
ALUを実体化
assign accout = accum;
alu alu_1( .a(accum), .b(datain), .s(com), .y(alu_y));
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) accum <= 16’b0;
else accum <= alu_y;
end
アキュムレータへのかきこみ
テストベンチのVerilog記述1
`timescale 1ns/1ps
module test;
parameter STEP =10;
…
reg[15:0] dmem[0:255];
always @(posedge clk)
begin
if(we) dmem[addr] <= accout;
end
メモリの宣言
clkの生成
always #(STEP/2) begin
データパスの実体化
clk <= ~clk;
end
datapath datapath_1(.clk(clk), .rst_n(rst_n), .com(com),
.datain(dmem[addr], .accout(accout));
….
テストベンチのVerilog記述2
initial begin
…
$readmemh(“dmem.dat”,dmem);
ファイルdmem.datからメモリdmemにデータを設定する
$readmemb → 2進数でファイル中にデータを書く
$readmemh→16進数でファイル中にデータを書く
{we,com,addr}<=
{`DISABLE,`ALU_THB,`ADDR_W’h00};
…
連結、バス化
{X,Y,Z} まとめてバスとして扱える
右辺にも左辺にも使える
演習課題
• 35ページ演習2-9
– Aを0番地、Bを1番地のデータとして(SR A) OR
(SR B)のデータを2番地にしまう命令の実行をシ
ミュレーションせよ
• 35ページ演習2-10
– A,Bを上記と同じとし、(A+B) OR (A-B)の結果を
2番地にしまう命令の実行をシミュレーションせよ
• 1から6まで数えて、stop入力で停止するサイ
コロdiceを設計せよ