manta/test/functional_sim/ethernet_tx_tb.sv

121 lines
2.4 KiB
Systemverilog

`default_nettype none
//`timescale 1ns/1ps
`define FPGA_MAC 48'h69_69_5A_06_54_91
`define HOST_MAC 48'h00_E0_4C_68_1E_0C
`define ETHERTYPE 16'h88_B5
task send_on_etx_receive_on_mrx (
input [15:0] data
);
ethernet_tx_tb.etx_data = data;
ethernet_tx_tb.etx_rw = 0;
ethernet_tx_tb.etx_valid = 0;
#10;
ethernet_tx_tb.etx_valid = 1;
#10;
ethernet_tx_tb.etx_valid = 0;
while(!ethernet_tx_tb.mrx_valid) #10;
$display(ethernet_tx_tb.mrx_payload);
endtask
module ethernet_tx_tb();
// https://www.youtube.com/watch?v=K35qOTQLNpA
logic clk;
always begin
#5;
clk = !clk;
end
logic txen;
logic [1:0] txd;
// ethernet tx
reg [15:0] etx_data;
reg etx_rw;
reg etx_valid;
ethernet_tx #(
.FPGA_MAC(`FPGA_MAC),
.HOST_MAC(`HOST_MAC),
.ETHERTYPE(`ETHERTYPE)
) etx (
.clk(clk),
.data_i(etx_data),
.rw_i(etx_rw),
.valid_i(etx_valid),
.txen(txen),
.txd(txd));
// mac_rx, for decoding
logic crsdv;
logic [1:0] rxd;
reg [55:0] mrx_payload;
reg mrx_valid;
mac_rx #(
// this is the host mac since we're using mac_rx to impersonate
// the host computer, to which packets are currently addressed.
.FPGA_MAC(`HOST_MAC),
.ETHERTYPE(`ETHERTYPE)
) mrx (
.clk(clk),
.crsdv(crsdv),
.rxd(rxd),
.payload(mrx_payload),
.valid(mrx_valid));
logic [15:0] where_ethertype_should_be;
logic [7:0] where_rw_should_be;
logic [15:0] where_addr_should_be;
logic [15:0] where_data_should_be;
assign {where_ethertype_should_be, where_rw_should_be, where_addr_should_be, where_data_should_be} = mrx_payload;
assign rxd = txd;
assign crsdv = txen;
initial begin
$dumpfile("ethernet_tx_tb.vcd");
$dumpvars(0, ethernet_tx_tb);
clk = 0;
etx_data = 16'h6970;
etx_rw = 0;
etx_valid = 0;
#50;
send_on_etx_receive_on_mrx(16'h6970);
#10000;
// for (int i=0; i<32; i=i+1) begin
// mtx_payload = i;
// mtx_start = 0;
// #10;
// mtx_start = 1;
// #10;
// mtx_start = 0;
// while(!mrx_valid) #10;
// #1000;
// assert(mrx_payload == i) else $fatal(0, "data mismatch!");
// end
$finish();
end
endmodule
`default_nettype wire