Vengineerの妄想

人生を妄想しています。

Bluespec SystemVerilog : HELLO WORLDを学ぶ(その2)

Verification Engineerの戯言


モジュールでは、内部の動作を記述します。Bluespecでは、SystemVerilogのようにモジュールがポートを持ちません。
その代わりにインターフェース・メソッドというものを定義し、
その定義したインターフェースをモジュールに対応つけます。

    package FirstAttempt;

      // My first design in the cool Bluespec language

      String s = "Hello world";

      module mkAttempt(Empty);

        rule say_hello;
          $display(s);
        endrule

      endmodule

    endpackage

括弧の中にあるのがインターフェースになります。
この例では、Emptyという名前のインターフェースをmkAttemptモジュールに対応付けています。
Emptyインタフェースは、Bluespecで定義済みのインターフェースです。
((その1)の最後のコードで追加したものです)

Bluespecでは、モジュールの動作を ルール(rule/endrule)を使って記述します。
ルールは0個以上記述することができます。各ルールはサイクル毎に起動されます。
(一般的には、Bluespecでは、サイクルはクロック単位と考えていいと思います)
(SystemVerilogで記述すれば、
always @(posedge CLK)あるいはalways @(negedge CLK)だと思えば良いでしょう)

この例では、say_helloというルールを定義し、サイクル毎に$display(s)を実行します。
つまり、Hello World をサイクル毎に表示することになります。
($displayは、SystemVerilogのシステムタスク$displayと同じです)

ここまでの記述をVerilog HDL RTLに変換するには、次のコマンドを実行します。
bscコマンドでオプションに -verilog を指定します。

    % bsc -verilog FirstAttempt.bsv

Verilog HDLファイルが生成されてません。どうしてでしょうか?
実は、下記のコードのようにmoduleの前に (* synthesize *) を書かないと
Verilog HDLコードには変換されません。
このキーワードがあるモジュールのみ、Verilog HDLに変換されます。

    package FirstAttempt;

      // My first design in the cool Bluespec language

      String s = "Hello world";

      (* synthesize *)
      module mkAttempt(Empty);

        rule say_hello;
          $display(s);
        endrule

      endmodule

    endpackage

    % bsc -verilog FirstAttempt.bsv
    Verilog file created: mkAttempt.v

mkAttempt.vというVerilog HDLファイルが生成されます。
このファイルの中を見てみると、次のようになっています。

    `ifdef BSV_ASSIGNMENT_DELAY
    `else
    `define BSV_ASSIGNMENT_DELAY
    `endif

    module mkAttempt(CLK,
	             RST_N);
      input  CLK;
      input  RST_N;

      // handling of system tasks

      // synopsys translate_off
      always@(negedge CLK)
      begin
        #0;
        $display("Hello world");
      end
      // synopsys translate_on
    endmodule  // mkAttempt

rule記述の部分がalways文になって、クロック(なぜか立ち下がり)毎に"Hello World""を表示します。

検証、Verification、Bluespec SystemVerilog