12 |
BSVによるメモリダンプモジュールの設計 (3) |
前稿の疑似コードをBSVに変換します。作成したBSVプログラムを以下に示します。
Tb.bsv
import StmtFSM::*; import mkUart::*; import RegFile::*; typedef Bit#(16) Addr_t; typedef Bit#(4) Data_t; typedef Bit#(8) Byte; (* synthesize *) module mkTb(); RegFile#(Addr_t, Data_t) rom <- mkRegFileLoad("data.hex", 0, 65535); Reg#(Addr_t) address <- mkReg(0); Reg#(Data_t) data <- mkReg(0); Reg#(Byte) byteData <- mkReg(0); Reg#(int) x <- mkReg(0); Reg#(int) y <- mkReg(0); Reg#(Data_t) checksum <- mkReg(0); Uart_ifc uart <- mkUart(); function Stmt nibbleOut(Data_t nibble); return (seq byteData <= extend(nibble) + (nibble >= 10) ? (- 10 + 8'h61) : 8'h30; uart.load(byteData); // $write("%c", byteData); endseq); endfunction: nibbleOut Stmt test = seq for (y <= 0; y <= 255; y <= y + 1) seq checksum <= 0; for (x <= 0; x <= 255; x <= x + 1) seq data <= rom.sub(address); address <= address + 1; checksum <= checksum + extend(data); nibbleOut(data); endseq nibbleOut(truncate(checksum >> 4)); nibbleOut(truncate(checksum)); uart.load(8'h0a); // LF // $display(""); endseq await (uart.done()); $finish; endseq; mkAutoFSM(test); endmodule