Posts Issued on August 18, 2026

BSVによるUARTの再設計

posted by sakurai on August 18, 2026 #1106

Uart.bsvを若干修正しました。理由は、過去記事では呼び出しにdone=fsm.doneを返すようにしていたものを、ダミー関数drainの実行待ちでwaitさせるものです。

UartDrain.bsv

// UartDrain.bsv : drain版UART
// Uart.bsv (done版) との差分は done() → drain() のみ
package UartDrain;

import StmtFSM::*;

interface Uart_ifc;
      method Bit#(1) read();
      method Action load(Bit#(8) newdata);
      method Action drain();
endinterface

(* synthesize *)
module mkUartDrain(Uart_ifc);
      Reg#(Bit#(8)) data  <- mkReg(8'haa);
      Reg#(Bit#(1)) odata <- mkReg(1);

      Stmt s = seq
            odata <= 1'h0; // start bit
            repeat (8) action
                  odata <= data[0];
                  data <= (data >> 1);
            endaction
            odata <= 1'h1; // stop bit
      endseq;

      FSM fsm <- mkFSM(s);

      method Bit#(1) read();
            return odata;
      endmethod

      method Action load(Bit#(8) newdata) if (fsm.done);
            data <= newdata;
            fsm.start;
      endmethod

      // ダミー関数: 完了を暗黙条件とする空アクション
      // RDY_drain = fsm.done、EN_drain は内部で未使用
      method Action drain() if (fsm.done);
            noAction;
      endmethod
endmodule

endpackage

UARTモジュールの合成後の回路は同等であり、前者が

  // value method done
  assign done =
	     fsm_abort_whas_AND_fsm_abort_wget_OR_fsm_state_ETC___d71 &&
	     !fsm_start_reg ;

となり、呼び出し側に明示的にdoneを見せるのに対して、後者は、

  // action method drain
  assign RDY_drain =
	     fsm_abort_whas_AND_fsm_abort_wget_OR_fsm_state_ETC___d71 &&
	     !fsm_start_reg ;

となり、呼び出し側をBSVの自動バックプレッシャのRDYで待たせるため、全く同じ回路となります。


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