|
|
ハードウェアカウンタの利用方法
|
|
|
============
|
|
|
|
|
|
最終課題である CoreMark の結果確認をおこなうためには CPU の実行サイクル数を測定するためのハードウェアカウンタの実装が必要です。ここではサンプルモジュールと簡単な説明を用意したので、適宜参考にしてみてください。
|
|
|
|
|
|
サンプルモジュールのコードは下のリンクからダウンロードできます。
|
|
|
|
|
|
[hardware_counter.v](uploads/4c97e7fd9c489043c8ab13e8374375ba/hardware_counter.v)
|
|
|
|
|
|
## hardware_counter.v
|
|
|
|
|
|
サンプルモジュールへクロック信号を入力すると、クロック毎にインクリメントされた実行サイクル数を出力します。
|
|
|
|
|
|
```verilog
|
|
|
module hardware_counter(
|
|
|
input CLK_IP,
|
|
|
input RSTN_IP,
|
|
|
output [31:0] COUNTER_OP
|
|
|
);
|
|
|
|
|
|
reg [31:0] cycles;
|
|
|
|
|
|
always @(posedge CLK_IP or negedge RSTN_IP) begin
|
|
|
if(!RSTN_IP)begin
|
|
|
cycles <= 32'd0;
|
|
|
end else begin
|
|
|
cycles <= cycles + 1;
|
|
|
end
|
|
|
end
|
|
|
|
|
|
assign COUNTER_OP = cycles;
|
|
|
|
|
|
endmodule
|
|
|
```
|
|
|
|
|
|
## CPU への実装方法
|
|
|
|
|
|
たとえば、トップモジュール中で他のモジュールと同様にして
|
|
|
|
|
|
```verilog
|
|
|
/* */
|
|
|
/* HardwareCounter */
|
|
|
/* */
|
|
|
wire [31:0] hc_OUT_data;
|
|
|
|
|
|
hardware_counter hardware_counter0(
|
|
|
.CLK_IP(clk),
|
|
|
.RSTN_IP(rst_n),
|
|
|
.COUNTER_OP(hc_OUT_data)
|
|
|
);
|
|
|
```
|
|
|
|
|
|
というように呼びだします。
|
|
|
|
|
|
あらかじめ用意された CoreMark プログラムをそのまま利用するためには、
|
|
|
ハードウェアカウンタ用アドレス(32'hffffff00)を指定して LW 命令をおこなった際に、ハードウェアカウンタの値を読みだすように実装しておく必要があります。
|
|
|
|
|
|
```verilog
|
|
|
// Memory Accessステージに下記のような記述を追加
|
|
|
assign ma_load_value = ((ma_alucode == `ALU_LW) && (ma_ldst_addr == `HARDWARE_COUNTER_ADDR)) ? hc_OUT_data :
|
|
|
``` |
|
|
\ No newline at end of file |