トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Diary/2010-8-1

気づいたら

8月...

Bluespec

Bluespecのラインセンスをもらった(?)のでライセンス設定の確認がてら遊んでみた.
Bluepsecデザインコンテストのときは,
シミュレーションばっかりでFPGA上での動作を確認しなかったので,
まずはカウンタを作ってFPGA上で動作させてみるところから.
Bluespec的には次のようなソースを書く.

interface Test_ifc;
   method Bit#(26) result();
endinterface

module mkTest(Test_ifc);
   Reg#(Bit#(26)) counter <- mkReg(0);

   rule r0;
      counter <= counter + 1;
   endrule

   method Bit#(26) result();
      return readReg(counter);
   endmethod

endmodule

で,

bsc -verilog -g mkTest test.bsv

としてVerilogコードを生成すると,

module mkTest(CLK,
              RST_N,

              result,
              RDY_result);
  input  CLK;
  input  RST_N;

  // value method result
  output [25 : 0] result;
  output RDY_result;
/* snip */
  always@(posedge CLK)
  begin
    if (!RST_N)
      begin
        counter <= `BSV_ASSIGNMENT_DELAY 26'd0;
      end
    else
      begin
        if (counter$EN) counter <= `BSV_ASSIGNMENT_DELAY counter$D_IN;
      end
  end
/* snip */
endmodule  // mkTest

という何とも素直なコードが.
手書きのコードと最終的な回路規模を比較するまでもありません.
トップモジュールを,

`default_nettype none
module top(USER_CLOCK, CPU_RESET, GPIO_LED);
    input  wire USER_CLOCK;
    input  wire CPU_RESET;
    output wire [7 : 0] GPIO_LED;

    wire rst_x;
    wire [25:0] result;

    assign rst_x = ~CPU_RESET;
    assign GPIO_LED = result[25:18];

    mkTest U0(.CLK(USER_CLOCK), .RST_N(rst_x), .result(result), .RDY_result());

endmodule

と書いて合成,配置配線でbitファイルができるので書き込めばよい.