manta/test/functional_sim/uart_tx_tb.sv

100 lines
1.9 KiB
Systemverilog

`default_nettype none
`define CP 10
`define HCP 5
task automatic transmit_byte (
input [7:0] data,
input integer CLOCKS_PER_BAUD
);
// send a byte from uart_tx, and check that it transmits properly
integer data_bit = 0;
for(int i=0; i < (10*CLOCKS_PER_BAUD)-1; i++) begin
// check that data bit is correct on every baud period
data_bit = i / CLOCKS_PER_BAUD;
if (data_bit == 0) begin
assert(uart_tx_tb.utx_tb_tx == 0) else $fatal(0, "wrong start bit!");
end
else if ((data_bit > 0) && (data_bit < 9)) begin
assert(uart_tx_tb.utx_tb_tx == data[data_bit-1]) else $fatal(0, "wrong data bit!");
end
else begin
assert(uart_tx_tb.utx_tb_tx == 1) else $fatal(0, "wrong stop bit!");
end
// check that done is not asserted during transmisison
assert(!uart_tx_tb.utx_tb_done) else $fatal(0, "wrong done!");
#`CP;
end
// assert that done is asserted at end of transmission
assert(uart_tx_tb.utx_tb_done) else $fatal(0, "wrong done!");
endtask
module uart_tx_tb();
logic clk;
integer test_num;
logic [7:0] tb_utx_data;
logic tb_utx_start;
logic utx_tb_done;
logic utx_tb_tx;
uart_tx #(.CLOCKS_PER_BAUD(10)) utx (
.clk(clk),
.data_i(tb_utx_data),
.start_i(tb_utx_start),
.done_o(utx_tb_done),
.tx(utx_tb_tx));
always begin
#`HCP
clk = !clk;
end
initial begin
$dumpfile("uart_tx_tb.vcd");
$dumpvars(0, uart_tx_tb);
clk = 0;
test_num = 0;
tb_utx_data = 0;
tb_utx_start = 0;
#`HCP;
// test all possible bytes
test_num = test_num + 1;
for(int i=0; i < 256; i++) begin
tb_utx_start = 1;
tb_utx_data = i;
#`CP;
tb_utx_start = 0;
tb_utx_data = 0;
transmit_byte(i, 10);
#(100*`CP);
end
// test all possible bytes (no delay between them)
test_num = test_num + 1;
for(int i=0; i < 256; i++) begin
tb_utx_start = 1;
tb_utx_data = i;
#`CP;
tb_utx_data = 0;
transmit_byte(i, 10);
end
$finish();
end
endmodule
`default_nettype wire