manta/test/functional_sim/bridge_rx_tb.sv

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