185 lines
5.1 KiB
Systemverilog
185 lines
5.1 KiB
Systemverilog
`default_nettype none
|
|
// `timescale 1ns/1ps
|
|
|
|
`define CP 10
|
|
`define HCP 5
|
|
|
|
task test_good_read_msg (
|
|
input string message,
|
|
input [15:0] addr
|
|
);
|
|
|
|
bridge_rx_tb.tb_brx_valid = 1;
|
|
for(int i=0; i < $size(message); i++) begin
|
|
bridge_rx_tb.tb_brx_data = message [i];
|
|
if(bridge_rx_tb.brx_tb_valid) begin
|
|
assert(bridge_rx_tb.brx_tb_addr == addr) else $fatal(0, "wrong addr!");
|
|
assert(bridge_rx_tb.brx_tb_rw == 0) else $fatal(0, "wrong rw!");
|
|
assert(bridge_rx_tb.brx_tb_data == 0) else $fatal(0, "wrong data!");
|
|
end
|
|
#`CP;
|
|
end
|
|
bridge_rx_tb.tb_brx_valid = 0;
|
|
endtask
|
|
|
|
task test_good_write_msg (
|
|
input string message,
|
|
input [15:0] addr,
|
|
input [15:0] data
|
|
);
|
|
|
|
bridge_rx_tb.tb_brx_valid = 1;
|
|
for(int i=0; i < $size(message); i++) begin
|
|
bridge_rx_tb.tb_brx_data = message[i];
|
|
if(bridge_rx_tb.brx_tb_valid) begin
|
|
assert(bridge_rx_tb.brx_tb_addr == addr) else $fatal(0, "wrong addr!");
|
|
assert(bridge_rx_tb.brx_tb_rw == 1) else $fatal(0, "wrong rw!");
|
|
assert(bridge_rx_tb.brx_tb_data == data) else $fatal(0, "wrong data!");
|
|
end
|
|
#`CP;
|
|
end
|
|
bridge_rx_tb.tb_brx_valid = 0;
|
|
endtask
|
|
|
|
task test_bad_msg (
|
|
input string message
|
|
);
|
|
|
|
bridge_rx_tb.tb_brx_valid = 1;
|
|
for(int i=0; i < $size(message); i++) begin
|
|
bridge_rx_tb.tb_brx_data = message[i];
|
|
assert(bridge_rx_tb.brx_tb_valid == 0) else $fatal(0, "wrong valid!");
|
|
#`CP;
|
|
end
|
|
bridge_rx_tb.tb_brx_valid = 0;
|
|
endtask
|
|
|
|
|
|
module bridge_rx_tb;
|
|
// https://www.youtube.com/watch?v=WCOAr-96bGc
|
|
|
|
//boilerplate
|
|
logic clk;
|
|
integer test_num;
|
|
|
|
// uart inputs and outputs
|
|
logic [7:0] tb_brx_data;
|
|
logic tb_brx_valid;
|
|
|
|
logic [15:0] brx_tb_addr;
|
|
logic [15:0] brx_tb_data;
|
|
logic brx_tb_rw;
|
|
logic brx_tb_valid;
|
|
|
|
bridge_rx bridge_rx_uut(
|
|
.clk(clk),
|
|
|
|
.data_i(tb_brx_data),
|
|
.valid_i(tb_brx_valid),
|
|
|
|
.addr_o(brx_tb_addr),
|
|
.data_o(brx_tb_data),
|
|
.rw_o(brx_tb_rw),
|
|
.valid_o(brx_tb_valid));
|
|
|
|
always begin
|
|
#`HCP
|
|
clk = !clk;
|
|
end
|
|
|
|
initial begin
|
|
$dumpfile("bridge_rx.vcd");
|
|
$dumpvars(0, bridge_rx_tb);
|
|
|
|
// setup and reset
|
|
clk = 0;
|
|
tb_brx_data = 0;
|
|
tb_brx_valid = 0;
|
|
test_num = 0;
|
|
#`CP
|
|
#`HCP
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit W12345678(CR)(LF) for baseline functionality ===", test_num);
|
|
test_good_write_msg("W12345678\r\n", 16'h1234, 16'h5678);
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit WDEADBEEF(CR)(LF) for proper state reset ===", test_num);
|
|
test_good_write_msg("WDEADBEEF\r\n", 16'hDEAD, 16'hBEEF);
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit RBABE(CR)(LF) for baseline functionality ===", test_num);
|
|
test_good_read_msg("RBABE\r\n", 16'hBABE);
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit R0000(CR) for EOL insensitivity ===", test_num);
|
|
test_good_read_msg("R0000\r", 16'hBABE);
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit R1234(LF) for EOL insensitivity ===", test_num);
|
|
test_good_read_msg("R1234\n", 16'h1234);
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit WF00DBEEF(CR) for EOL insensitivity ===", test_num);
|
|
test_good_write_msg("WF00DBEEF\r", 16'hF00D, 16'hBEEF);
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit WB0BACAFE(LF) for EOL insensitivity ===", test_num);
|
|
test_good_write_msg("WB0BACAFE\r", 16'hB0BA, 16'hCAFE);
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit R1234(LF)R5678 for back-to-back messages ===", test_num);
|
|
test_good_read_msg("R1234\r\n", 16'h1234);
|
|
test_good_read_msg("R5678\r\n", 16'h5678);
|
|
#(10*`CP);
|
|
|
|
$display("\n\nIntentionally bad messages:");
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit RABC(CR)(LF) for message length ===", test_num);
|
|
test_bad_msg("RABC\r\n");
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit R12345(CR)(LF) for message length ===", test_num);
|
|
test_bad_msg("R12345\r\n");
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit M(CR)(LF) for message length ===", test_num);
|
|
test_bad_msg("WABC\r\n");
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit W123456789101112131415161718191201222(CR)(LF) for message length ===", test_num);
|
|
test_bad_msg("W123456789101112131415161718191201222\r\n");
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit RABCG(CR)(LF) for invalid characters ===", test_num);
|
|
test_bad_msg("RABCG\r\n");
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit WABC[]()##*@(CR)(LF) for invalid characters and message length ===", test_num);
|
|
test_bad_msg("WABC[]()##*@\r\n");
|
|
#(10*`CP);
|
|
|
|
test_num = test_num + 1;
|
|
$display("\n=== test %2d: transmit R(CR)(LF) for message length ===", test_num);
|
|
test_bad_msg("R\r\n");
|
|
#(10*`CP);
|
|
|
|
$finish();
|
|
end
|
|
|
|
|
|
endmodule
|
|
`default_nettype wire |