Posts Issued on September 9, 2022

posted by sakurai on September 9, 2022 #506

ブロック図

旧版(verilog版)のブロック構成と、BSVで再設計したブロック構成を示します。再設計の際にグルーロジックを取り込んだため、4個のモジュールが1個になりhandshake階層をなくすことができました。

図415.4
図415.4 旧版(verilog版)OneStageブロック図

図%%.1
図506.1 新版(BSV版)OneStageブロック図

左矢前のブログ 次のブログ右矢

posted by sakurai on September 9, 2022 #505

OneStageソース

前稿で述べたルールの前後にインタフェース、レジスタ宣言、メソッド宣言を加えてソースが完成しました。

// OneStageのインタフェース定義
interface Fifo_ifc;
(* prefix="" *) 
   // GameFSMからの書き込み有効信号
   method Action if_write_enable((* port="wr_en" *)Bool wen);
(* prefix="rd" *)
   // 各SoundFSMからの読み取り有効信号 (0~3)
   method Action if_read_enable0(Bool en0);
(* prefix="rd" *)
   method Action if_read_enable1(Bool en1);
(* prefix="rd" *)
   method Action if_read_enable2(Bool en2);
(* prefix="rd" *)
   method Action if_read_enable3(Bool en3);
(* result="empty" *)
   // キューが空かどうかを返すメソッド
   method Bool if_empty();
endinterface

// OneStageの実装
(* synthesize, always_ready, always_enabled *)
module mkOneStage(Fifo_ifc);

     // 入力信号のレジスタ
   Reg#(Bool) in_wen <- mkReg(False);  // 書き込み有効
   Reg#(Bool) in_ren0 <- mkReg(False); // 読み取り有効 (SoundFSM0)
   Reg#(Bool) in_ren1 <- mkReg(False); // 読み取り有効 (SoundFSM1)
   Reg#(Bool) in_ren2 <- mkReg(False); // 読み取り有効 (SoundFSM2)
   Reg#(Bool) in_ren3 <- mkReg(False); // 読み取り有効 (SoundFSM3)
   // キューが空かどうかの状態
   Reg#(Bool) in_empty <- mkReg(True);

   // キューへの書き込みルール
   rule rule_write (in_wen && in_empty);
         in_empty <= False;  // キューを!emptyにする
   endrule

   // キューからの読み取りルール
   rule rule_read ((in_ren0 || in_ren1 || in_ren2 || in_ren3) && !in_empty);
         in_empty <= True;  // キューをemptyにする
   endrule

   // 各メソッドの実装
   method Action if_write_enable(Bool wen);
      in_wen <= wen;
   endmethod
   method Action if_read_enable0(Bool en0);
      in_ren0 <= en0;
   endmethod
   method Action if_read_enable1(Bool en1);
      in_ren1 <= en1;
   endmethod
   method Action if_read_enable2(Bool en2);
      in_ren2 <= en2;
   endmethod
   method Action if_read_enable3(Bool en3);
      in_ren3 <= en3;
   endmethod
   method Bool if_empty();
      return in_empty;  // キューが空かどうかを返す
   endmethod

endmodule: mkOneStage

左矢前のブログ 次のブログ右矢