|
23 |
BSVによるUARTの再設計 (6) |
Tb.bsvを示します。
import StmtFSM::*;
import Uart::*;
import Connectable::*;
typedef Bit#(8) Byte;
(* synthesize *)
module mkTb();
// UARTインターフェースのインスタンスを生成
Uart_ifc uart <- mkUart;
// テストバイトレジスタの定義
Reg#(Byte) tbrReg <- mkRegU;
// UARTの送信と受信を接続
mkConnection(uart.sout, uart.sin);
// データを取得する関数
function Action getData;
return
action
// UARTからデータを読み取り、tbrRegに格納
let data <- uart.read;
tbrReg <= data;
endaction;
endfunction
// データを送信する関数
function Stmt putData(Byte c);
return (seq
// UARTにデータを書き込む
uart.write(c);
endseq);
endfunction
// 応答を確認する関数
function Stmt checkResp(Byte correctData);
return (seq
// データを取得
getData;
// 正しいデータと比較
if (correctData != tbrReg) seq
// データが異なる場合、表示して終了
$display("%d->%d", correctData, tbrReg);
$finish;
endseq
endseq);
endfunction
// テストシーケンスの定義
Stmt test = seq
putData(8'haa); // データ1を送信
checkResp(8'haa); // 応答を確認
putData(8'h55); // データ2を送信
checkResp(8'h55); // 応答を確認
putData(8'hc3); // データ3を送信
checkResp(8'hc3); // 応答を確認
putData(8'h3c); // データ4を送信
checkResp(8'h3c); // 応答を確認
$display("test OK"); // テスト成功を表示
await(uart.pdone);
$finish; // テスト終了
endseq;
mkAutoFSM(test); // テストシーケンスを自動化
endmodule
Leave a Comment