285 lines
9.6 KiB
Systemverilog
285 lines
9.6 KiB
Systemverilog
`default_nettype none
|
|
`timescale 1ns/1ps
|
|
|
|
`define CP 10
|
|
`define HCP 5
|
|
|
|
`define SEND_MESSAGE(MESSAGE) \
|
|
rx_valid = 1; \
|
|
for(int i=0; i < $size(MESSAGE); i++) begin \
|
|
rx_data = MESSAGE[i]; \
|
|
#`CP; \
|
|
end \
|
|
rx_valid = 0; \
|
|
|
|
module bridge_rx_tb;
|
|
// https://www.youtube.com/watch?v=WCOAr-96bGc
|
|
|
|
//boilerplate
|
|
logic clk;
|
|
logic rst;
|
|
string message;
|
|
integer test_num;
|
|
|
|
// uart inputs and outputs
|
|
logic rx;
|
|
logic [7:0] rx_data;
|
|
logic rx_valid;
|
|
|
|
// the parameter will all get filled out in manta's big instantiator thing hehehee
|
|
parameter ADDR_WIDTH = 16; // $clog2( how much memory we need rounded up to the nearest 8 )
|
|
parameter DATA_WIDTH = 16;
|
|
|
|
// request bus, gets connected to uart_rx (through a FSM)
|
|
logic [ADDR_WIDTH-1:0] addr;
|
|
logic [DATA_WIDTH-1:0] wdata;
|
|
logic rw;
|
|
logic valid;
|
|
logic req_ready;
|
|
|
|
bridge_rx bridge_rx_uut(
|
|
.clk(clk),
|
|
|
|
// connect to uart_rx
|
|
.rx_data(rx_data),
|
|
.rx_valid(rx_valid),
|
|
|
|
.addr_o(addr),
|
|
.wdata_o(wdata),
|
|
.rw_o(rw),
|
|
.valid_o(valid));
|
|
|
|
always begin
|
|
#`HCP
|
|
clk = !clk;
|
|
end
|
|
|
|
initial begin
|
|
$dumpfile("bridge_rx.vcd");
|
|
$dumpvars(0, bridge_rx_tb);
|
|
|
|
// setup and reset
|
|
clk = 0;
|
|
rst = 0;
|
|
rx_data = 0;
|
|
rx_valid = 0;
|
|
req_ready = 1;
|
|
test_num = 0;
|
|
#`CP
|
|
rst = 1;
|
|
#`CP
|
|
rst = 0;
|
|
|
|
/* ==== Test 1 Begin ==== */
|
|
$display("\n=== test 1: transmit M12345678(CR)(LF) for baseline functionality ===");
|
|
test_num = 1;
|
|
message = {"M12345678", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(addr == 16'h1234) else $error("incorrect addr!");
|
|
assert(wdata == 16'h5678) else $error("incorrect data!");
|
|
assert(rw == 1) else $error("incorrect rw!");
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 1 End ==== */
|
|
|
|
|
|
/* ==== Test 2 Begin ==== */
|
|
$display("\n=== test 2: transmit MDEADBEEF(CR)(LF) for proper state reset ===");
|
|
test_num = 2;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MDEADBEEF", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(addr == 16'hDEAD) else $error("incorrect addr!");
|
|
assert(wdata == 16'hBEEF) else $error("incorrect data!");
|
|
assert(rw == 1) else $error("incorrect rw!");
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 2 End ==== */
|
|
|
|
|
|
/* ==== Test 3 Begin ==== */
|
|
$display("\n=== test 3: transmit MBABE(CR)(LF) for baseline functionality ===");
|
|
test_num = 3;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MBABE", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(addr == 16'hBABE) else $error("incorrect addr!");
|
|
assert(rw == 0) else $error("incorrect rw!");
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 3 End ==== */
|
|
|
|
/* ==== Test 4 Begin ==== */
|
|
$display("\n=== test 4: transmit M0000(CR) for EOL insensitivity ===");
|
|
test_num = 4;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"M0000", 8'h0D};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(addr == 16'h0000) else $error("incorrect addr!");
|
|
assert(rw == 0) else $error("incorrect rw!");
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 4 End ==== */
|
|
|
|
/* ==== Test 5 Begin ==== */
|
|
$display("\n=== test 5: transmit M1234(LF) for EOL insensitivity ===");
|
|
test_num = 5;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"M1234", 8'h0D};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(addr == 16'h1234) else $error("incorrect addr!");
|
|
assert(rw == 0) else $error("incorrect rw!");
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 5 End ==== */
|
|
|
|
/* ==== Test 6 Begin ==== */
|
|
$display("\n=== test 6: transmit MF00DBEEF(CR) for EOL insensitivity ===");
|
|
test_num = 6;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MF00DBEEF", 8'h0D};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(addr == 16'hF00D) else $error("incorrect addr!");
|
|
assert(wdata == 16'hBEEF) else $error("incorrect data!");
|
|
assert(rw == 1) else $error("incorrect rw!");
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 6 End ==== */
|
|
|
|
/* ==== Test 7 Begin ==== */
|
|
$display("\n=== test 7: transmit MB0BACAFE(LF) for EOL insensitivity ===");
|
|
test_num = 7;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MB0BACAFE", 8'h0D};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(addr == 16'hB0BA) else $error("incorrect addr!");
|
|
assert(wdata == 16'hCAFE) else $error("incorrect data!");
|
|
assert(rw == 1) else $error("incorrect rw!");
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 7 End ==== */
|
|
|
|
/* ==== Test 8 Begin ==== */
|
|
$display("\n\nIntentionally bad messages:");
|
|
$display("\n=== test 8: transmit MABC(CR)(LF) for message length ===");
|
|
test_num = 8;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MABC", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(valid == 0) else $error("valid asserted for bad message");
|
|
assert(bridge_rx_uut.state == bridge_rx_uut.ERROR) else $error("not in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 8 End ==== */
|
|
|
|
/* ==== Test 9 Begin ==== */
|
|
$display("\n=== test 9: transmit M12345(CR)(LF) for message length ===");
|
|
test_num = 9;
|
|
bridge_rx_uut.state = bridge_rx_uut.ACQUIRE;
|
|
bridge_rx_uut.bytes_received = 0;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MABC", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(valid == 0) else $error("valid asserted for bad message");
|
|
assert(bridge_rx_uut.state == bridge_rx_uut.ERROR) else $error("not in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 9 End ==== */
|
|
|
|
/* ==== Test 10 Begin ==== */
|
|
$display("\n=== test 10: transmit M(CR)(LF) for message length ===");
|
|
test_num = 10;
|
|
bridge_rx_uut.state = bridge_rx_uut.ACQUIRE;
|
|
bridge_rx_uut.bytes_received = 0;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MABC", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(valid == 0) else $error("valid asserted for bad message");
|
|
assert(bridge_rx_uut.state == bridge_rx_uut.ERROR) else $error("not in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 10 End ==== */
|
|
|
|
/* ==== Test 11 Begin ==== */
|
|
$display("\n=== test 11: transmit M123456789101112131415161718191201222(CR)(LF) for message length ===");
|
|
test_num = 11;
|
|
bridge_rx_uut.state = bridge_rx_uut.ACQUIRE;
|
|
bridge_rx_uut.bytes_received = 0;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MABC", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(valid == 0) else $error("valid asserted for bad message");
|
|
assert(bridge_rx_uut.state == bridge_rx_uut.ERROR) else $error("not in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 11 End ==== */
|
|
|
|
/* ==== Test 12 Begin ==== */
|
|
$display("\n=== test 12: transmit MABCG(CR)(LF) for invalid characters ===");
|
|
test_num = 12;
|
|
bridge_rx_uut.state = bridge_rx_uut.ACQUIRE;
|
|
bridge_rx_uut.bytes_received = 0;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MABCG", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(valid == 0) else $error("valid asserted for bad message");
|
|
assert(bridge_rx_uut.state == bridge_rx_uut.ERROR) else $error("not in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 12 End ==== */
|
|
|
|
/* ==== Test 13 Begin ==== */
|
|
$display("\n=== test 13: transmit MABC[]()##*@(CR)(LF) for invalid characters and message length ===");
|
|
test_num = 13;
|
|
bridge_rx_uut.state = bridge_rx_uut.ACQUIRE;
|
|
bridge_rx_uut.bytes_received = 0;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"MABC[]()##*@", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(valid == 0) else $error("valid asserted for bad message");
|
|
assert(bridge_rx_uut.state == bridge_rx_uut.ERROR) else $error("not in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 13 End ==== */
|
|
|
|
/* ==== Test 14 Begin ==== */
|
|
$display("\n=== test 14: transmit M(CR)(LF) for message length ===");
|
|
test_num = 14;
|
|
bridge_rx_uut.state = bridge_rx_uut.ACQUIRE;
|
|
bridge_rx_uut.bytes_received = 0;
|
|
assert(bridge_rx_uut.state != bridge_rx_uut.ERROR) else $error("in error state before transmission");
|
|
message = {"M", 8'h0D, 8'h0A};
|
|
`SEND_MESSAGE(message)
|
|
|
|
assert(valid == 0) else $error("valid asserted for bad message");
|
|
assert(bridge_rx_uut.state == bridge_rx_uut.ERROR) else $error("not in error state after transmission");
|
|
|
|
#(10*`CP);
|
|
/* ==== Test 14 End ==== */
|
|
|
|
$finish();
|
|
end
|
|
|
|
|
|
endmodule
|
|
`default_nettype wire |